couchbase 3.2.0 → 3.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -18
- package/binding.gyp +88 -85
- package/deps/lcb/CMakeLists.txt +1 -1
- package/deps/lcb/CONTRIBUTING.md +1 -1
- package/deps/lcb/README.markdown +2 -2
- package/deps/lcb/RELEASE_NOTES.markdown +99 -14
- package/deps/lcb/cmake/Modules/GetVersionInfo.cmake +1 -1
- package/deps/lcb/contrib/cbsasl/src/scram-sha/scram_utils.cc +22 -26
- package/deps/lcb/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +20 -7
- package/deps/lcb/doc/Doxyfile +1 -1
- package/deps/lcb/example/CMakeLists.txt +4 -4
- package/deps/lcb/example/libuvdirect/main.c +39 -12
- package/deps/lcb/example/minimal/durability.cc +149 -0
- package/deps/lcb/example/minimal/query.c +11 -9
- package/deps/lcb/gyp_config/common/libcouchbase/configuration.h +3 -3
- package/deps/lcb/gyp_config/linux/arm64/config.h +243 -0
- package/deps/lcb/include/libcouchbase/couchbase.h +80 -5
- package/deps/lcb/include/libcouchbase/error.h +2 -0
- package/deps/lcb/include/libcouchbase/ixmgmt.h +15 -10
- package/deps/lcb/include/libcouchbase/tracing.h +2 -2
- package/deps/lcb/include/memcached/protocol_binary.h +21 -0
- package/deps/lcb/libcouchbase.gyp +347 -349
- package/deps/lcb/packaging/deb/control +1 -1
- package/deps/lcb/src/analytics/analytics_handle.cc +13 -5
- package/deps/lcb/src/analytics/analytics_handle.hh +29 -0
- package/deps/lcb/src/bootstrap.cc +6 -3
- package/deps/lcb/src/capi/cmd_analytics.cc +12 -1
- package/deps/lcb/src/capi/cmd_analytics.hh +30 -0
- package/deps/lcb/src/capi/cmd_counter.hh +23 -0
- package/deps/lcb/src/capi/cmd_exists.hh +24 -1
- package/deps/lcb/src/capi/cmd_get.hh +22 -0
- package/deps/lcb/src/capi/cmd_get_replica.hh +23 -0
- package/deps/lcb/src/capi/cmd_http.hh +7 -0
- package/deps/lcb/src/capi/cmd_query.cc +11 -1
- package/deps/lcb/src/capi/cmd_query.hh +31 -0
- package/deps/lcb/src/capi/cmd_remove.hh +23 -0
- package/deps/lcb/src/capi/cmd_search.cc +6 -0
- package/deps/lcb/src/capi/cmd_search.hh +23 -0
- package/deps/lcb/src/capi/cmd_store.hh +33 -21
- package/deps/lcb/src/capi/cmd_subdoc.hh +35 -0
- package/deps/lcb/src/capi/cmd_touch.hh +23 -0
- package/deps/lcb/src/capi/cmd_unlock.hh +23 -0
- package/deps/lcb/src/capi/cmd_view.hh +6 -0
- package/deps/lcb/src/capi/collection_qualifier.hh +2 -2
- package/deps/lcb/src/cntl.cc +45 -11
- package/deps/lcb/src/crypto.cc +2 -2
- package/deps/lcb/src/dns-srv.cc +5 -3
- package/deps/lcb/src/errmap.cc +5 -9
- package/deps/lcb/src/errmap.h +7 -3
- package/deps/lcb/src/handler.cc +24 -18
- package/deps/lcb/src/hostlist.h +2 -2
- package/deps/lcb/src/http/http-priv.h +2 -2
- package/deps/lcb/src/http/http.cc +5 -2
- package/deps/lcb/src/instance.cc +20 -11
- package/deps/lcb/src/internal.h +9 -0
- package/deps/lcb/src/lcbio/connect.cc +14 -2
- package/deps/lcb/src/lcbio/connect.h +2 -2
- package/deps/lcb/src/lcbio/ctx.cc +4 -2
- package/deps/lcb/src/lcbio/ioutils.cc +9 -10
- package/deps/lcb/src/lcbio/manager.cc +1 -1
- package/deps/lcb/src/mcserver/mcserver.cc +9 -6
- package/deps/lcb/src/mcserver/negotiate.cc +39 -17
- package/deps/lcb/src/n1ql/ixmgmt.cc +1 -2
- package/deps/lcb/src/n1ql/query_handle.cc +41 -19
- package/deps/lcb/src/n1ql/query_handle.hh +28 -1
- package/deps/lcb/src/operations/counter.cc +18 -5
- package/deps/lcb/src/operations/exists.cc +25 -4
- package/deps/lcb/src/operations/get.cc +39 -19
- package/deps/lcb/src/operations/get_replica.cc +28 -8
- package/deps/lcb/src/operations/observe.cc +1 -1
- package/deps/lcb/src/operations/ping.cc +8 -8
- package/deps/lcb/src/operations/pktfwd.cc +2 -1
- package/deps/lcb/src/operations/remove.cc +39 -22
- package/deps/lcb/src/operations/store.cc +18 -5
- package/deps/lcb/src/operations/subdoc.cc +18 -6
- package/deps/lcb/src/operations/touch.cc +34 -16
- package/deps/lcb/src/operations/unlock.cc +24 -5
- package/deps/lcb/src/packetutils.h +3 -2
- package/deps/lcb/src/retryq.cc +24 -5
- package/deps/lcb/src/search/search.cc +1 -0
- package/deps/lcb/src/search/search_handle.cc +30 -8
- package/deps/lcb/src/search/search_handle.hh +29 -0
- package/deps/lcb/src/settings.cc +1 -1
- package/deps/lcb/src/ssl/ssl_common.c +6 -7
- package/deps/lcb/src/tracing/span.cc +47 -14
- package/deps/lcb/src/tracing/tracer.cc +11 -2
- package/deps/lcb/src/tracing/tracing-internal.h +105 -93
- package/deps/lcb/src/utilities.cc +43 -0
- package/deps/lcb/src/utilities.h +53 -0
- package/deps/lcb/src/vbucket/vbucket.c +34 -33
- package/deps/lcb/src/views/view_handle.cc +13 -5
- package/deps/lcb/src/views/view_handle.hh +29 -0
- package/deps/lcb/tests/CMakeLists.txt +21 -0
- package/deps/lcb/tests/basic/t_ctlcodes.cc +24 -3
- package/deps/lcb/tests/basic/t_jsparse.cc +8 -0
- package/deps/lcb/tests/basic/t_n1qlstrings.cc +73 -0
- package/deps/lcb/tests/iotests/mock-environment.cc +30 -1
- package/deps/lcb/tests/iotests/mock-environment.h +49 -0
- package/deps/lcb/tests/iotests/mock-unit-test.cc +104 -6
- package/deps/lcb/tests/iotests/mock-unit-test.h +34 -0
- package/deps/lcb/tests/iotests/t_collections.cc +1 -1
- package/deps/lcb/tests/iotests/t_confmon.cc +4 -2
- package/deps/lcb/tests/iotests/t_get.cc +109 -7
- package/deps/lcb/tests/iotests/t_http.cc +9 -4
- package/deps/lcb/tests/iotests/t_lock.cc +18 -0
- package/deps/lcb/tests/iotests/t_mutate.cc +157 -63
- package/deps/lcb/tests/iotests/t_n1ql.cc +330 -33
- package/deps/lcb/tests/iotests/t_views.cc +1 -0
- package/deps/lcb/tests/iotests/testutil.cc +168 -0
- package/deps/lcb/tests/iotests/testutil.h +116 -0
- package/deps/lcb/tests/mocksupport/procutil.c +32 -28
- package/deps/lcb/tests/mocksupport/server.c +0 -1
- package/deps/lcb/tests/mocksupport/timeout.c +2 -2
- package/deps/lcb/tools/cbc.cc +7 -0
- package/dist/analyticsindexmanager.js +512 -524
- package/dist/binding.d.ts +3 -0
- package/dist/bindingutilities.js +4 -0
- package/dist/bucket.js +1 -1
- package/dist/bucketmanager.d.ts +31 -1
- package/dist/bucketmanager.js +194 -186
- package/dist/cluster.d.ts +7 -0
- package/dist/cluster.js +48 -38
- package/dist/collection.js +11 -17
- package/dist/collectionmanager.js +181 -197
- package/dist/connection.d.ts +3 -1
- package/dist/connection.js +27 -16
- package/dist/couchbase.d.ts +1 -0
- package/dist/couchbase.js +3 -13
- package/dist/datastructures.js +239 -310
- package/dist/diagnosticsexecutor.js +70 -85
- package/dist/errors.d.ts +70 -0
- package/dist/errors.js +96 -2
- package/dist/eventingfunctionmanager.d.ts +804 -0
- package/dist/eventingfunctionmanager.js +993 -0
- package/dist/httpexecutor.d.ts +2 -1
- package/dist/httpexecutor.js +30 -37
- package/dist/queryindexmanager.js +240 -266
- package/dist/scope.js +10 -4
- package/dist/sdspecs.d.ts +1 -1
- package/dist/searchexecutor.js +3 -0
- package/dist/searchindexmanager.js +240 -271
- package/dist/searchquery.d.ts +17 -0
- package/dist/searchquery.js +22 -1
- package/dist/searchtypes.d.ts +7 -2
- package/dist/searchtypes.js +2 -2
- package/dist/usermanager.js +251 -264
- package/dist/utilities.d.ts +2 -0
- package/dist/utilities.js +7 -2
- package/dist/viewexecutor.js +1 -1
- package/dist/viewindexmanager.js +131 -150
- package/package.json +1 -1
- package/src/addondata.cpp +58 -0
- package/src/addondata.h +40 -0
- package/src/binding.cpp +3 -1
- package/src/cas.h +2 -2
- package/src/connection.cpp +25 -178
- package/src/connection.h +8 -65
- package/src/connection_ops.cpp +57 -34
- package/src/constants.cpp +3 -0
- package/src/instance.cpp +235 -0
- package/src/instance.h +102 -0
- package/src/{connection_callbacks.cpp → instance_callbacks.cpp} +34 -34
- package/src/logger.cpp +11 -1
- package/src/logger.h +3 -0
- package/src/metrics.cpp +10 -0
- package/src/metrics.h +3 -0
- package/src/mutationtoken.h +2 -2
- package/src/opbuilder.h +13 -15
- package/src/respreader.cpp +1 -0
- package/src/respreader.h +6 -4
- package/src/tracespan.h +11 -11
- package/src/tracing.cpp +11 -0
- package/src/tracing.h +3 -0
- package/src/valueparser.h +5 -0
- package/deps/lcb/example/observe/durability.c +0 -110
|
@@ -19,7 +19,6 @@
|
|
|
19
19
|
|
|
20
20
|
#include "internal.h"
|
|
21
21
|
#include "collections.h"
|
|
22
|
-
#include "trace.h"
|
|
23
22
|
#include "defer.h"
|
|
24
23
|
|
|
25
24
|
#include "capi/cmd_get.hh"
|
|
@@ -140,6 +139,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdgetreplica_key(lcb_CMDGETREPLICA *cmd, const
|
|
|
140
139
|
return cmd->key(std::string(key, key_len));
|
|
141
140
|
}
|
|
142
141
|
|
|
142
|
+
LIBCOUCHBASE_API lcb_STATUS lcb_cmdgetreplica_on_behalf_of(lcb_CMDGETREPLICA *cmd, const char *data, size_t data_len)
|
|
143
|
+
{
|
|
144
|
+
return cmd->on_behalf_of(std::string(data, data_len));
|
|
145
|
+
}
|
|
146
|
+
|
|
143
147
|
struct RGetCookie : mc_REQDATAEX {
|
|
144
148
|
RGetCookie(void *cookie, lcb_INSTANCE *instance, get_replica_mode, int vb);
|
|
145
149
|
void decref()
|
|
@@ -248,7 +252,7 @@ static lcb_STATUS get_replica_validate(lcb_INSTANCE *instance, const lcb_CMDGETR
|
|
|
248
252
|
|
|
249
253
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
|
250
254
|
int vbid, ixtmp;
|
|
251
|
-
unsigned r0, r1 = 0;
|
|
255
|
+
unsigned r0 = 0, r1 = 0;
|
|
252
256
|
|
|
253
257
|
lcb_KEYBUF keybuf{LCB_KV_COPY, {cmd->key().c_str(), cmd->key().size()}};
|
|
254
258
|
mcreq_map_key(cq, &keybuf, MCREQ_PKT_BASESIZE, &vbid, &ixtmp);
|
|
@@ -299,8 +303,8 @@ static lcb_STATUS get_replica_schedule(lcb_INSTANCE *instance, std::shared_ptr<l
|
|
|
299
303
|
*/
|
|
300
304
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
|
301
305
|
int vbid, ixtmp;
|
|
302
|
-
protocol_binary_request_header req;
|
|
303
|
-
unsigned r0, r1 = 0;
|
|
306
|
+
protocol_binary_request_header req{};
|
|
307
|
+
unsigned r0 = 0, r1 = 0;
|
|
304
308
|
|
|
305
309
|
lcb_KEYBUF keybuf{LCB_KV_COPY, {cmd->key().c_str(), cmd->key().size()}};
|
|
306
310
|
mcreq_map_key(cq, &keybuf, MCREQ_PKT_BASESIZE, &vbid, &ixtmp);
|
|
@@ -351,14 +355,24 @@ static lcb_STATUS get_replica_schedule(lcb_INSTANCE *instance, std::shared_ptr<l
|
|
|
351
355
|
rck->deadline =
|
|
352
356
|
rck->start + cmd->timeout_or_default_in_nanoseconds(LCB_US2NS(LCBT_SETTING(instance, operation_timeout)));
|
|
353
357
|
|
|
358
|
+
std::vector<std::uint8_t> framing_extras;
|
|
359
|
+
if (cmd->want_impersonation()) {
|
|
360
|
+
lcb_STATUS err = lcb::flexible_framing_extras::encode_impersonate_user(cmd->impostor(), framing_extras);
|
|
361
|
+
if (err != LCB_SUCCESS) {
|
|
362
|
+
return err;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
354
366
|
/* Initialize the packet */
|
|
355
|
-
req.request.magic = PROTOCOL_BINARY_REQ;
|
|
367
|
+
req.request.magic = framing_extras.empty() ? PROTOCOL_BINARY_REQ : PROTOCOL_BINARY_AREQ;
|
|
356
368
|
req.request.opcode = PROTOCOL_BINARY_CMD_GET_REPLICA;
|
|
357
369
|
req.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
|
358
370
|
req.request.vbucket = htons(static_cast<std::uint16_t>(vbid));
|
|
359
371
|
req.request.cas = 0;
|
|
360
372
|
req.request.extlen = 0;
|
|
361
373
|
|
|
374
|
+
auto ffextlen = static_cast<std::uint8_t>(framing_extras.size());
|
|
375
|
+
|
|
362
376
|
rck->r_cur = r0;
|
|
363
377
|
do {
|
|
364
378
|
int curix;
|
|
@@ -380,13 +394,16 @@ static lcb_STATUS get_replica_schedule(lcb_INSTANCE *instance, std::shared_ptr<l
|
|
|
380
394
|
pkt->u_rdata.exdata = rck;
|
|
381
395
|
pkt->flags |= MCREQ_F_REQEXT;
|
|
382
396
|
|
|
383
|
-
mcreq_reserve_key(pl, pkt, sizeof(req.bytes), &keybuf, cmd->collection().collection_id());
|
|
397
|
+
mcreq_reserve_key(pl, pkt, sizeof(req.bytes) + ffextlen, &keybuf, cmd->collection().collection_id());
|
|
384
398
|
size_t nkey = pkt->kh_span.size - MCREQ_PKT_BASESIZE + pkt->extlen;
|
|
385
399
|
req.request.keylen = htons((uint16_t)nkey);
|
|
386
400
|
req.request.bodylen = htonl((uint32_t)nkey);
|
|
387
401
|
req.request.opaque = pkt->opaque;
|
|
388
402
|
rck->remaining++;
|
|
389
403
|
mcreq_write_hdr(pkt, &req);
|
|
404
|
+
if (!framing_extras.empty()) {
|
|
405
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span) + sizeof(req.bytes), framing_extras.data(), framing_extras.size());
|
|
406
|
+
}
|
|
390
407
|
mcreq_sched_add(pl, pkt);
|
|
391
408
|
} while (++r0 < r1);
|
|
392
409
|
|
|
@@ -394,8 +411,8 @@ static lcb_STATUS get_replica_schedule(lcb_INSTANCE *instance, std::shared_ptr<l
|
|
|
394
411
|
req.request.opcode = PROTOCOL_BINARY_CMD_GET;
|
|
395
412
|
mc_PIPELINE *pl;
|
|
396
413
|
mc_PACKET *pkt;
|
|
397
|
-
lcb_STATUS err = mcreq_basic_packet(cq, &keybuf, cmd->collection().collection_id(), &req, 0,
|
|
398
|
-
MCREQ_BASICPACKET_F_FALLBACKOK);
|
|
414
|
+
lcb_STATUS err = mcreq_basic_packet(cq, &keybuf, cmd->collection().collection_id(), &req, 0, ffextlen, &pkt,
|
|
415
|
+
&pl, MCREQ_BASICPACKET_F_FALLBACKOK);
|
|
399
416
|
if (err != LCB_SUCCESS) {
|
|
400
417
|
delete rck;
|
|
401
418
|
return err;
|
|
@@ -405,6 +422,9 @@ static lcb_STATUS get_replica_schedule(lcb_INSTANCE *instance, std::shared_ptr<l
|
|
|
405
422
|
pkt->flags |= MCREQ_F_REQEXT;
|
|
406
423
|
rck->remaining++;
|
|
407
424
|
mcreq_write_hdr(pkt, &req);
|
|
425
|
+
if (!framing_extras.empty()) {
|
|
426
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span) + sizeof(req.bytes), framing_extras.data(), framing_extras.size());
|
|
427
|
+
}
|
|
408
428
|
mcreq_sched_add(pl, pkt);
|
|
409
429
|
}
|
|
410
430
|
|
|
@@ -129,7 +129,7 @@ static void handle_observe_callback(mc_PIPELINE *pl, mc_PACKET *pkt, lcb_CALLBAC
|
|
|
129
129
|
opc->remaining--;
|
|
130
130
|
if (opc->remaining == 0) {
|
|
131
131
|
TRACE_OBSERVE_END(instance, pkt);
|
|
132
|
-
|
|
132
|
+
lcb::trace::finish_kv_span(pl, pkt, nullptr);
|
|
133
133
|
delete opc;
|
|
134
134
|
}
|
|
135
135
|
}
|
|
@@ -426,7 +426,7 @@ static void handle_ping(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_CALLBACK_TYPE
|
|
|
426
426
|
} else {
|
|
427
427
|
hh.append(remote.host).append(":").append(remote.port);
|
|
428
428
|
}
|
|
429
|
-
svc.server =
|
|
429
|
+
svc.server = lcb_strdup(hh.c_str());
|
|
430
430
|
}
|
|
431
431
|
svc.type = LCB_PING_SERVICE_KV;
|
|
432
432
|
svc.latency = gethrtime() - MCREQ_PKT_RDATA(req)->start;
|
|
@@ -445,9 +445,9 @@ static void handle_ping(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_CALLBACK_TYPE
|
|
|
445
445
|
lcbio_CTX *ctx = server->connctx;
|
|
446
446
|
if (ctx) {
|
|
447
447
|
char id[20] = {0};
|
|
448
|
-
svc.local =
|
|
448
|
+
svc.local = lcb_strdup(ctx->sock->info->ep_local_host_and_port);
|
|
449
449
|
snprintf(id, sizeof(id), "%p", (void *)ctx->sock);
|
|
450
|
-
svc.id =
|
|
450
|
+
svc.id = lcb_strdup(id);
|
|
451
451
|
}
|
|
452
452
|
svc.scope = server->get_instance()->get_bucketname();
|
|
453
453
|
|
|
@@ -477,7 +477,7 @@ static void handle_http(lcb_INSTANCE *instance, lcb_PING_SERVICE type, const lcb
|
|
|
477
477
|
} else {
|
|
478
478
|
hh = std::string(htreq->host) + ":" + std::string(htreq->port);
|
|
479
479
|
}
|
|
480
|
-
svc.server =
|
|
480
|
+
svc.server = lcb_strdup(hh.c_str());
|
|
481
481
|
svc.latency = gethrtime() - htreq->start;
|
|
482
482
|
svc.rc = resp->ctx.rc;
|
|
483
483
|
switch (resp->ctx.rc) {
|
|
@@ -495,8 +495,8 @@ static void handle_http(lcb_INSTANCE *instance, lcb_PING_SERVICE type, const lcb
|
|
|
495
495
|
if (ctx) {
|
|
496
496
|
char id[20] = {0};
|
|
497
497
|
snprintf(id, sizeof(id), "%p", (void *)ctx->sock);
|
|
498
|
-
svc.id =
|
|
499
|
-
svc.local =
|
|
498
|
+
svc.id = lcb_strdup(id);
|
|
499
|
+
svc.local = lcb_strdup(ctx->sock->info->ep_local_host_and_port);
|
|
500
500
|
}
|
|
501
501
|
ck->responses.push_back(svc);
|
|
502
502
|
}
|
|
@@ -759,7 +759,7 @@ lcb_STATUS lcb_diag(lcb_INSTANCE *instance, void *cookie, const lcb_CMDDIAG *cmd
|
|
|
759
759
|
}
|
|
760
760
|
if (ctx->sock) {
|
|
761
761
|
if (ctx->sock->info) {
|
|
762
|
-
endpoint["local"] = ctx->sock->info->
|
|
762
|
+
endpoint["local"] = ctx->sock->info->ep_local_host_and_port;
|
|
763
763
|
}
|
|
764
764
|
endpoint["last_activity_us"] =
|
|
765
765
|
(Json::Value::UInt64)(now > ctx->sock->atime ? now - ctx->sock->atime : 0);
|
|
@@ -790,7 +790,7 @@ lcb_STATUS lcb_diag(lcb_INSTANCE *instance, void *cookie, const lcb_CMDDIAG *cmd
|
|
|
790
790
|
}
|
|
791
791
|
if (ctx->sock) {
|
|
792
792
|
if (ctx->sock->info) {
|
|
793
|
-
endpoint["local"] = ctx->sock->info->
|
|
793
|
+
endpoint["local"] = ctx->sock->info->ep_local_host_and_port;
|
|
794
794
|
}
|
|
795
795
|
endpoint["last_activity_us"] =
|
|
796
796
|
(Json::Value::UInt64)(now > ctx->sock->atime ? now - ctx->sock->atime : 0);
|
|
@@ -66,7 +66,8 @@ lcb_STATUS lcb_pktfwd3(lcb_INSTANCE *instance, const void *cookie, const lcb_CMD
|
|
|
66
66
|
/* set the cookie */
|
|
67
67
|
packet->u_rdata.reqdata.cookie = cookie;
|
|
68
68
|
packet->u_rdata.reqdata.start = gethrtime();
|
|
69
|
-
packet->u_rdata.reqdata.deadline =
|
|
69
|
+
packet->u_rdata.reqdata.deadline =
|
|
70
|
+
packet->u_rdata.reqdata.start + LCB_US2NS(LCBT_SETTING(instance, operation_timeout));
|
|
70
71
|
return err;
|
|
71
72
|
}
|
|
72
73
|
|
|
@@ -112,6 +112,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdremove_durability(lcb_CMDREMOVE *cmd, lcb_DUR
|
|
|
112
112
|
return cmd->durability_level(level);
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
LIBCOUCHBASE_API lcb_STATUS lcb_cmdremove_on_behalf_of(lcb_CMDREMOVE *cmd, const char *data, size_t data_len)
|
|
116
|
+
{
|
|
117
|
+
return cmd->on_behalf_of(std::string(data, data_len));
|
|
118
|
+
}
|
|
119
|
+
|
|
115
120
|
static lcb_STATUS remove_validate(lcb_INSTANCE *instance, const lcb_CMDREMOVE *cmd)
|
|
116
121
|
{
|
|
117
122
|
if (cmd->key().empty()) {
|
|
@@ -132,37 +137,45 @@ static lcb_STATUS remove_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
|
132
137
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
|
133
138
|
mc_PIPELINE *pl;
|
|
134
139
|
mc_PACKET *pkt;
|
|
135
|
-
protocol_binary_request_delete req{};
|
|
136
|
-
protocol_binary_request_header *hdr = &req.message.header;
|
|
137
140
|
int new_durability_supported = LCBT_SUPPORT_SYNCREPLICATION(instance);
|
|
138
|
-
lcb_U8 ffextlen = 0;
|
|
139
|
-
size_t hsize;
|
|
140
141
|
lcb_STATUS err;
|
|
141
142
|
|
|
142
|
-
hdr
|
|
143
|
+
protocol_binary_request_header hdr{};
|
|
144
|
+
|
|
145
|
+
std::vector<std::uint8_t> framing_extras;
|
|
143
146
|
if (new_durability_supported && cmd->has_durability_requirements()) {
|
|
144
|
-
|
|
145
|
-
|
|
147
|
+
auto durability_timeout = htons(lcb_durability_timeout(instance, cmd->timeout_in_microseconds()));
|
|
148
|
+
std::uint8_t frame_id = 0x01;
|
|
149
|
+
std::uint8_t frame_size = durability_timeout > 0 ? 3 : 1;
|
|
150
|
+
framing_extras.emplace_back(frame_id << 4U | frame_size);
|
|
151
|
+
framing_extras.emplace_back(cmd->durability_level());
|
|
152
|
+
if (durability_timeout > 0) {
|
|
153
|
+
framing_extras.emplace_back(durability_timeout >> 8U);
|
|
154
|
+
framing_extras.emplace_back(durability_timeout & 0xff);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (cmd->want_impersonation()) {
|
|
158
|
+
err = lcb::flexible_framing_extras::encode_impersonate_user(cmd->impostor(), framing_extras);
|
|
159
|
+
if (err != LCB_SUCCESS) {
|
|
160
|
+
return err;
|
|
161
|
+
}
|
|
146
162
|
}
|
|
147
163
|
|
|
164
|
+
hdr.request.magic = framing_extras.empty() ? PROTOCOL_BINARY_REQ : PROTOCOL_BINARY_AREQ;
|
|
165
|
+
auto ffextlen = static_cast<std::uint8_t>(framing_extras.size());
|
|
166
|
+
|
|
148
167
|
lcb_KEYBUF keybuf{LCB_KV_COPY, {cmd->key().c_str(), cmd->key().size()}};
|
|
149
|
-
err = mcreq_basic_packet(cq, &keybuf, cmd->collection().collection_id(), hdr, 0, ffextlen, &pkt, &pl,
|
|
168
|
+
err = mcreq_basic_packet(cq, &keybuf, cmd->collection().collection_id(), &hdr, 0, ffextlen, &pkt, &pl,
|
|
150
169
|
MCREQ_BASICPACKET_F_FALLBACKOK);
|
|
151
170
|
if (err != LCB_SUCCESS) {
|
|
152
171
|
return err;
|
|
153
172
|
}
|
|
154
|
-
hsize = hdr->request.extlen + sizeof(*hdr) + ffextlen;
|
|
155
173
|
|
|
156
|
-
hdr
|
|
157
|
-
hdr
|
|
158
|
-
hdr
|
|
159
|
-
hdr
|
|
160
|
-
hdr
|
|
161
|
-
if (new_durability_supported && cmd->has_durability_requirements()) {
|
|
162
|
-
req.message.body.alt.meta = (1u << 4u) | 3u;
|
|
163
|
-
req.message.body.alt.level = cmd->durability_level();
|
|
164
|
-
req.message.body.alt.timeout = htons(lcb_durability_timeout(instance, cmd->timeout_in_microseconds()));
|
|
165
|
-
}
|
|
174
|
+
hdr.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
|
175
|
+
hdr.request.opcode = PROTOCOL_BINARY_CMD_DELETE;
|
|
176
|
+
hdr.request.cas = lcb_htonll(cmd->cas());
|
|
177
|
+
hdr.request.opaque = pkt->opaque;
|
|
178
|
+
hdr.request.bodylen = htonl(ffextlen + hdr.request.extlen + mcreq_get_key_size(&hdr));
|
|
166
179
|
|
|
167
180
|
pkt->flags |= MCREQ_F_REPLACE_SEMANTICS;
|
|
168
181
|
pkt->u_rdata.reqdata.cookie = cmd->cookie();
|
|
@@ -170,9 +183,13 @@ static lcb_STATUS remove_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
|
170
183
|
pkt->u_rdata.reqdata.deadline =
|
|
171
184
|
pkt->u_rdata.reqdata.start +
|
|
172
185
|
cmd->timeout_or_default_in_nanoseconds(LCB_US2NS(LCBT_SETTING(instance, operation_timeout)));
|
|
173
|
-
memcpy(SPAN_BUFFER(&pkt->kh_span), hdr
|
|
174
|
-
|
|
175
|
-
|
|
186
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span), &hdr, sizeof(hdr));
|
|
187
|
+
std::size_t offset = sizeof(hdr);
|
|
188
|
+
if (!framing_extras.empty()) {
|
|
189
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, framing_extras.data(), framing_extras.size());
|
|
190
|
+
}
|
|
191
|
+
pkt->u_rdata.reqdata.span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
|
192
|
+
TRACE_REMOVE_BEGIN(instance, &hdr, cmd);
|
|
176
193
|
LCB_SCHED_ADD(instance, pl, pkt)
|
|
177
194
|
return LCB_SUCCESS;
|
|
178
195
|
}
|
|
@@ -229,6 +229,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdstore_durability_observe(lcb_CMDSTORE *cmd, i
|
|
|
229
229
|
return cmd->durability_poll(persist_to, replicate_to);
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
+
LIBCOUCHBASE_API lcb_STATUS lcb_cmdstore_on_behalf_of(lcb_CMDSTORE *cmd, const char *data, size_t data_len)
|
|
233
|
+
{
|
|
234
|
+
return cmd->on_behalf_of(std::string(data, data_len));
|
|
235
|
+
}
|
|
236
|
+
|
|
232
237
|
struct DurStoreCtx : mc_REQDATAEX {
|
|
233
238
|
lcb_INSTANCE *instance;
|
|
234
239
|
lcb_U16 persist_to;
|
|
@@ -375,19 +380,27 @@ static lcb_STATUS store_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMD
|
|
|
375
380
|
|
|
376
381
|
std::vector<std::uint8_t> framing_extras;
|
|
377
382
|
if (new_durability_supported && cmd->has_sync_durability_requirements()) {
|
|
383
|
+
auto durability_timeout = htons(lcb_durability_timeout(instance, cmd->timeout_in_microseconds()));
|
|
378
384
|
std::uint8_t frame_id = 0x01;
|
|
379
|
-
std::uint8_t frame_size =
|
|
385
|
+
std::uint8_t frame_size = durability_timeout > 0 ? 3 : 1;
|
|
380
386
|
framing_extras.emplace_back(frame_id << 4U | frame_size);
|
|
381
387
|
framing_extras.emplace_back(cmd->durability_level());
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
388
|
+
if (durability_timeout > 0) {
|
|
389
|
+
framing_extras.emplace_back(durability_timeout >> 8U);
|
|
390
|
+
framing_extras.emplace_back(durability_timeout & 0xff);
|
|
391
|
+
}
|
|
385
392
|
}
|
|
386
393
|
if (cmd->should_preserve_expiry()) {
|
|
387
394
|
std::uint8_t frame_id = 0x05;
|
|
388
395
|
std::uint8_t frame_size = 0x00;
|
|
389
396
|
framing_extras.emplace_back(frame_id << 4U | frame_size);
|
|
390
397
|
}
|
|
398
|
+
if (cmd->want_impersonation()) {
|
|
399
|
+
err = lcb::flexible_framing_extras::encode_impersonate_user(cmd->impostor(), framing_extras);
|
|
400
|
+
if (err != LCB_SUCCESS) {
|
|
401
|
+
return err;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
391
404
|
auto ffextlen = static_cast<std::uint8_t>(framing_extras.size());
|
|
392
405
|
hdr.request.magic = (ffextlen == 0) ? PROTOCOL_BINARY_REQ : PROTOCOL_BINARY_AREQ;
|
|
393
406
|
hdr.request.opcode = cmd->opcode();
|
|
@@ -472,7 +485,7 @@ static lcb_STATUS store_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMD
|
|
|
472
485
|
if (cmd->is_replace_semantics()) {
|
|
473
486
|
packet->flags |= MCREQ_F_REPLACE_SEMANTICS;
|
|
474
487
|
}
|
|
475
|
-
|
|
488
|
+
rdata->span = lcb::trace::start_kv_span_with_durability(instance->settings, packet, cmd);
|
|
476
489
|
LCB_SCHED_ADD(instance, pipeline, packet)
|
|
477
490
|
|
|
478
491
|
TRACE_STORE_BEGIN(instance, &hdr, cmd);
|
|
@@ -404,6 +404,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdsubdoc_create_as_deleted(lcb_CMDSUBDOC *cmd,
|
|
|
404
404
|
return cmd->create_as_deleted(flag);
|
|
405
405
|
}
|
|
406
406
|
|
|
407
|
+
LIBCOUCHBASE_API lcb_STATUS lcb_cmdsubdoc_on_behalf_of(lcb_CMDSUBDOC *cmd, const char *data, size_t data_len)
|
|
408
|
+
{
|
|
409
|
+
return cmd->on_behalf_of(std::string(data, data_len));
|
|
410
|
+
}
|
|
411
|
+
|
|
407
412
|
namespace SubdocCmdTraits
|
|
408
413
|
{
|
|
409
414
|
enum Options {
|
|
@@ -772,13 +777,15 @@ static lcb_STATUS subdoc_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
|
772
777
|
hdr.request.opcode = PROTOCOL_BINARY_CMD_SUBDOC_MULTI_MUTATION;
|
|
773
778
|
|
|
774
779
|
if (new_durability_supported && cmd->has_durability_requirements()) {
|
|
780
|
+
auto durability_timeout = htons(lcb_durability_timeout(instance, cmd->timeout_in_microseconds()));
|
|
775
781
|
std::uint8_t frame_id = 0x01;
|
|
776
|
-
std::uint8_t frame_size =
|
|
782
|
+
std::uint8_t frame_size = durability_timeout > 0 ? 3 : 1;
|
|
777
783
|
framing_extras.emplace_back(frame_id << 4U | frame_size);
|
|
778
784
|
framing_extras.emplace_back(cmd->durability_level());
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
785
|
+
if (durability_timeout > 0) {
|
|
786
|
+
framing_extras.emplace_back(durability_timeout >> 8U);
|
|
787
|
+
framing_extras.emplace_back(durability_timeout & 0xff);
|
|
788
|
+
}
|
|
782
789
|
}
|
|
783
790
|
if (cmd->should_preserve_expiry()) {
|
|
784
791
|
std::uint8_t frame_id = 0x05;
|
|
@@ -786,6 +793,12 @@ static lcb_STATUS subdoc_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
|
786
793
|
framing_extras.emplace_back(frame_id << 4U | frame_size);
|
|
787
794
|
}
|
|
788
795
|
}
|
|
796
|
+
if (cmd->want_impersonation()) {
|
|
797
|
+
rc = lcb::flexible_framing_extras::encode_impersonate_user(cmd->impostor(), framing_extras);
|
|
798
|
+
if (rc != LCB_SUCCESS) {
|
|
799
|
+
return rc;
|
|
800
|
+
}
|
|
801
|
+
}
|
|
789
802
|
hdr.request.magic = framing_extras.empty() ? PROTOCOL_BINARY_REQ : PROTOCOL_BINARY_AREQ;
|
|
790
803
|
auto ffextlen = static_cast<std::uint8_t>(framing_extras.size());
|
|
791
804
|
|
|
@@ -840,8 +853,7 @@ static lcb_STATUS subdoc_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
|
840
853
|
MCREQ_PKT_RDATA(pkt)->start +
|
|
841
854
|
cmd->timeout_or_default_in_nanoseconds(LCB_US2NS(LCBT_SETTING(instance, operation_timeout)));
|
|
842
855
|
MCREQ_PKT_RDATA(pkt)->nsubreq = cmd->specs().specs().size();
|
|
843
|
-
|
|
844
|
-
ctx.is_mutate() ? LCBTRACE_OP_MUTATEIN : LCBTRACE_OP_LOOKUPIN, MCREQ_PKT_RDATA(pkt)->span);
|
|
856
|
+
MCREQ_PKT_RDATA(pkt)->span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
|
845
857
|
LCB_SCHED_ADD(instance, pl, pkt)
|
|
846
858
|
return LCB_SUCCESS;
|
|
847
859
|
}
|
|
@@ -112,6 +112,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdtouch_durability(lcb_CMDTOUCH * /* cmd */, lc
|
|
|
112
112
|
return LCB_ERR_UNSUPPORTED_OPERATION;
|
|
113
113
|
}
|
|
114
114
|
|
|
115
|
+
LIBCOUCHBASE_API lcb_STATUS lcb_cmdtouch_on_behalf_of(lcb_CMDTOUCH *cmd, const char *data, size_t data_len)
|
|
116
|
+
{
|
|
117
|
+
return cmd->on_behalf_of(std::string(data, data_len));
|
|
118
|
+
}
|
|
119
|
+
|
|
115
120
|
static lcb_STATUS touch_validate(lcb_INSTANCE *instance, const lcb_CMDTOUCH *cmd)
|
|
116
121
|
{
|
|
117
122
|
if (cmd->key().empty()) {
|
|
@@ -126,39 +131,52 @@ static lcb_STATUS touch_validate(lcb_INSTANCE *instance, const lcb_CMDTOUCH *cmd
|
|
|
126
131
|
|
|
127
132
|
static lcb_STATUS touch_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMDTOUCH> cmd)
|
|
128
133
|
{
|
|
129
|
-
|
|
130
|
-
protocol_binary_request_header *hdr = &tcmd.message.header;
|
|
134
|
+
protocol_binary_request_header hdr{};
|
|
131
135
|
mc_PIPELINE *pl;
|
|
132
136
|
mc_PACKET *pkt;
|
|
133
137
|
lcb_STATUS err;
|
|
134
|
-
|
|
135
|
-
|
|
138
|
+
|
|
139
|
+
std::vector<std::uint8_t> framing_extras;
|
|
140
|
+
if (cmd->want_impersonation()) {
|
|
141
|
+
err = lcb::flexible_framing_extras::encode_impersonate_user(cmd->impostor(), framing_extras);
|
|
142
|
+
if (err != LCB_SUCCESS) {
|
|
143
|
+
return err;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
hdr.request.magic = framing_extras.empty() ? PROTOCOL_BINARY_REQ : PROTOCOL_BINARY_AREQ;
|
|
148
|
+
auto ffextlen = static_cast<std::uint8_t>(framing_extras.size());
|
|
136
149
|
|
|
137
150
|
lcb_KEYBUF keybuf{LCB_KV_COPY, {cmd->key().c_str(), cmd->key().size()}};
|
|
138
|
-
err = mcreq_basic_packet(&instance->cmdq, &keybuf, cmd->collection().collection_id(), hdr, 4, ffextlen, &pkt, &pl,
|
|
151
|
+
err = mcreq_basic_packet(&instance->cmdq, &keybuf, cmd->collection().collection_id(), &hdr, 4, ffextlen, &pkt, &pl,
|
|
139
152
|
MCREQ_BASICPACKET_F_FALLBACKOK);
|
|
140
153
|
if (err != LCB_SUCCESS) {
|
|
141
154
|
return err;
|
|
142
155
|
}
|
|
143
|
-
hsize = hdr->request.extlen + sizeof(*hdr) + ffextlen;
|
|
144
156
|
|
|
145
|
-
hdr
|
|
146
|
-
hdr
|
|
147
|
-
hdr
|
|
148
|
-
hdr
|
|
149
|
-
hdr
|
|
150
|
-
|
|
151
|
-
|
|
157
|
+
hdr.request.opcode = PROTOCOL_BINARY_CMD_TOUCH;
|
|
158
|
+
hdr.request.cas = 0;
|
|
159
|
+
hdr.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
|
160
|
+
hdr.request.opaque = pkt->opaque;
|
|
161
|
+
hdr.request.bodylen = htonl(hdr.request.extlen + ffextlen + mcreq_get_key_size(&hdr));
|
|
162
|
+
|
|
163
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span), &hdr, sizeof(hdr));
|
|
164
|
+
std::size_t offset = sizeof(hdr);
|
|
165
|
+
if (!framing_extras.empty()) {
|
|
166
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, framing_extras.data(), framing_extras.size());
|
|
167
|
+
offset += framing_extras.size();
|
|
168
|
+
}
|
|
169
|
+
std::uint32_t expiry = htonl(cmd->expiry());
|
|
170
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, &expiry, sizeof(expiry));
|
|
152
171
|
|
|
153
|
-
memcpy(SPAN_BUFFER(&pkt->kh_span), tcmd.bytes, hsize);
|
|
154
172
|
pkt->u_rdata.reqdata.cookie = cmd->cookie();
|
|
155
173
|
pkt->u_rdata.reqdata.start = cmd->start_time_or_default_in_nanoseconds(gethrtime());
|
|
156
174
|
pkt->u_rdata.reqdata.deadline =
|
|
157
175
|
pkt->u_rdata.reqdata.start +
|
|
158
176
|
cmd->timeout_or_default_in_nanoseconds(LCB_US2NS(LCBT_SETTING(instance, operation_timeout)));
|
|
159
|
-
|
|
177
|
+
pkt->u_rdata.reqdata.span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
|
160
178
|
LCB_SCHED_ADD(instance, pl, pkt);
|
|
161
|
-
TRACE_TOUCH_BEGIN(instance, hdr, cmd);
|
|
179
|
+
TRACE_TOUCH_BEGIN(instance, &hdr, cmd);
|
|
162
180
|
return LCB_SUCCESS;
|
|
163
181
|
}
|
|
164
182
|
|
|
@@ -101,6 +101,11 @@ LIBCOUCHBASE_API lcb_STATUS lcb_cmdunlock_cas(lcb_CMDUNLOCK *cmd, uint64_t cas)
|
|
|
101
101
|
return cmd->cas(cas);
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
LIBCOUCHBASE_API lcb_STATUS lcb_cmdunlock_on_behalf_of(lcb_CMDUNLOCK *cmd, const char *data, size_t data_len)
|
|
105
|
+
{
|
|
106
|
+
return cmd->on_behalf_of(std::string(data, data_len));
|
|
107
|
+
}
|
|
108
|
+
|
|
104
109
|
static lcb_STATUS unlock_validate(lcb_INSTANCE *instance, const lcb_CMDUNLOCK *cmd)
|
|
105
110
|
{
|
|
106
111
|
if (cmd->key().empty()) {
|
|
@@ -124,10 +129,21 @@ static lcb_STATUS unlock_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
|
124
129
|
mc_PACKET *pkt;
|
|
125
130
|
mc_REQDATA *rd;
|
|
126
131
|
lcb_STATUS err;
|
|
127
|
-
protocol_binary_request_header hdr;
|
|
132
|
+
protocol_binary_request_header hdr{};
|
|
133
|
+
|
|
134
|
+
std::vector<std::uint8_t> framing_extras;
|
|
135
|
+
if (cmd->want_impersonation()) {
|
|
136
|
+
err = lcb::flexible_framing_extras::encode_impersonate_user(cmd->impostor(), framing_extras);
|
|
137
|
+
if (err != LCB_SUCCESS) {
|
|
138
|
+
return err;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
hdr.request.magic = framing_extras.empty() ? PROTOCOL_BINARY_REQ : PROTOCOL_BINARY_AREQ;
|
|
143
|
+
auto ffextlen = static_cast<std::uint8_t>(framing_extras.size());
|
|
128
144
|
|
|
129
145
|
lcb_KEYBUF keybuf{LCB_KV_COPY, {cmd->key().c_str(), cmd->key().size()}};
|
|
130
|
-
err = mcreq_basic_packet(cq, &keybuf, cmd->collection().collection_id(), &hdr, 0,
|
|
146
|
+
err = mcreq_basic_packet(cq, &keybuf, cmd->collection().collection_id(), &hdr, 0, ffextlen, &pkt, &pl,
|
|
131
147
|
MCREQ_BASICPACKET_F_FALLBACKOK);
|
|
132
148
|
if (err != LCB_SUCCESS) {
|
|
133
149
|
return err;
|
|
@@ -139,15 +155,18 @@ static lcb_STATUS unlock_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
|
139
155
|
rd->deadline =
|
|
140
156
|
rd->start + cmd->timeout_or_default_in_nanoseconds(LCB_US2NS(LCBT_SETTING(instance, operation_timeout)));
|
|
141
157
|
|
|
142
|
-
hdr.request.magic = PROTOCOL_BINARY_REQ;
|
|
143
158
|
hdr.request.opcode = PROTOCOL_BINARY_CMD_UNLOCK_KEY;
|
|
144
159
|
hdr.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
|
145
|
-
hdr.request.bodylen = htonl((
|
|
160
|
+
hdr.request.bodylen = htonl(mcreq_get_key_size(&hdr));
|
|
146
161
|
hdr.request.opaque = pkt->opaque;
|
|
147
162
|
hdr.request.cas = lcb_htonll(cmd->cas());
|
|
148
163
|
|
|
149
164
|
memcpy(SPAN_BUFFER(&pkt->kh_span), hdr.bytes, sizeof(hdr.bytes));
|
|
150
|
-
|
|
165
|
+
std::size_t offset = sizeof(hdr);
|
|
166
|
+
if (!framing_extras.empty()) {
|
|
167
|
+
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, framing_extras.data(), framing_extras.size());
|
|
168
|
+
}
|
|
169
|
+
rd->span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
|
151
170
|
LCB_SCHED_ADD(instance, pl, pkt);
|
|
152
171
|
TRACE_UNLOCK_BEGIN(instance, &hdr, cmd);
|
|
153
172
|
return LCB_SUCCESS;
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
#include <libcouchbase/couchbase.h>
|
|
24
24
|
#include <memcached/protocol_binary.h>
|
|
25
25
|
#include "rdb/rope.h"
|
|
26
|
+
#include "utilities.h"
|
|
26
27
|
|
|
27
28
|
#ifndef __cplusplus
|
|
28
29
|
typedef struct packet_info_st packet_info;
|
|
@@ -315,10 +316,10 @@ class MemcachedResponse
|
|
|
315
316
|
}
|
|
316
317
|
std::string emsg;
|
|
317
318
|
if (!jerr["ref"].empty()) {
|
|
318
|
-
*err_ref =
|
|
319
|
+
*err_ref = lcb_strdup(jerr["ref"].asCString());
|
|
319
320
|
}
|
|
320
321
|
if (!jerr["context"].empty()) {
|
|
321
|
-
*err_ctx =
|
|
322
|
+
*err_ctx = lcb_strdup(jerr["context"].asCString());
|
|
322
323
|
}
|
|
323
324
|
return LCB_SUCCESS;
|
|
324
325
|
}
|
package/deps/lcb/src/retryq.cc
CHANGED
|
@@ -366,14 +366,33 @@ void RetryQueue::add(mc_EXPACKET *pkt, const lcb_STATUS err, protocol_binary_res
|
|
|
366
366
|
if (server == nullptr) {
|
|
367
367
|
continue;
|
|
368
368
|
}
|
|
369
|
+
|
|
369
370
|
/* check pending queue */
|
|
370
|
-
SLLIST_ITERFOR(&server->nbmgr.sendq.pending, &iter)
|
|
371
371
|
{
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
372
|
+
nb_SENDQ *sq = &server->nbmgr.sendq;
|
|
373
|
+
|
|
374
|
+
/* in the case of completion IO, there is a chunk of the sendq which
|
|
375
|
+
* has already been written to the network and cannot be cancelled,
|
|
376
|
+
* we need to only scan to remove packets which have NOT been sent
|
|
377
|
+
* yet.
|
|
378
|
+
*/
|
|
379
|
+
sllist_node *ll;
|
|
380
|
+
if (sq->last_requested) {
|
|
381
|
+
ll = sq->last_requested->slnode.next;
|
|
382
|
+
} else {
|
|
383
|
+
ll = SLLIST_FIRST(&sq->pending);
|
|
384
|
+
}
|
|
385
|
+
if (ll) {
|
|
386
|
+
for (slist_iter_init_at(ll, &iter); !sllist_iter_end(&sq->pending, &iter);
|
|
387
|
+
slist_iter_incr(&sq->pending, &iter)) {
|
|
388
|
+
nb_SNDQELEM *el = SLLIST_ITEM(iter.cur, nb_SNDQELEM, slnode);
|
|
389
|
+
if (el->parent == op->pkt) {
|
|
390
|
+
sllist_iter_remove(&sq->pending, &iter);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
375
393
|
}
|
|
376
394
|
}
|
|
395
|
+
|
|
377
396
|
/* check flush queue */
|
|
378
397
|
SLLIST_ITERFOR(&server->nbmgr.sendq.pdus, &iter)
|
|
379
398
|
{
|
|
@@ -406,7 +425,7 @@ void RetryQueue::add(mc_EXPACKET *pkt, const lcb_STATUS err, protocol_binary_res
|
|
|
406
425
|
uint32_t cid = mcreq_get_cid(get_instance(), &pkt->base);
|
|
407
426
|
lcb_log(LOGARGS(this, DEBUG),
|
|
408
427
|
"Adding PKT=%p to retry queue. retries=%u, cid=%u, opaque=%u, now=%" PRIu64 "ms, spent=%" PRIu64
|
|
409
|
-
"us, deadline_in=%" PRIu64 "us,
|
|
428
|
+
"us, deadline_in=%" PRIu64 "us, status=0x%02x, rc=%s",
|
|
410
429
|
(void *)pkt, pkt->base.retries, cid, pkt->base.opaque, LCB_NS2MS(now), LCB_NS2US(now - op->start),
|
|
411
430
|
LCB_NS2US(op->deadline - now), status, lcb_strerror_short(err));
|
|
412
431
|
schedule();
|
|
@@ -43,6 +43,7 @@ static lcb_STATUS search_execute(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMD
|
|
|
43
43
|
auto *req = new lcb_SEARCH_HANDLE_(instance, cmd->cookie(), cmd.get());
|
|
44
44
|
if (req->has_error()) {
|
|
45
45
|
lcb_STATUS rc = req->last_error();
|
|
46
|
+
req->clear_callback();
|
|
46
47
|
delete req;
|
|
47
48
|
return rc;
|
|
48
49
|
}
|