couchbase 3.2.3 → 3.2.4
Sign up to get free protection for your applications and to get access to all the features.
- 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 +72 -17
- 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 -6
- package/deps/lcb/doc/Doxyfile +1 -1
- package/deps/lcb/example/minimal/query.c +9 -7
- package/deps/lcb/gyp_config/common/libcouchbase/configuration.h +3 -3
- package/deps/lcb/include/libcouchbase/couchbase.h +3 -1
- 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 +7 -5
- package/deps/lcb/src/analytics/analytics_handle.hh +28 -0
- package/deps/lcb/src/capi/cmd_counter.hh +6 -0
- package/deps/lcb/src/capi/cmd_exists.hh +6 -0
- package/deps/lcb/src/capi/cmd_get.hh +5 -0
- package/deps/lcb/src/capi/cmd_get_replica.hh +6 -0
- package/deps/lcb/src/capi/cmd_remove.hh +6 -0
- package/deps/lcb/src/capi/cmd_search.hh +6 -0
- package/deps/lcb/src/capi/cmd_store.hh +16 -21
- package/deps/lcb/src/capi/cmd_subdoc.hh +18 -0
- package/deps/lcb/src/capi/cmd_touch.hh +6 -0
- package/deps/lcb/src/capi/cmd_unlock.hh +6 -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 +42 -8
- 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/lcbio/ctx.cc +4 -2
- package/deps/lcb/src/mcserver/mcserver.cc +8 -5
- 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 +27 -16
- package/deps/lcb/src/n1ql/query_handle.hh +27 -1
- package/deps/lcb/src/operations/counter.cc +1 -1
- package/deps/lcb/src/operations/exists.cc +2 -2
- package/deps/lcb/src/operations/get.cc +2 -2
- package/deps/lcb/src/operations/observe.cc +1 -1
- package/deps/lcb/src/operations/remove.cc +1 -1
- package/deps/lcb/src/operations/store.cc +1 -1
- package/deps/lcb/src/operations/subdoc.cc +1 -2
- package/deps/lcb/src/operations/touch.cc +2 -2
- package/deps/lcb/src/operations/unlock.cc +2 -2
- package/deps/lcb/src/search/search_handle.cc +27 -8
- package/deps/lcb/src/search/search_handle.hh +29 -0
- package/deps/lcb/src/ssl/ssl_common.c +6 -7
- package/deps/lcb/src/tracing/span.cc +43 -10
- package/deps/lcb/src/tracing/tracing-internal.h +105 -93
- 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/iotests/mock-environment.cc +15 -0
- package/deps/lcb/tests/iotests/mock-environment.h +47 -0
- package/deps/lcb/tests/iotests/mock-unit-test.cc +96 -5
- package/deps/lcb/tests/iotests/mock-unit-test.h +32 -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 +14 -4
- package/deps/lcb/tests/iotests/t_n1ql.cc +17 -1
- 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 +111 -0
- package/deps/lcb/tests/mocksupport/procutil.c +32 -28
- package/deps/lcb/tests/mocksupport/server.c +0 -1
- package/deps/lcb/tools/cbc.cc +7 -0
- package/dist/analyticsindexmanager.js +3 -3
- package/dist/binding.d.ts +2 -0
- package/dist/bindingutilities.js +4 -0
- package/dist/bucketmanager.d.ts +31 -1
- package/dist/bucketmanager.js +28 -2
- package/dist/collection.js +2 -2
- package/dist/collectionmanager.js +2 -2
- package/dist/connection.js +3 -0
- package/dist/errors.d.ts +18 -0
- package/dist/errors.js +26 -2
- package/dist/eventingfunctionmanager.js +6 -6
- package/dist/queryindexmanager.js +3 -3
- package/dist/searchexecutor.js +3 -0
- package/dist/searchindexmanager.js +1 -1
- 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 +1 -1
- package/dist/viewindexmanager.js +1 -1
- package/package.json +1 -1
- package/src/connection.cpp +2 -0
- package/src/constants.cpp +2 -0
- package/src/instance.cpp +8 -1
- package/src/instance.h +1 -0
@@ -185,6 +185,7 @@ class lcb::SessionRequestImpl : public SessionRequest
|
|
185
185
|
SessionInfo *info;
|
186
186
|
lcb_settings *settings;
|
187
187
|
lcb_host_t host_{};
|
188
|
+
bool expecting_error_map{false};
|
188
189
|
};
|
189
190
|
|
190
191
|
static void handle_read(lcbio_CTX *ioctx, unsigned)
|
@@ -316,8 +317,9 @@ SessionRequestImpl::MechStatus SessionRequestImpl::set_chosen_mech(std::string &
|
|
316
317
|
"PLAIN, but using SCRAM methods is strongly recommended over non-encrypted transports.",
|
317
318
|
LOGID(this));
|
318
319
|
#else
|
319
|
-
lcb_log(LOGARGS(this, WARN),
|
320
|
-
|
320
|
+
lcb_log(LOGARGS(this, WARN),
|
321
|
+
LOGFMT "SASL PLAIN authentication is not allowed on non-TLS connections (server supports: %s)",
|
322
|
+
LOGID(this), mechlist.c_str());
|
321
323
|
return MECH_UNAVAILABLE;
|
322
324
|
#endif
|
323
325
|
}
|
@@ -642,15 +644,15 @@ GT_NEXT_PACKET:
|
|
642
644
|
}
|
643
645
|
|
644
646
|
if (settings->keypath) {
|
645
|
-
completed = !maybe_select_bucket();
|
647
|
+
completed = !expecting_error_map && !maybe_select_bucket();
|
646
648
|
}
|
647
649
|
break;
|
648
650
|
}
|
649
651
|
|
650
652
|
case PROTOCOL_BINARY_CMD_GET_ERROR_MAP: {
|
653
|
+
expecting_error_map = false;
|
651
654
|
if (status == PROTOCOL_BINARY_RESPONSE_SUCCESS) {
|
652
|
-
|
653
|
-
}
|
655
|
+
update_errmap(resp);
|
654
656
|
} else if (isUnsupported(status)) {
|
655
657
|
lcb_log(LOGARGS(this, DEBUG), LOGFMT "Server does not support GET_ERRMAP (0x%x)", LOGID(this), status);
|
656
658
|
} else {
|
@@ -664,18 +666,37 @@ GT_NEXT_PACKET:
|
|
664
666
|
}
|
665
667
|
|
666
668
|
case PROTOCOL_BINARY_CMD_SELECT_BUCKET: {
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
669
|
+
switch (status) {
|
670
|
+
case PROTOCOL_BINARY_RESPONSE_SUCCESS:
|
671
|
+
completed = true;
|
672
|
+
info->selected = true;
|
673
|
+
break;
|
674
|
+
|
675
|
+
case PROTOCOL_BINARY_RESPONSE_EACCESS:
|
676
|
+
set_error(LCB_ERR_BUCKET_NOT_FOUND,
|
677
|
+
"Provided credentials not allowed for bucket or bucket does not exist", &resp);
|
678
|
+
break;
|
679
|
+
|
680
|
+
case PROTOCOL_BINARY_RESPONSE_KEY_ENOENT:
|
681
|
+
set_error(LCB_ERR_BUCKET_NOT_FOUND, "Key/Value service is not configured for given node", &resp);
|
682
|
+
break;
|
683
|
+
|
684
|
+
case PROTOCOL_BINARY_RATE_LIMITED_MAX_COMMANDS:
|
685
|
+
case PROTOCOL_BINARY_RATE_LIMITED_MAX_CONNECTIONS:
|
686
|
+
case PROTOCOL_BINARY_RATE_LIMITED_NETWORK_EGRESS:
|
687
|
+
case PROTOCOL_BINARY_RATE_LIMITED_NETWORK_INGRESS:
|
688
|
+
set_error(LCB_ERR_RATE_LIMITED, "The tenant has reached rate limit", &resp);
|
689
|
+
break;
|
690
|
+
|
691
|
+
case PROTOCOL_BINARY_SCOPE_SIZE_LIMIT_EXCEEDED:
|
692
|
+
set_error(LCB_ERR_QUOTA_LIMITED, "The tenant has reached quota limit", &resp);
|
693
|
+
break;
|
694
|
+
|
695
|
+
default:
|
696
|
+
lcb_log(LOGARGS(this, ERROR), LOGFMT "Unexpected status 0x%x received for SELECT_BUCKET",
|
697
|
+
LOGID(this), status);
|
698
|
+
set_error(LCB_ERR_PROTOCOL_ERROR, "Other auth error", &resp);
|
699
|
+
break;
|
679
700
|
}
|
680
701
|
break;
|
681
702
|
}
|
@@ -744,6 +765,7 @@ void SessionRequestImpl::start(lcbio_SOCKET *sock)
|
|
744
765
|
send_hello();
|
745
766
|
if (settings->use_errmap) {
|
746
767
|
request_errmap();
|
768
|
+
expecting_error_map = true;
|
747
769
|
} else {
|
748
770
|
lcb_log(LOGARGS(this, TRACE), LOGFMT "GET_ERRORMAP disabled", LOGID(this));
|
749
771
|
}
|
@@ -201,8 +201,7 @@ lcb_STATUS dispatch_common(lcb_INSTANCE *instance, const void *cookie, lcb_N1XMG
|
|
201
201
|
Json::Value root;
|
202
202
|
root["statement"] = ss;
|
203
203
|
string reqbuf = Json::FastWriter().write(root);
|
204
|
-
return dispatch_common<T>(instance, cookie, u_callback, i_callback, reqbuf.c_str(), reqbuf.size()
|
205
|
-
obj);
|
204
|
+
return dispatch_common<T>(instance, cookie, u_callback, i_callback, reqbuf.c_str(), reqbuf.size(), obj);
|
206
205
|
}
|
207
206
|
|
208
207
|
// Class to back the storage for the actual lcb_IXSPEC without doing too much
|
@@ -99,7 +99,7 @@ bool lcb_QUERY_HANDLE_::parse_meta(const char *row, size_t row_len, lcb_STATUS &
|
|
99
99
|
first_error_code = 0;
|
100
100
|
|
101
101
|
Json::Value meta;
|
102
|
-
if (!Json::Reader().parse(row, row + row_len, meta)) {
|
102
|
+
if (!Json::Reader(Json::Features::strictMode()).parse(row, row + row_len, meta)) {
|
103
103
|
return false;
|
104
104
|
}
|
105
105
|
const Json::Value &errors = meta["errors"];
|
@@ -143,13 +143,15 @@ bool lcb_QUERY_HANDLE_::parse_meta(const char *row, size_t row_len, lcb_STATUS &
|
|
143
143
|
rc = LCB_ERR_INTERNAL_SERVER_FAILURE;
|
144
144
|
if (!first_error_message.empty()) {
|
145
145
|
std::regex already_exists("Index.+already exists"); /* NOTE: case sensitive */
|
146
|
+
std::regex not_found("index.+not found");
|
146
147
|
if (std::regex_search(first_error_message, already_exists)) {
|
147
148
|
rc = LCB_ERR_INDEX_EXISTS;
|
148
|
-
} else {
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
149
|
+
} else if (std::regex_search(first_error_message, not_found)) {
|
150
|
+
rc = LCB_ERR_INDEX_NOT_FOUND;
|
151
|
+
} else if (first_error_message.find(
|
152
|
+
"Limit for number of indexes that can be created per scope has been reached") !=
|
153
|
+
std::string::npos) {
|
154
|
+
rc = LCB_ERR_QUOTA_LIMITED;
|
153
155
|
}
|
154
156
|
}
|
155
157
|
break;
|
@@ -166,6 +168,14 @@ bool lcb_QUERY_HANDLE_::parse_meta(const char *row, size_t row_len, lcb_STATUS &
|
|
166
168
|
case 13014:
|
167
169
|
rc = LCB_ERR_AUTHENTICATION_FAILURE;
|
168
170
|
break;
|
171
|
+
|
172
|
+
case 1191:
|
173
|
+
case 1192:
|
174
|
+
case 1193:
|
175
|
+
case 1194:
|
176
|
+
rc = LCB_ERR_RATE_LIMITED;
|
177
|
+
break;
|
178
|
+
|
169
179
|
default:
|
170
180
|
if (first_error_code >= 4000 && first_error_code < 5000) {
|
171
181
|
rc = LCB_ERR_PLANNING_FAILURE;
|
@@ -195,8 +205,8 @@ void lcb_QUERY_HANDLE_::invoke_row(lcb_RESPQUERY *resp, bool is_last)
|
|
195
205
|
resp->ctx.endpoint = resp->htresp->ctx.endpoint;
|
196
206
|
resp->ctx.endpoint_len = resp->htresp->ctx.endpoint_len;
|
197
207
|
}
|
198
|
-
resp->ctx.client_context_id =
|
199
|
-
resp->ctx.client_context_id_len =
|
208
|
+
resp->ctx.client_context_id = client_context_id_.c_str();
|
209
|
+
resp->ctx.client_context_id_len = client_context_id_.size();
|
200
210
|
resp->ctx.statement = statement_.c_str();
|
201
211
|
resp->ctx.statement_len = statement_.size();
|
202
212
|
|
@@ -213,9 +223,11 @@ void lcb_QUERY_HANDLE_::invoke_row(lcb_RESPQUERY *resp, bool is_last)
|
|
213
223
|
resp->ctx.first_error_message_len = first_error_message.size();
|
214
224
|
}
|
215
225
|
resp->ctx.first_error_code = first_error_code;
|
216
|
-
|
226
|
+
if (span_ != nullptr) {
|
227
|
+
lcb::trace::finish_http_span(span_, this);
|
228
|
+
span_ = nullptr;
|
229
|
+
}
|
217
230
|
|
218
|
-
LCBTRACE_HTTP_FINISH(span_);
|
219
231
|
if (http_request_ != nullptr) {
|
220
232
|
http_request_->span = nullptr;
|
221
233
|
}
|
@@ -426,7 +438,7 @@ lcb_STATUS lcb_QUERY_HANDLE_::issue_htreq(const std::string &body)
|
|
426
438
|
lcb_log(LOGARGS(this, TRACE),
|
427
439
|
LOGFMT "execute query: %.*s, idempotent=%s, timeout=%uus, grace_period=%uus, client_context_id=\"%s\"",
|
428
440
|
LOGID(this), (int)body.size(), body.c_str(), idempotent_ ? "true" : "false", timeout,
|
429
|
-
LCBT_SETTING(instance_, n1ql_grace_period),
|
441
|
+
LCBT_SETTING(instance_, n1ql_grace_period), client_context_id_.c_str());
|
430
442
|
return rc;
|
431
443
|
}
|
432
444
|
|
@@ -517,10 +529,10 @@ lcb_QUERY_HANDLE_::lcb_QUERY_HANDLE_(lcb_INSTANCE *obj, void *user_cookie, const
|
|
517
529
|
if (ccid.isNull()) {
|
518
530
|
char buf[32];
|
519
531
|
size_t nbuf = snprintf(buf, sizeof(buf), "%016" PRIx64, lcb_next_rand64());
|
520
|
-
|
521
|
-
json["client_context_id"] =
|
532
|
+
client_context_id_.assign(buf, nbuf);
|
533
|
+
json["client_context_id"] = client_context_id_;
|
522
534
|
} else {
|
523
|
-
|
535
|
+
client_context_id_ = ccid.asString();
|
524
536
|
}
|
525
537
|
if (json.isMember("readonly") && json["readonly"].asBool()) {
|
526
538
|
idempotent_ = true;
|
@@ -554,8 +566,7 @@ lcb_QUERY_HANDLE_::lcb_QUERY_HANDLE_(lcb_INSTANCE *obj, void *user_cookie, const
|
|
554
566
|
}
|
555
567
|
if (instance_->settings->tracer) {
|
556
568
|
parent_span_ = cmd->parent_span();
|
557
|
-
|
558
|
-
LCBTRACE_THRESHOLD_QUERY, span_);
|
569
|
+
span_ = lcb::trace::start_http_span_with_statement(instance_->settings, this, statement_);
|
559
570
|
}
|
560
571
|
}
|
561
572
|
|
@@ -246,6 +246,32 @@ struct lcb_QUERY_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
246
246
|
return LCB_SUCCESS;
|
247
247
|
}
|
248
248
|
|
249
|
+
static lcbtrace_THRESHOLDOPTS service()
|
250
|
+
{
|
251
|
+
return LCBTRACE_THRESHOLD_QUERY;
|
252
|
+
}
|
253
|
+
|
254
|
+
static const std::string &operation_name()
|
255
|
+
{
|
256
|
+
static std::string name = LCBTRACE_OP_QUERY;
|
257
|
+
return name;
|
258
|
+
}
|
259
|
+
|
260
|
+
lcbtrace_SPAN *parent_span() const
|
261
|
+
{
|
262
|
+
return parent_span_;
|
263
|
+
}
|
264
|
+
|
265
|
+
const std::string &client_context_id() const
|
266
|
+
{
|
267
|
+
return client_context_id_;
|
268
|
+
}
|
269
|
+
|
270
|
+
int retries() const
|
271
|
+
{
|
272
|
+
return retries_;
|
273
|
+
}
|
274
|
+
|
249
275
|
private:
|
250
276
|
void on_backoff();
|
251
277
|
|
@@ -269,7 +295,7 @@ struct lcb_QUERY_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
269
295
|
Json::Value json;
|
270
296
|
/** String of the original statement. Cached here to avoid jsoncpp lookups */
|
271
297
|
std::string statement_;
|
272
|
-
std::string
|
298
|
+
std::string client_context_id_;
|
273
299
|
std::string first_error_message{};
|
274
300
|
uint32_t first_error_code{};
|
275
301
|
|
@@ -237,7 +237,7 @@ static lcb_STATUS counter_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_C
|
|
237
237
|
}
|
238
238
|
memcpy(SPAN_BUFFER(&packet->kh_span) + offset, &expiry, sizeof(expiry));
|
239
239
|
|
240
|
-
|
240
|
+
rdata->span = lcb::trace::start_kv_span(instance->settings, packet, cmd);
|
241
241
|
TRACE_ARITHMETIC_BEGIN(instance, &hdr, cmd);
|
242
242
|
LCB_SCHED_ADD(instance, pipeline, packet);
|
243
243
|
return LCB_SUCCESS;
|
@@ -153,7 +153,7 @@ static lcb_STATUS exists_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
153
153
|
|
154
154
|
hdr.request.opcode = PROTOCOL_BINARY_CMD_GET_META;
|
155
155
|
hdr.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
156
|
-
hdr.request.bodylen =
|
156
|
+
hdr.request.bodylen = ntohl(mcreq_get_key_size(&hdr));
|
157
157
|
hdr.request.opaque = pkt->opaque;
|
158
158
|
hdr.request.cas = 0;
|
159
159
|
|
@@ -168,7 +168,7 @@ static lcb_STATUS exists_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
168
168
|
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, framing_extras.data(), framing_extras.size());
|
169
169
|
}
|
170
170
|
|
171
|
-
|
171
|
+
pkt->u_rdata.reqdata.span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
172
172
|
LCB_SCHED_ADD(instance, pipeline, pkt)
|
173
173
|
TRACE_EXISTS_BEGIN(instance, &hdr, cmd);
|
174
174
|
return LCB_SUCCESS;
|
@@ -187,7 +187,7 @@ static lcb_STATUS get_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMDGE
|
|
187
187
|
|
188
188
|
hdr.request.opcode = opcode;
|
189
189
|
hdr.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
190
|
-
hdr.request.bodylen = htonl(extlen + ffextlen +
|
190
|
+
hdr.request.bodylen = htonl(extlen + ffextlen + mcreq_get_key_size(&hdr));
|
191
191
|
hdr.request.opaque = pkt->opaque;
|
192
192
|
hdr.request.cas = 0;
|
193
193
|
|
@@ -209,7 +209,7 @@ static lcb_STATUS get_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMDGE
|
|
209
209
|
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, &expiry, sizeof(expiry));
|
210
210
|
}
|
211
211
|
|
212
|
-
|
212
|
+
rdata->span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
213
213
|
LCB_SCHED_ADD(instance, pl, pkt)
|
214
214
|
TRACE_GET_BEGIN(instance, &hdr, cmd);
|
215
215
|
return LCB_SUCCESS;
|
@@ -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
|
}
|
@@ -188,7 +188,7 @@ static lcb_STATUS remove_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
188
188
|
if (!framing_extras.empty()) {
|
189
189
|
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, framing_extras.data(), framing_extras.size());
|
190
190
|
}
|
191
|
-
|
191
|
+
pkt->u_rdata.reqdata.span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
192
192
|
TRACE_REMOVE_BEGIN(instance, &hdr, cmd);
|
193
193
|
LCB_SCHED_ADD(instance, pl, pkt)
|
194
194
|
return LCB_SUCCESS;
|
@@ -485,7 +485,7 @@ static lcb_STATUS store_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMD
|
|
485
485
|
if (cmd->is_replace_semantics()) {
|
486
486
|
packet->flags |= MCREQ_F_REPLACE_SEMANTICS;
|
487
487
|
}
|
488
|
-
|
488
|
+
rdata->span = lcb::trace::start_kv_span_with_durability(instance->settings, packet, cmd);
|
489
489
|
LCB_SCHED_ADD(instance, pipeline, packet)
|
490
490
|
|
491
491
|
TRACE_STORE_BEGIN(instance, &hdr, cmd);
|
@@ -853,8 +853,7 @@ static lcb_STATUS subdoc_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
853
853
|
MCREQ_PKT_RDATA(pkt)->start +
|
854
854
|
cmd->timeout_or_default_in_nanoseconds(LCB_US2NS(LCBT_SETTING(instance, operation_timeout)));
|
855
855
|
MCREQ_PKT_RDATA(pkt)->nsubreq = cmd->specs().specs().size();
|
856
|
-
|
857
|
-
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);
|
858
857
|
LCB_SCHED_ADD(instance, pl, pkt)
|
859
858
|
return LCB_SUCCESS;
|
860
859
|
}
|
@@ -158,7 +158,7 @@ static lcb_STATUS touch_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMD
|
|
158
158
|
hdr.request.cas = 0;
|
159
159
|
hdr.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
160
160
|
hdr.request.opaque = pkt->opaque;
|
161
|
-
hdr.request.bodylen = htonl(hdr.request.extlen + ffextlen +
|
161
|
+
hdr.request.bodylen = htonl(hdr.request.extlen + ffextlen + mcreq_get_key_size(&hdr));
|
162
162
|
|
163
163
|
memcpy(SPAN_BUFFER(&pkt->kh_span), &hdr, sizeof(hdr));
|
164
164
|
std::size_t offset = sizeof(hdr);
|
@@ -174,7 +174,7 @@ static lcb_STATUS touch_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CMD
|
|
174
174
|
pkt->u_rdata.reqdata.deadline =
|
175
175
|
pkt->u_rdata.reqdata.start +
|
176
176
|
cmd->timeout_or_default_in_nanoseconds(LCB_US2NS(LCBT_SETTING(instance, operation_timeout)));
|
177
|
-
|
177
|
+
pkt->u_rdata.reqdata.span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
178
178
|
LCB_SCHED_ADD(instance, pl, pkt);
|
179
179
|
TRACE_TOUCH_BEGIN(instance, &hdr, cmd);
|
180
180
|
return LCB_SUCCESS;
|
@@ -157,7 +157,7 @@ static lcb_STATUS unlock_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
157
157
|
|
158
158
|
hdr.request.opcode = PROTOCOL_BINARY_CMD_UNLOCK_KEY;
|
159
159
|
hdr.request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
160
|
-
hdr.request.bodylen = htonl((
|
160
|
+
hdr.request.bodylen = htonl(mcreq_get_key_size(&hdr));
|
161
161
|
hdr.request.opaque = pkt->opaque;
|
162
162
|
hdr.request.cas = lcb_htonll(cmd->cas());
|
163
163
|
|
@@ -166,7 +166,7 @@ static lcb_STATUS unlock_schedule(lcb_INSTANCE *instance, std::shared_ptr<lcb_CM
|
|
166
166
|
if (!framing_extras.empty()) {
|
167
167
|
memcpy(SPAN_BUFFER(&pkt->kh_span) + offset, framing_extras.data(), framing_extras.size());
|
168
168
|
}
|
169
|
-
|
169
|
+
rd->span = lcb::trace::start_kv_span(instance->settings, pkt, cmd);
|
170
170
|
LCB_SCHED_ADD(instance, pl, pkt);
|
171
171
|
TRACE_UNLOCK_BEGIN(instance, &hdr, cmd);
|
172
172
|
return LCB_SUCCESS;
|
@@ -23,6 +23,8 @@
|
|
23
23
|
#include "search_handle.hh"
|
24
24
|
#include "capi/cmd_http.hh"
|
25
25
|
|
26
|
+
#include <regex>
|
27
|
+
|
26
28
|
#define LOGFMT "(NR=%p) "
|
27
29
|
#define LOGID(req) static_cast<const void *>(req)
|
28
30
|
#define LOGARGS(req, lvl) (req)->instance_->settings, "searchh", LCB_LOG_##lvl, __FILE__, __LINE__
|
@@ -73,7 +75,7 @@ void lcb_SEARCH_HANDLE_::invoke_row(lcb_RESPSEARCH *resp)
|
|
73
75
|
if (callback_) {
|
74
76
|
if (resp->rflags & LCB_RESP_F_FINAL) {
|
75
77
|
Json::Value meta;
|
76
|
-
if (Json::Reader().parse(resp->row, resp->row + resp->nrow, meta)) {
|
78
|
+
if (Json::Reader(Json::Features::strictMode()).parse(resp->row, resp->row + resp->nrow, meta)) {
|
77
79
|
const Json::Value &top_error = meta["error"];
|
78
80
|
if (top_error.isString()) {
|
79
81
|
resp->ctx.has_top_level_error = 1;
|
@@ -92,9 +94,19 @@ void lcb_SEARCH_HANDLE_::invoke_row(lcb_RESPSEARCH *resp)
|
|
92
94
|
resp->ctx.error_message_len = error_message_.size();
|
93
95
|
if (error_message_.find("QueryBleve parsing") != std::string::npos) {
|
94
96
|
resp->ctx.rc = LCB_ERR_PARSING_FAILURE;
|
95
|
-
} else if (resp->ctx.http_response_code == 400
|
96
|
-
|
97
|
-
|
97
|
+
} else if (resp->ctx.http_response_code == 400) {
|
98
|
+
if (error_message_.find("not_found") != std::string::npos) {
|
99
|
+
resp->ctx.rc = LCB_ERR_INDEX_NOT_FOUND;
|
100
|
+
} else if (error_message_.find("CreateIndex, Prepare failed, err: num_fts_indexes") !=
|
101
|
+
std::string::npos) {
|
102
|
+
resp->ctx.rc = LCB_ERR_QUOTA_LIMITED;
|
103
|
+
}
|
104
|
+
} else if (resp->ctx.http_response_code == 429) {
|
105
|
+
std::regex rate_limiting_message(
|
106
|
+
"num_concurrent_requests|num_queries_per_min|ingress_mib_per_min|egress_mib_per_min");
|
107
|
+
if (std::regex_search(error_message_, rate_limiting_message)) {
|
108
|
+
resp->ctx.rc = LCB_ERR_RATE_LIMITED;
|
109
|
+
}
|
98
110
|
}
|
99
111
|
}
|
100
112
|
}
|
@@ -116,7 +128,10 @@ void lcb_SEARCH_HANDLE_::invoke_last()
|
|
116
128
|
resp.nrow = meta.iov_len;
|
117
129
|
}
|
118
130
|
|
119
|
-
|
131
|
+
if (span_ != nullptr) {
|
132
|
+
lcb::trace::finish_http_span(span_, this);
|
133
|
+
span_ = nullptr;
|
134
|
+
}
|
120
135
|
if (http_request_ != nullptr) {
|
121
136
|
http_request_->span = nullptr;
|
122
137
|
}
|
@@ -154,8 +169,13 @@ lcb_SEARCH_HANDLE_::lcb_SEARCH_HANDLE_(lcb_INSTANCE *instance, void *cookie, con
|
|
154
169
|
return;
|
155
170
|
}
|
156
171
|
index_name_ = j_ixname.asString();
|
172
|
+
{
|
173
|
+
char buf[32];
|
174
|
+
size_t nbuf = snprintf(buf, sizeof(buf), "%016" PRIx64, lcb_next_rand64());
|
175
|
+
client_context_id_.assign(buf, nbuf);
|
176
|
+
}
|
157
177
|
if (instance_->settings->tracer) {
|
158
|
-
|
178
|
+
parent_span_ = cmd->parent_span();
|
159
179
|
}
|
160
180
|
|
161
181
|
std::string url;
|
@@ -182,8 +202,7 @@ lcb_SEARCH_HANDLE_::lcb_SEARCH_HANDLE_(lcb_INSTANCE *instance, void *cookie, con
|
|
182
202
|
std::string qbody(Json::FastWriter().write(root));
|
183
203
|
lcb_cmdhttp_body(htcmd, qbody.c_str(), qbody.size());
|
184
204
|
|
185
|
-
|
186
|
-
span_);
|
205
|
+
span_ = lcb::trace::start_http_span(instance_->settings, this);
|
187
206
|
lcb_cmdhttp_parent_span(htcmd, span_);
|
188
207
|
|
189
208
|
last_error_ = lcb_http(instance_, this, htcmd);
|
@@ -115,6 +115,32 @@ struct lcb_SEARCH_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
115
115
|
}
|
116
116
|
}
|
117
117
|
|
118
|
+
static lcbtrace_THRESHOLDOPTS service()
|
119
|
+
{
|
120
|
+
return LCBTRACE_THRESHOLD_SEARCH;
|
121
|
+
}
|
122
|
+
|
123
|
+
static const std::string &operation_name()
|
124
|
+
{
|
125
|
+
static std::string name = LCBTRACE_OP_SEARCH;
|
126
|
+
return name;
|
127
|
+
}
|
128
|
+
|
129
|
+
lcbtrace_SPAN *parent_span() const
|
130
|
+
{
|
131
|
+
return parent_span_;
|
132
|
+
}
|
133
|
+
|
134
|
+
const std::string &client_context_id() const
|
135
|
+
{
|
136
|
+
return client_context_id_;
|
137
|
+
}
|
138
|
+
|
139
|
+
int retries() const
|
140
|
+
{
|
141
|
+
return retries_;
|
142
|
+
}
|
143
|
+
|
118
144
|
private:
|
119
145
|
const lcb_RESPHTTP *http_response_{nullptr};
|
120
146
|
lcb_HTTP_HANDLE *http_request_{nullptr};
|
@@ -124,9 +150,12 @@ struct lcb_SEARCH_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
124
150
|
lcb_INSTANCE *instance_{nullptr};
|
125
151
|
size_t rows_number_{0};
|
126
152
|
lcb_STATUS last_error_{LCB_SUCCESS};
|
153
|
+
lcbtrace_SPAN *parent_span_{nullptr};
|
127
154
|
lcbtrace_SPAN *span_{nullptr};
|
128
155
|
std::string index_name_;
|
129
156
|
std::string error_message_;
|
157
|
+
std::string client_context_id_{};
|
158
|
+
int retries_{0};
|
130
159
|
};
|
131
160
|
|
132
161
|
#endif // LIBCOUCHBASE_SEARCH_HANDLE_HH
|
@@ -219,7 +219,6 @@ int iotssl_maybe_error(lcbio_XSSL *xs, int rv)
|
|
219
219
|
******************************************************************************/
|
220
220
|
static void log_callback(const SSL *ssl, int where, int ret)
|
221
221
|
{
|
222
|
-
const char *retstr;
|
223
222
|
int should_log = 0;
|
224
223
|
lcbio_SOCKET *sock = SSL_get_app_data(ssl);
|
225
224
|
/* Ignore low-level SSL stuff */
|
@@ -238,9 +237,9 @@ static void log_callback(const SSL *ssl, int where, int ret)
|
|
238
237
|
return;
|
239
238
|
}
|
240
239
|
|
241
|
-
|
242
|
-
|
243
|
-
SSL_state_string_long(ssl), ret,
|
240
|
+
lcb_log(LOGARGS(ssl, LCB_LOG_TRACE), "<%s:%s> sock=%p: ST(0x%x). %s. R(0x%x) %s (%s)",
|
241
|
+
sock->info ? sock->info->ep_remote.host : "", sock->info ? sock->info->ep_remote.port : "", (void *)sock,
|
242
|
+
where, SSL_state_string_long(ssl), ret, SSL_alert_type_string_long(ret), SSL_alert_desc_string_long(ret));
|
244
243
|
|
245
244
|
if (where == SSL_CB_HANDSHAKE_DONE) {
|
246
245
|
lcb_log(LOGARGS(ssl, LCB_LOG_DEBUG), "sock=%p. Using SSL version %s. Cipher=%s", (void *)sock,
|
@@ -311,11 +310,11 @@ lcbio_pSSLCTX lcbio_ssl_new(const char *tsfile, const char *cafile, const char *
|
|
311
310
|
"MD5:RC4-SHA:RC4-MD5:RC4-MD5:EDH-RSA-DES-CBC-SHA:EDH-DSS-DES-CBC-SHA:DES-CBC-SHA:DES-CBC-MD5:EXP-EDH-RSA-DES-"
|
312
311
|
"CBC-SHA:EXP-EDH-DSS-DES-CBC-SHA:EXP-DES-CBC-SHA:EXP-RC2-CBC-MD5:EXP-RC2-CBC-MD5:EXP-RC4-MD5:EXP-RC4-MD5";
|
313
312
|
|
314
|
-
const char*
|
313
|
+
const char *cipher_list = getenv("LCB_SSL_CIPHER_LIST");
|
315
314
|
#ifdef HAVE_CIPHERSUITES
|
316
|
-
const char*
|
315
|
+
const char *ciphersuites = getenv("LCB_SSL_CIPHERSUITES");
|
317
316
|
#endif
|
318
|
-
const char*
|
317
|
+
const char *minimum_tls = getenv("LCB_SSL_MINIMUM_TLS");
|
319
318
|
|
320
319
|
if (!cipher_list) {
|
321
320
|
cipher_list = default_ssl_cipher_list;
|
@@ -21,6 +21,8 @@
|
|
21
21
|
#include <sys/timeb.h>
|
22
22
|
#endif
|
23
23
|
|
24
|
+
#include "n1ql/query_handle.hh"
|
25
|
+
|
24
26
|
typedef enum { TAGVAL_STRING, TAGVAL_UINT64, TAGVAL_DOUBLE, TAGVAL_BOOL } tag_type;
|
25
27
|
typedef struct tag_value {
|
26
28
|
sllist_node slnode;
|
@@ -129,7 +131,7 @@ void lcbtrace_span_add_tag_bool(lcbtrace_SPAN *span, const char *name, int value
|
|
129
131
|
}
|
130
132
|
|
131
133
|
LCB_INTERNAL_API
|
132
|
-
void lcbtrace_span_add_system_tags(lcbtrace_SPAN *span, lcb_settings *settings, lcbtrace_THRESHOLDOPTS svc)
|
134
|
+
void lcbtrace_span_add_system_tags(lcbtrace_SPAN *span, const lcb_settings *settings, lcbtrace_THRESHOLDOPTS svc)
|
133
135
|
{
|
134
136
|
if (!span) {
|
135
137
|
return;
|
@@ -138,6 +140,7 @@ void lcbtrace_span_add_system_tags(lcbtrace_SPAN *span, lcb_settings *settings,
|
|
138
140
|
span->service(svc);
|
139
141
|
}
|
140
142
|
span->add_tag(LCBTRACE_TAG_SYSTEM, 0, "couchbase", 0);
|
143
|
+
span->add_tag(LCBTRACE_TAG_TRANSPORT, 0, "IP.TCP", 0);
|
141
144
|
std::string client_string(LCB_CLIENT_ID);
|
142
145
|
if (settings->client_string) {
|
143
146
|
client_string += " ";
|
@@ -158,15 +161,6 @@ lcbtrace_SPAN *lcbtrace_span_get_parent(lcbtrace_SPAN *span)
|
|
158
161
|
return span->m_parent;
|
159
162
|
}
|
160
163
|
|
161
|
-
LCB_INTERNAL_API
|
162
|
-
void lcbtrace_span_set_parent(lcbtrace_SPAN *span, lcbtrace_SPAN *parent)
|
163
|
-
{
|
164
|
-
if (!span) {
|
165
|
-
return;
|
166
|
-
}
|
167
|
-
span->m_parent = parent;
|
168
|
-
}
|
169
|
-
|
170
164
|
LIBCOUCHBASE_API
|
171
165
|
uint64_t lcbtrace_span_get_start_ts(lcbtrace_SPAN *span)
|
172
166
|
{
|
@@ -412,6 +406,38 @@ LIBCOUCHBASE_API lcb_STATUS lcbtrace_span_get_is_encode(lcbtrace_SPAN *span, int
|
|
412
406
|
return LCB_SUCCESS;
|
413
407
|
}
|
414
408
|
|
409
|
+
namespace lcb
|
410
|
+
{
|
411
|
+
namespace trace
|
412
|
+
{
|
413
|
+
void finish_kv_span(const mc_PIPELINE *pipeline, const mc_PACKET *request_pkt,
|
414
|
+
const lcb::MemcachedResponse *response_pkt)
|
415
|
+
{
|
416
|
+
lcbtrace_SPAN *dispatch_span = MCREQ_PKT_RDATA(request_pkt)->span;
|
417
|
+
if (dispatch_span) {
|
418
|
+
if (response_pkt != nullptr) {
|
419
|
+
dispatch_span->increment_server(response_pkt->duration());
|
420
|
+
}
|
421
|
+
auto *server = static_cast<const lcb::Server *>(pipeline);
|
422
|
+
dispatch_span->find_outer_or_this()->add_tag(LCBTRACE_TAG_RETRIES, 0, (uint64_t)request_pkt->retries);
|
423
|
+
lcbtrace_span_add_tag_str_nocopy(dispatch_span, LCBTRACE_TAG_TRANSPORT, "IP.TCP");
|
424
|
+
lcbio_CTX *ctx = server->connctx;
|
425
|
+
if (ctx) {
|
426
|
+
char local_id[34] = {};
|
427
|
+
snprintf(local_id, sizeof(local_id), "%016" PRIx64 "/%016" PRIx64, (uint64_t)server->get_settings()->iid,
|
428
|
+
(uint64_t)ctx->sock->id);
|
429
|
+
lcbtrace_span_add_tag_str(dispatch_span, LCBTRACE_TAG_LOCAL_ID, local_id);
|
430
|
+
lcbtrace_span_add_host_and_port(dispatch_span, ctx->sock->info);
|
431
|
+
}
|
432
|
+
if (dispatch_span->should_finish()) {
|
433
|
+
lcbtrace_span_finish(dispatch_span, LCBTRACE_NOW);
|
434
|
+
}
|
435
|
+
}
|
436
|
+
}
|
437
|
+
|
438
|
+
} // namespace trace
|
439
|
+
} // namespace lcb
|
440
|
+
|
415
441
|
using namespace lcb::trace;
|
416
442
|
|
417
443
|
Span::Span(lcbtrace_TRACER *tracer, const char *opname, uint64_t start, lcbtrace_REF_TYPE ref, lcbtrace_SPAN *other,
|
@@ -601,6 +627,13 @@ void Span::add_tag(const char *name, int copy_key, const char *value, int copy_v
|
|
601
627
|
}
|
602
628
|
}
|
603
629
|
|
630
|
+
void Span::add_tag(const char *name, const std::string &value)
|
631
|
+
{
|
632
|
+
if (name != nullptr && !value.empty()) {
|
633
|
+
add_tag(name, 0, value.c_str(), value.size(), 1);
|
634
|
+
}
|
635
|
+
}
|
636
|
+
|
604
637
|
void Span::add_tag(const char *name, int copy_key, const char *value, size_t value_len, int copy_value)
|
605
638
|
{
|
606
639
|
if (nullptr != m_extspan && nullptr != m_tracer) {
|