Description
Simple test Python program will seg fault when using CBS 7.0 and using actual scopes/collections (i.e. not default_collection()). Looking into the bindings (see gdb output below), it looks to happen because the lcb_respstore_error_context() method is not populating the scope and collection information correctly. I did find that if I build the Python client w/ LCB commit f8ccaa1c660c4967d47bda94398b2eeefc4e0607, I do not have this problem. Using CBS 7.0.0-5219 build.
Please let me know if I am missing a change in the LCB API, or if further info should be provided.
Python sample code.
from couchbase.cluster import Cluster, ClusterOptions |
from couchbase.auth import PasswordAuthenticator |
import faulthandler |
|
cluster = Cluster('couchbase://localhost', |
ClusterOptions(PasswordAuthenticator('Administrator', 'password'))) |
bucket = cluster.bucket('default') |
scope = bucket.scope('test-scope') |
coll = scope.collection('test-collection') |
|
print(cluster.lcb_version()) |
faulthandler.enable()
|
coll.insert('test', {'info': 'this is a test'}) |
|
gdb output when building w/ v3.1.3 (could also use LCB_TAG=0a2a74f5f900fd603bad7f96eeae2598dd8902a5 )
Breakpoint 2, dur_chain2 (conn=0x7fd8f6758908, mres=0x7fd8f770c570, res=0x7fd8f6702588, cbtype=2, resp=0x7ffe36f69c70)
|
at src/callbacks.c:749
|
749 if ((mres->mropts & PYCBC_MRES_F_DURABILITY) == 0 || res->rc != LCB_SUCCESS) {
|
(gdb) list
|
744 }
|
745
|
746 /** For remove, we check quiet */
|
747 MAYBE_PUSH_OPERR(mres, (pycbc_Result *)res, res->rc, is_delete ? 1 : 0);
|
748
|
749 if ((mres->mropts & PYCBC_MRES_F_DURABILITY) == 0 || res->rc != LCB_SUCCESS) {
|
750 operation_completed_with_err_info(
|
751 conn, mres, cbtype, resp, (pycbc_Result *)res);
|
752 CB_THR_BEGIN(conn);
|
753 return;
|
(gdb) p res->rc
|
$1 = LCB_ERR_DOCUMENT_EXISTS
|
(gdb) continue
|
Continuing.
|
|
Breakpoint 1, get_operation_err_info (respbase=0x7ffe36f69c70, cbtype=LCB_CALLBACK_STORE) at src/callbacks.c:245
|
245 break;
|
(gdb) list
|
240 case LCB_CALLBACK_GET:
|
241 rc = lcb_respget_error_context((const lcb_RESPGET*)respbase, &ctx);
|
242 break;
|
243 case LCB_CALLBACK_STORE:
|
244 rc = lcb_respstore_error_context((const lcb_RESPSTORE*)respbase, &ctx);
|
245 break;
|
246 case LCB_CALLBACK_UNLOCK:
|
247 rc = lcb_respunlock_error_context((const lcb_RESPUNLOCK*)respbase, &ctx);
|
248 break;
|
249 case LCB_CALLBACK_TOUCH:
|
(gdb) p ctx
|
$2 = (const lcb_KEY_VALUE_ERROR_CONTEXT *) 0x7ffe36f69c70
|
(gdb) p ctx->key
|
$3 = 0x28d7923 "test{\"info\":\"this is a test\"}5235d04e88313378c82\",\"uri\":\"/pools/default/buckets/default?bucket_uuid=3b2ea9afe04d45235d04e88313378c82\",\"streamingUri\":\"/pools/default/bucketsStreaming/default?bucket_uui"...
|
(gdb) p ctx->bucket
|
$4 = 0x2712a80 "default"
|
(gdb) p ctx->scope
|
$5 = 0x28f87d0 "\300\030r\002"
|
(gdb) p ctx->collection
|
$6 = 0x28f87db "\002"
|
(gdb)
|
gdb output when building w/ LCB_TAG=f8ccaa1c660c4967d47bda94398b2eeefc4e0607
Breakpoint 2, dur_chain2 (conn=0x7f7362ceb908, mres=0x7f7363c9e570, res=0x7f7362c94588, cbtype=2, resp=
|
0x7ffef87c4ef0) at src/callbacks.c:749
|
749 if ((mres->mropts & PYCBC_MRES_F_DURABILITY) == 0 || res->rc != LCB_SUCCESS) {
|
(gdb) list
|
744 }
|
745
|
746 /** For remove, we check quiet */
|
747 MAYBE_PUSH_OPERR(mres, (pycbc_Result *)res, res->rc, is_delete ? 1 : 0);
|
748
|
749 if ((mres->mropts & PYCBC_MRES_F_DURABILITY) == 0 || res->rc != LCB_SUCCESS) {
|
750 operation_completed_with_err_info(
|
751 conn, mres, cbtype, resp, (pycbc_Result *)res);
|
752 CB_THR_BEGIN(conn);
|
753 return;
|
(gdb) p res->rc
|
$1 = LCB_ERR_DOCUMENT_EXISTS
|
(gdb) continue
|
Continuing.
|
|
Breakpoint 1, get_operation_err_info (respbase=0x7ffef87c4ef0, cbtype=LCB_CALLBACK_STORE) at src/callbacks.c:245
|
245 break;
|
(gdb) list
|
240 case LCB_CALLBACK_GET:
|
241 rc = lcb_respget_error_context((const lcb_RESPGET*)respbase, &ctx);
|
242 break;
|
243 case LCB_CALLBACK_STORE:
|
244 rc = lcb_respstore_error_context((const lcb_RESPSTORE*)respbase, &ctx);
|
245 break;
|
246 case LCB_CALLBACK_UNLOCK:
|
247 rc = lcb_respunlock_error_context((const lcb_RESPUNLOCK*)respbase, &ctx);
|
248 break;
|
249 case LCB_CALLBACK_TOUCH:
|
(gdb) p ctx
|
$2 = (const lcb_KEY_VALUE_ERROR_CONTEXT *) 0x7ffef87c4ef0
|
(gdb) p ctx->key
|
$3 = 0x26bc923 "test{\"info\":\"this is a test\"}5235d04e88313378c82\",\"uri\":\"/pools/default/buckets/default?bucket_uuid=3b2ea9afe04d45235d04e88313378c82\",\"streamingUri\":\"/pools/default/bucketsStreaming/default?bucket_uui"...
|
(gdb) p ctx->bucket
|
$4 = 0x2676a90 "default"
|
(gdb) p ctx->scope
|
$5 = 0x26dfee0 "test-scope.test-collection"
|
(gdb) p ctx->collection
|
$6 = 0x26dfeeb "test-collection"
|
(gdb)
|
Attachments
Issue Links
- relates to
-
PYCBC-1125 python SDK crashes on MAC while inserting a document.
- Resolved
-
PYCBC-1131 Python SDK 3.1.2 randomly segfaulting
- Resolved