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
@@ -6,7 +6,7 @@ Standards-Version: 3.9.2
|
|
6
6
|
Section: libs
|
7
7
|
Homepage: http://www.couchbase.com/develop/c/current
|
8
8
|
Vcs-Browser: https://github.com/couchbase/libcouchbase
|
9
|
-
Vcs-Git:
|
9
|
+
Vcs-Git: https://github.com/couchbase/libcouchbase.git
|
10
10
|
|
11
11
|
Package: libcouchbase3-libevent
|
12
12
|
Architecture: any
|
@@ -225,7 +225,7 @@ lcb_ANALYTICS_HANDLE_::lcb_ANALYTICS_HANDLE_(lcb_INSTANCE *obj, void *user_cooki
|
|
225
225
|
query_params_ = Json::FastWriter().write(cmd->root());
|
226
226
|
|
227
227
|
if (instance_->settings->tracer) {
|
228
|
-
|
228
|
+
parent_span_ = cmd->parent_span();
|
229
229
|
}
|
230
230
|
|
231
231
|
if (ingest_options().method != LCB_INGEST_METHOD_NONE) {
|
@@ -284,8 +284,7 @@ lcb_STATUS lcb_ANALYTICS_HANDLE_::issue_htreq(const std::string &body)
|
|
284
284
|
htcmd->set_header("cb-on-behalf-of", impostor_);
|
285
285
|
}
|
286
286
|
|
287
|
-
|
288
|
-
LCBTRACE_THRESHOLD_ANALYTICS, span_);
|
287
|
+
span_ = lcb::trace::start_http_span_with_statement(instance_->settings, this, statement_);
|
289
288
|
lcb_cmdhttp_parent_span(htcmd, span_);
|
290
289
|
|
291
290
|
lcb_STATUS rc = lcb_http(instance_, this, htcmd);
|
@@ -394,7 +393,7 @@ void lcb_ANALYTICS_HANDLE_::invoke_row(lcb_RESPANALYTICS *resp, bool is_last)
|
|
394
393
|
resp->rflags |= LCB_RESP_F_EXTDATA;
|
395
394
|
}
|
396
395
|
Json::Value meta;
|
397
|
-
if (Json::Reader().parse(resp->row, resp->row + resp->nrow, meta)) {
|
396
|
+
if (Json::Reader(Json::Features::strictMode()).parse(resp->row, resp->row + resp->nrow, meta)) {
|
398
397
|
const Json::Value &errors = meta["errors"];
|
399
398
|
if (errors.isArray() && !errors.empty()) {
|
400
399
|
const Json::Value &err = errors[0];
|
@@ -456,7 +455,10 @@ void lcb_ANALYTICS_HANDLE_::invoke_row(lcb_RESPANALYTICS *resp, bool is_last)
|
|
456
455
|
}
|
457
456
|
}
|
458
457
|
|
459
|
-
|
458
|
+
if (span_ != nullptr) {
|
459
|
+
lcb::trace::finish_http_span(span_, this);
|
460
|
+
span_ = nullptr;
|
461
|
+
}
|
460
462
|
if (http_request_ != nullptr) {
|
461
463
|
http_request_->span = nullptr;
|
462
464
|
}
|
@@ -208,6 +208,32 @@ struct lcb_ANALYTICS_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
208
208
|
return last_error_;
|
209
209
|
}
|
210
210
|
|
211
|
+
static lcbtrace_THRESHOLDOPTS service()
|
212
|
+
{
|
213
|
+
return LCBTRACE_THRESHOLD_ANALYTICS;
|
214
|
+
}
|
215
|
+
|
216
|
+
static const std::string &operation_name()
|
217
|
+
{
|
218
|
+
static std::string name = LCBTRACE_OP_ANALYTICS;
|
219
|
+
return name;
|
220
|
+
}
|
221
|
+
|
222
|
+
lcbtrace_SPAN *parent_span() const
|
223
|
+
{
|
224
|
+
return parent_span_;
|
225
|
+
}
|
226
|
+
|
227
|
+
const std::string &client_context_id() const
|
228
|
+
{
|
229
|
+
return client_context_id_;
|
230
|
+
}
|
231
|
+
|
232
|
+
int retries() const
|
233
|
+
{
|
234
|
+
return retries_;
|
235
|
+
}
|
236
|
+
|
211
237
|
private:
|
212
238
|
const lcb_RESPHTTP *http_response_{nullptr};
|
213
239
|
lcb_HTTP_HANDLE *http_request_{nullptr};
|
@@ -219,6 +245,7 @@ struct lcb_ANALYTICS_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
219
245
|
lcb_U32 timeout_{0};
|
220
246
|
// How many rows were received. Used to avoid parsing the meta
|
221
247
|
size_t rows_number_{0};
|
248
|
+
int retries_{0};
|
222
249
|
|
223
250
|
/** Request body as received from the application */
|
224
251
|
Json::Value json{};
|
@@ -240,6 +267,7 @@ struct lcb_ANALYTICS_HANDLE_ : lcb::jsparse::Parser::Actions {
|
|
240
267
|
lcb::docreq::Queue *document_queue_{nullptr};
|
241
268
|
unsigned refcount{1};
|
242
269
|
|
270
|
+
lcbtrace_SPAN *parent_span_{nullptr};
|
243
271
|
lcbtrace_SPAN *span_{nullptr};
|
244
272
|
std::string impostor_{};
|
245
273
|
};
|
@@ -30,6 +30,12 @@
|
|
30
30
|
*/
|
31
31
|
struct lcb_CMDCOUNTER_ {
|
32
32
|
public:
|
33
|
+
static const std::string &operation_name()
|
34
|
+
{
|
35
|
+
static std::string name = LCBTRACE_OP_COUNTER;
|
36
|
+
return name;
|
37
|
+
}
|
38
|
+
|
33
39
|
lcb_STATUS expiry(std::uint32_t expiry)
|
34
40
|
{
|
35
41
|
if (!initialize_if_does_not_exist_) {
|
@@ -36,6 +36,12 @@ enum class get_replica_mode {
|
|
36
36
|
* @private
|
37
37
|
*/
|
38
38
|
struct lcb_CMDGETREPLICA_ {
|
39
|
+
static const std::string &operation_name()
|
40
|
+
{
|
41
|
+
static std::string name = LCBTRACE_OP_GET_FROM_REPLICA;
|
42
|
+
return name;
|
43
|
+
}
|
44
|
+
|
39
45
|
lcb_STATUS mode(get_replica_mode mode)
|
40
46
|
{
|
41
47
|
mode_ = mode;
|
@@ -70,6 +70,12 @@ struct lcb_RESPSEARCH_ {
|
|
70
70
|
* @private
|
71
71
|
*/
|
72
72
|
struct lcb_CMDSEARCH_ {
|
73
|
+
static const std::string &operation_name()
|
74
|
+
{
|
75
|
+
static std::string name = LCBTRACE_OP_SEARCH;
|
76
|
+
return name;
|
77
|
+
}
|
78
|
+
|
73
79
|
bool has_callback() const
|
74
80
|
{
|
75
81
|
return callback_ != nullptr;
|
@@ -35,6 +35,16 @@ enum class durability_mode {
|
|
35
35
|
* @private
|
36
36
|
*/
|
37
37
|
struct lcb_CMDSTORE_ {
|
38
|
+
const std::string &operation_name() const
|
39
|
+
{
|
40
|
+
static std::map<int, std::string> names{
|
41
|
+
{LCB_STORE_UPSERT, LCBTRACE_OP_UPSERT}, {LCB_STORE_REPLACE, LCBTRACE_OP_REPLACE},
|
42
|
+
{LCB_STORE_APPEND, LCBTRACE_OP_APPEND}, {LCB_STORE_PREPEND, LCBTRACE_OP_PREPEND},
|
43
|
+
{LCB_STORE_INSERT, LCBTRACE_OP_INSERT},
|
44
|
+
};
|
45
|
+
return names[operation_];
|
46
|
+
}
|
47
|
+
|
38
48
|
lcb_STATUS operation(lcb_STORE_OPERATION operation)
|
39
49
|
{
|
40
50
|
operation_ = operation;
|
@@ -123,24 +133,6 @@ struct lcb_CMDSTORE_ {
|
|
123
133
|
return false;
|
124
134
|
}
|
125
135
|
|
126
|
-
const char *operation_name() const
|
127
|
-
{
|
128
|
-
switch (operation_) {
|
129
|
-
case LCB_STORE_UPSERT:
|
130
|
-
return LCBTRACE_OP_UPSERT;
|
131
|
-
case LCB_STORE_REPLACE:
|
132
|
-
return LCBTRACE_OP_REPLACE;
|
133
|
-
case LCB_STORE_APPEND:
|
134
|
-
return LCBTRACE_OP_APPEND;
|
135
|
-
case LCB_STORE_PREPEND:
|
136
|
-
return LCBTRACE_OP_PREPEND;
|
137
|
-
case LCB_STORE_INSERT:
|
138
|
-
return LCBTRACE_OP_INSERT;
|
139
|
-
}
|
140
|
-
lcb_assert(false && "unknown operation name");
|
141
|
-
return "unknown";
|
142
|
-
}
|
143
|
-
|
144
136
|
lcb_STATUS flags(std::uint32_t flags)
|
145
137
|
{
|
146
138
|
if (operation_ == LCB_STORE_APPEND || operation_ == LCB_STORE_PREPEND) {
|
@@ -245,13 +237,16 @@ struct lcb_CMDSTORE_ {
|
|
245
237
|
|
246
238
|
lcb_STATUS value(const lcb_IOV *iov, std::size_t iov_len)
|
247
239
|
{
|
248
|
-
std::
|
240
|
+
std::size_t total_size = 0;
|
241
|
+
for (std::size_t i = 0; i < iov_len; ++i) {
|
242
|
+
total_size += iov[i].iov_len;
|
243
|
+
}
|
244
|
+
value_.reserve(total_size);
|
249
245
|
for (std::size_t i = 0; i < iov_len; ++i) {
|
250
246
|
if (iov[i].iov_len > 0 && iov[i].iov_base != nullptr) {
|
251
|
-
|
247
|
+
value_.append(static_cast<const char *>(iov[i].iov_base), iov[i].iov_len);
|
252
248
|
}
|
253
249
|
}
|
254
|
-
value_ = ss.str();
|
255
250
|
return LCB_SUCCESS;
|
256
251
|
}
|
257
252
|
|
@@ -114,6 +114,12 @@ struct subdoc_spec_options {
|
|
114
114
|
* This structure is provided in an array to the lcb_CMDSUBDOC::specs field.
|
115
115
|
*/
|
116
116
|
struct subdoc_spec {
|
117
|
+
bool is_lookup() const
|
118
|
+
{
|
119
|
+
return opcode_ == subdoc_opcode::get || opcode_ == subdoc_opcode::get_count ||
|
120
|
+
opcode_ == subdoc_opcode::get_fulldoc || opcode_ == subdoc_opcode::exist;
|
121
|
+
}
|
122
|
+
|
117
123
|
subdoc_opcode opcode() const
|
118
124
|
{
|
119
125
|
return opcode_;
|
@@ -216,11 +222,23 @@ struct lcb_SUBDOCSPECS_ {
|
|
216
222
|
return specs_;
|
217
223
|
}
|
218
224
|
|
225
|
+
bool is_lookup() const
|
226
|
+
{
|
227
|
+
return specs_.empty() || specs_[0].is_lookup();
|
228
|
+
}
|
229
|
+
|
219
230
|
private:
|
220
231
|
std::vector<subdoc_spec> specs_{};
|
221
232
|
};
|
222
233
|
|
223
234
|
struct lcb_CMDSUBDOC_ {
|
235
|
+
const std::string &operation_name() const
|
236
|
+
{
|
237
|
+
static std::string lookup_in_name = LCBTRACE_OP_LOOKUPIN;
|
238
|
+
static std::string mutate_in_name = LCBTRACE_OP_MUTATEIN;
|
239
|
+
return specs_.is_lookup() ? lookup_in_name : mutate_in_name;
|
240
|
+
}
|
241
|
+
|
224
242
|
const subdoc_options &options() const
|
225
243
|
{
|
226
244
|
return options_;
|
@@ -47,6 +47,12 @@ struct lcb_VIEW_ERROR_CONTEXT_ {
|
|
47
47
|
|
48
48
|
/** @private */
|
49
49
|
struct lcb_CMDVIEW_ {
|
50
|
+
static const std::string &operation_name()
|
51
|
+
{
|
52
|
+
static std::string name = LCBTRACE_OP_VIEW;
|
53
|
+
return name;
|
54
|
+
}
|
55
|
+
|
50
56
|
bool view_or_design_document_empty() const
|
51
57
|
{
|
52
58
|
return view_name_.empty() || design_document_name_.empty();
|
@@ -135,8 +135,8 @@ struct collection_qualifier {
|
|
135
135
|
return true;
|
136
136
|
}
|
137
137
|
|
138
|
-
std::string scope_{};
|
139
|
-
std::string collection_{};
|
138
|
+
std::string scope_{"_default"};
|
139
|
+
std::string collection_{"_default"};
|
140
140
|
std::string spec_{};
|
141
141
|
std::uint32_t resolved_collection_id_{0};
|
142
142
|
bool resolved_{false};
|
package/deps/lcb/src/cntl.cc
CHANGED
@@ -21,6 +21,7 @@
|
|
21
21
|
#include <lcbio/iotable.h>
|
22
22
|
#include <mcserver/negotiate.h>
|
23
23
|
#include <lcbio/ssl.h>
|
24
|
+
#include "n1ql/query_utils.hh"
|
24
25
|
|
25
26
|
#define LOGARGS(instance, lvl) instance->settings, "cntl", LCB_LOG_##lvl, __FILE__, __LINE__
|
26
27
|
|
@@ -238,7 +239,35 @@ HANDLER(select_bucket_handler){RETURN_GET_SET(int, LCBT_SETTING(instance, select
|
|
238
239
|
|
239
240
|
HANDLER(log_redaction_handler){RETURN_GET_SET(int, LCBT_SETTING(instance, log_redaction))}
|
240
241
|
|
241
|
-
HANDLER(enable_tracing_handler)
|
242
|
+
HANDLER(enable_tracing_handler)
|
243
|
+
{
|
244
|
+
if (mode == LCB_CNTL_GET) {
|
245
|
+
RETURN_GET_ONLY(int, instance->settings->use_tracing)
|
246
|
+
} else if (mode == LCB_CNTL_SET) {
|
247
|
+
if (arg == nullptr) {
|
248
|
+
return LCB_ERR_INVALID_ARGUMENT;
|
249
|
+
}
|
250
|
+
int enabled = *(static_cast<int *>(arg));
|
251
|
+
if (enabled) {
|
252
|
+
if (instance->settings->use_tracing) {
|
253
|
+
/* do nothing */
|
254
|
+
return LCB_SUCCESS;
|
255
|
+
}
|
256
|
+
instance->settings->tracer = lcbtrace_new(instance, LCBTRACE_F_THRESHOLD);
|
257
|
+
instance->settings->use_tracing = true;
|
258
|
+
return LCB_SUCCESS;
|
259
|
+
} else {
|
260
|
+
if (instance->settings->use_tracing) {
|
261
|
+
lcbtrace_destroy(instance->settings->tracer);
|
262
|
+
instance->settings->tracer = nullptr;
|
263
|
+
instance->settings->use_tracing = false;
|
264
|
+
}
|
265
|
+
return LCB_SUCCESS;
|
266
|
+
}
|
267
|
+
} else {
|
268
|
+
return LCB_ERR_CONTROL_UNSUPPORTED_MODE;
|
269
|
+
}
|
270
|
+
}
|
242
271
|
|
243
272
|
HANDLER(enable_errmap_handler){RETURN_GET_SET(int, LCBT_SETTING(instance, use_errmap))}
|
244
273
|
|
@@ -858,14 +887,19 @@ typedef struct {
|
|
858
887
|
|
859
888
|
static lcb_STATUS convert_timevalue(const char *arg, u_STRCONVERT *u)
|
860
889
|
{
|
861
|
-
|
862
|
-
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
890
|
+
try {
|
891
|
+
auto tmo_ns = lcb_parse_golang_duration(arg);
|
892
|
+
u->u32 = static_cast<std::uint32_t>(std::chrono::duration_cast<std::chrono::microseconds>(tmo_ns).count());
|
893
|
+
} catch (const lcb_duration_parse_error &) {
|
894
|
+
double dtmp;
|
895
|
+
char *end = nullptr;
|
896
|
+
errno = 0;
|
897
|
+
dtmp = std::strtod(arg, &end);
|
898
|
+
if (errno == ERANGE || end == arg) {
|
899
|
+
return LCB_ERR_CONTROL_INVALID_ARGUMENT;
|
900
|
+
}
|
901
|
+
u->u32 = static_cast<std::uint32_t>(dtmp * (double)1000000);
|
867
902
|
}
|
868
|
-
u->u32 = static_cast<std::uint32_t>(dtmp * (double)1000000);
|
869
903
|
return LCB_SUCCESS;
|
870
904
|
}
|
871
905
|
|
package/deps/lcb/src/dns-srv.cc
CHANGED
@@ -105,9 +105,11 @@ lcb_STATUS lcb::dnssrv_query(const char *addr, Hostlist &hs)
|
|
105
105
|
}
|
106
106
|
|
107
107
|
for (cur = root; cur; cur = cur->pNext) {
|
108
|
-
|
109
|
-
|
110
|
-
|
108
|
+
if(cur->wType == DNS_TYPE_SRV) {
|
109
|
+
// Use the ASCII version of the DNS lookup structure
|
110
|
+
const DNS_SRV_DATAA *srv = &cur->Data.SRV;
|
111
|
+
hs.add(srv->pNameTarget, srv->wPort);
|
112
|
+
}
|
111
113
|
}
|
112
114
|
DnsRecordListFree(root, DnsFreeRecordList);
|
113
115
|
return LCB_SUCCESS;
|
package/deps/lcb/src/errmap.cc
CHANGED
@@ -131,8 +131,7 @@ ErrorMap::ParseStatus ErrorMap::parse(const char *s, size_t n, std::string &errm
|
|
131
131
|
return PARSE_ERROR;
|
132
132
|
}
|
133
133
|
|
134
|
-
Json::Value::const_iterator ii = errsJson.begin();
|
135
|
-
for (; ii != errsJson.end(); ++ii) {
|
134
|
+
for (Json::Value::const_iterator ii = errsJson.begin(); ii != errsJson.end(); ++ii) {
|
136
135
|
// Key is the version in hex
|
137
136
|
unsigned ec = 0;
|
138
137
|
if (sscanf(ii.key().asCString(), "%x", &ec) != 1) {
|
@@ -155,14 +154,11 @@ ErrorMap::ParseStatus ErrorMap::parse(const char *s, size_t n, std::string &errm
|
|
155
154
|
return PARSE_ERROR;
|
156
155
|
}
|
157
156
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
errmsg = "unknown attribute received";
|
163
|
-
return UNKNOWN_VERSION;
|
157
|
+
for (const auto &jj : attrs) {
|
158
|
+
ErrorAttribute attr = getAttribute(jj.asString());
|
159
|
+
if (attr != INVALID_ATTRIBUTE) {
|
160
|
+
error.attributes.insert(attr);
|
164
161
|
}
|
165
|
-
error.attributes.insert(attr);
|
166
162
|
}
|
167
163
|
if (error.hasAttribute(AUTO_RETRY)) {
|
168
164
|
const Json::Value &retryJson = errorJson["retry"];
|
package/deps/lcb/src/errmap.h
CHANGED
@@ -124,7 +124,11 @@ enum ErrorAttribute {
|
|
124
124
|
* This attribute means that the error is related to operating on \
|
125
125
|
* a soft-deleted document. \
|
126
126
|
*/ \
|
127
|
-
X(ITEM_DELETED, "item-deleted")
|
127
|
+
X(ITEM_DELETED, "item-deleted") \
|
128
|
+
/** \
|
129
|
+
* The error is related to rate limitation for the client (version 2) \
|
130
|
+
*/ \
|
131
|
+
X(ITEM_RATE_LIMIT, "rate-limit")
|
128
132
|
|
129
133
|
#define X(c, s) c,
|
130
134
|
LCB_XERRMAP_ATTRIBUTES(X)
|
@@ -221,7 +225,7 @@ struct Error {
|
|
221
225
|
uint16_t code;
|
222
226
|
std::string shortname;
|
223
227
|
std::string description;
|
224
|
-
std::set<
|
228
|
+
std::set<ErrorAttribute> attributes;
|
225
229
|
SpecWrapper retry;
|
226
230
|
|
227
231
|
Error() : code(-1) {}
|
@@ -280,7 +284,7 @@ class ErrorMap
|
|
280
284
|
private:
|
281
285
|
static const uint32_t MAX_VERSION;
|
282
286
|
ErrorMap(const ErrorMap &);
|
283
|
-
typedef std::map<
|
287
|
+
typedef std::map<uint16_t, Error> MapType;
|
284
288
|
MapType errors;
|
285
289
|
uint32_t revision{0};
|
286
290
|
uint32_t version{0};
|
package/deps/lcb/src/handler.cc
CHANGED
@@ -157,6 +157,13 @@ lcb_STATUS lcb_map_error(lcb_INSTANCE *instance, int in)
|
|
157
157
|
return LCB_ERR_DURABILITY_AMBIGUOUS;
|
158
158
|
case PROTOCOL_BINARY_RESPONSE_LOCKED:
|
159
159
|
return LCB_ERR_DOCUMENT_LOCKED;
|
160
|
+
case PROTOCOL_BINARY_RATE_LIMITED_NETWORK_INGRESS:
|
161
|
+
case PROTOCOL_BINARY_RATE_LIMITED_NETWORK_EGRESS:
|
162
|
+
case PROTOCOL_BINARY_RATE_LIMITED_MAX_CONNECTIONS:
|
163
|
+
case PROTOCOL_BINARY_RATE_LIMITED_MAX_COMMANDS:
|
164
|
+
return LCB_ERR_RATE_LIMITED;
|
165
|
+
case PROTOCOL_BINARY_SCOPE_SIZE_LIMIT_EXCEEDED:
|
166
|
+
return LCB_ERR_QUOTA_LIMITED;
|
160
167
|
default:
|
161
168
|
if (instance != nullptr) {
|
162
169
|
return instance->callbacks.errmap(instance, in);
|
@@ -269,20 +276,19 @@ void init_resp(lcb_INSTANCE *instance, mc_PIPELINE *pipeline, const MemcachedRes
|
|
269
276
|
resp->ctx.key.assign(key, key_len);
|
270
277
|
}
|
271
278
|
|
272
|
-
auto *server = static_cast<lcb::Server *>(pipeline);
|
279
|
+
const auto *server = static_cast<lcb::Server *>(pipeline);
|
273
280
|
const lcb_host_t *remote = server->curhost;
|
274
281
|
if (remote) {
|
275
|
-
|
282
|
+
resp->ctx.endpoint.reserve(sizeof(remote->host) + sizeof(remote->port) + 3);
|
276
283
|
if (remote->ipv6) {
|
277
|
-
|
284
|
+
resp->ctx.endpoint.append("[");
|
278
285
|
}
|
279
|
-
|
286
|
+
resp->ctx.endpoint.append(remote->host);
|
280
287
|
if (remote->ipv6) {
|
281
|
-
|
288
|
+
resp->ctx.endpoint.append("]");
|
282
289
|
}
|
283
|
-
|
284
|
-
|
285
|
-
resp->ctx.endpoint = ss.str();
|
290
|
+
resp->ctx.endpoint.append(":");
|
291
|
+
resp->ctx.endpoint.append(remote->port);
|
286
292
|
}
|
287
293
|
}
|
288
294
|
|
@@ -421,7 +427,7 @@ static void H_get(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse *
|
|
421
427
|
|
422
428
|
void *freeptr = nullptr;
|
423
429
|
maybe_decompress(o, response, &resp, &freeptr);
|
424
|
-
|
430
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
425
431
|
TRACE_GET_END(o, request, response, &resp);
|
426
432
|
record_kv_op_latency("get", o, request);
|
427
433
|
if (request->flags & MCREQ_F_REQEXT) {
|
@@ -455,7 +461,7 @@ static void H_exists(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedRespons
|
|
455
461
|
resp.seqno = lcb_ntohll(resp.seqno);
|
456
462
|
}
|
457
463
|
}
|
458
|
-
|
464
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
459
465
|
TRACE_EXISTS_END(root, request, response, &resp);
|
460
466
|
record_kv_op_latency("exists", root, request);
|
461
467
|
invoke_callback(request, root, &resp, LCB_CALLBACK_EXISTS);
|
@@ -555,7 +561,7 @@ static void H_subdoc(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedRespons
|
|
555
561
|
handle_error_info(response, resp);
|
556
562
|
}
|
557
563
|
}
|
558
|
-
|
564
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
559
565
|
|
560
566
|
if (cbtype == LCB_CALLBACK_SDLOOKUP) {
|
561
567
|
record_kv_op_latency("lookup_in", o, request);
|
@@ -689,7 +695,7 @@ static void H_delete(mc_PIPELINE *pipeline, mc_PACKET *packet, MemcachedResponse
|
|
689
695
|
init_resp(root, pipeline, response, packet, immerr, &resp);
|
690
696
|
handle_error_info(response, resp);
|
691
697
|
handle_mutation_token(root, response, packet, &resp.mt);
|
692
|
-
|
698
|
+
lcb::trace::finish_kv_span(pipeline, packet, response);
|
693
699
|
TRACE_REMOVE_END(root, packet, response, &resp);
|
694
700
|
record_kv_op_latency("remove", root, packet);
|
695
701
|
invoke_callback(packet, root, &resp, LCB_CALLBACK_REMOVE);
|
@@ -797,7 +803,7 @@ static void H_observe_seqno(mc_PIPELINE *pipeline, mc_PACKET *request, Memcached
|
|
797
803
|
/* Get the server for this command. Note that since this is a successful
|
798
804
|
* operation, the server is never a dummy */
|
799
805
|
}
|
800
|
-
|
806
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
801
807
|
invoke_callback(request, root, &resp, LCB_CALLBACK_OBSEQNO);
|
802
808
|
}
|
803
809
|
|
@@ -829,7 +835,7 @@ static void H_store(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse
|
|
829
835
|
resp.rflags |= LCB_RESP_F_EXTDATA | LCB_RESP_F_FINAL;
|
830
836
|
handle_mutation_token(root, response, request, &resp.mt);
|
831
837
|
TRACE_STORE_END(root, request, response, &resp);
|
832
|
-
|
838
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
833
839
|
record_kv_op_latency_store(root, request, &resp);
|
834
840
|
if (request->flags & MCREQ_F_REQEXT) {
|
835
841
|
request->u_rdata.exdata->procs->handler(pipeline, request, LCB_CALLBACK_STORE, immerr, &resp);
|
@@ -854,7 +860,7 @@ static void H_arithmetic(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedRes
|
|
854
860
|
}
|
855
861
|
resp.rflags |= LCB_RESP_F_FINAL;
|
856
862
|
resp.ctx.cas = response->cas();
|
857
|
-
|
863
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
858
864
|
TRACE_ARITHMETIC_END(root, request, response, &resp);
|
859
865
|
record_kv_op_latency("arithmetic", root, request);
|
860
866
|
invoke_callback(request, root, &resp, LCB_CALLBACK_COUNTER);
|
@@ -941,7 +947,7 @@ static void H_noop(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse
|
|
941
947
|
{
|
942
948
|
lcb_INSTANCE *root = get_instance(pipeline);
|
943
949
|
lcb_RESPNOOP resp{};
|
944
|
-
mc_REQDATAEX *exdata = request->u_rdata.exdata;
|
950
|
+
const mc_REQDATAEX *exdata = request->u_rdata.exdata;
|
945
951
|
|
946
952
|
make_error(root, &resp, response, immerr, request);
|
947
953
|
|
@@ -955,7 +961,7 @@ static void H_touch(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedResponse
|
|
955
961
|
init_resp(root, pipeline, response, request, immerr, &resp);
|
956
962
|
handle_error_info(response, resp);
|
957
963
|
resp.rflags |= LCB_RESP_F_FINAL;
|
958
|
-
|
964
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
959
965
|
TRACE_TOUCH_END(root, request, response, &resp);
|
960
966
|
record_kv_op_latency("touch", root, request);
|
961
967
|
invoke_callback(request, root, &resp, LCB_CALLBACK_TOUCH);
|
@@ -968,7 +974,7 @@ static void H_unlock(mc_PIPELINE *pipeline, mc_PACKET *request, MemcachedRespons
|
|
968
974
|
init_resp(root, pipeline, response, request, immerr, &resp);
|
969
975
|
handle_error_info(response, resp);
|
970
976
|
resp.rflags |= LCB_RESP_F_FINAL;
|
971
|
-
|
977
|
+
lcb::trace::finish_kv_span(pipeline, request, response);
|
972
978
|
TRACE_UNLOCK_END(root, request, response, &resp);
|
973
979
|
record_kv_op_latency("unlock", root, request);
|
974
980
|
invoke_callback(request, root, &resp, LCB_CALLBACK_UNLOCK);
|
@@ -136,8 +136,10 @@ void lcbio_ctx_close_ex(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb cb, void *arg, lcbio_C
|
|
136
136
|
}
|
137
137
|
|
138
138
|
oldrc = ctx->sock->refcount;
|
139
|
-
|
140
|
-
|
139
|
+
|
140
|
+
lcb_log(LOGARGS(ctx, DEBUG),
|
141
|
+
CTX_LOGFMT "Destroying context for SOCK=%016" PRIx64 ". Pending Writes=%d, Entered=%s, Socket Refcount=%d",
|
142
|
+
CTX_LOGID(ctx), ctx->sock->id, (int)ctx->npending, (int)ctx->entered ? "true" : "false", oldrc);
|
141
143
|
|
142
144
|
if (cb) {
|
143
145
|
int reusable = ctx->npending == 0 && /* no pending events */
|
@@ -341,6 +341,11 @@ static bool is_fastpath_error(uint16_t rc)
|
|
341
341
|
case PROTOCOL_BINARY_RESPONSE_SYNC_WRITE_IN_PROGRESS:
|
342
342
|
case PROTOCOL_BINARY_RESPONSE_SYNC_WRITE_AMBIGUOUS:
|
343
343
|
case PROTOCOL_BINARY_RESPONSE_LOCKED:
|
344
|
+
case PROTOCOL_BINARY_RATE_LIMITED_NETWORK_INGRESS:
|
345
|
+
case PROTOCOL_BINARY_RATE_LIMITED_NETWORK_EGRESS:
|
346
|
+
case PROTOCOL_BINARY_RATE_LIMITED_MAX_CONNECTIONS:
|
347
|
+
case PROTOCOL_BINARY_RATE_LIMITED_MAX_COMMANDS:
|
348
|
+
case PROTOCOL_BINARY_SCOPE_SIZE_LIMIT_EXCEEDED:
|
344
349
|
return true;
|
345
350
|
default:
|
346
351
|
if (rc >= 0xc0 && rc <= 0xcc) {
|
@@ -395,10 +400,6 @@ int Server::handle_unknown_error(const mc_PACKET *request, const MemcachedRespon
|
|
395
400
|
newerr = LCB_ERR_TEMPORARY_FAILURE;
|
396
401
|
}
|
397
402
|
|
398
|
-
if (err.hasAttribute(errmap::CONSTRAINT_FAILURE)) {
|
399
|
-
newerr = LCB_ERR_CAS_MISMATCH;
|
400
|
-
}
|
401
|
-
|
402
403
|
if (err.hasAttribute(errmap::AUTH)) {
|
403
404
|
newerr = LCB_ERR_AUTHENTICATION_FAILURE;
|
404
405
|
}
|
@@ -754,6 +755,8 @@ static const char *opcode_name(uint8_t code)
|
|
754
755
|
return "subdoc_get_count";
|
755
756
|
case PROTOCOL_BINARY_CMD_GET_ERROR_MAP:
|
756
757
|
return "get_error_map";
|
758
|
+
case PROTOCOL_BINARY_CMD_GET_META:
|
759
|
+
return "exists";
|
757
760
|
default:
|
758
761
|
return "unknown";
|
759
762
|
}
|
@@ -816,7 +819,7 @@ void Server::purge_single(mc_PACKET *pkt, lcb_STATUS err)
|
|
816
819
|
std::string msg(Json::FastWriter().write(info));
|
817
820
|
if (msg.size() > 1) {
|
818
821
|
lcb_log(LOGARGS(instance, WARN), "Failing command with error %s: %.*s", lcb_strerror_short(err),
|
819
|
-
(int)
|
822
|
+
(int)msg.size(), msg.c_str());
|
820
823
|
}
|
821
824
|
} else {
|
822
825
|
lcb_log(LOGARGS_T(WARN), LOGFMT "Failing command (pkt=%p, opaque=%lu, opcode=0x%x) with error %s", LOGID_T(),
|