libcouchbase 0.2.0 → 0.3.1
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.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.md +1 -1
- data/ext/libcouchbase/CMakeLists.txt +8 -6
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +0 -86
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +0 -11
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +0 -2
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +1 -2
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +0 -2
- data/ext/libcouchbase/cmake/defs.mk.in +2 -0
- data/ext/libcouchbase/cmake/source_files.cmake +5 -21
- data/ext/libcouchbase/include/libcouchbase/auth.h +0 -10
- data/ext/libcouchbase/include/libcouchbase/cntl.h +1 -27
- data/ext/libcouchbase/include/libcouchbase/error.h +1 -15
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +1 -13
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +0 -9
- data/ext/libcouchbase/include/libcouchbase/views.h +1 -7
- data/ext/libcouchbase/include/libcouchbase/visibility.h +0 -1
- data/ext/libcouchbase/include/memcached/protocol_binary.h +1131 -29
- data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +2 -3
- data/ext/libcouchbase/src/README.md +2 -0
- data/ext/libcouchbase/src/auth-priv.h +0 -1
- data/ext/libcouchbase/src/auth.cc +4 -10
- data/ext/libcouchbase/src/bootstrap.c +269 -0
- data/ext/libcouchbase/src/bootstrap.h +39 -50
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +117 -84
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +25 -50
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +386 -407
- data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
- data/ext/libcouchbase/src/cbft.cc +27 -22
- data/ext/libcouchbase/src/cntl.cc +19 -30
- data/ext/libcouchbase/src/connspec.cc +1 -48
- data/ext/libcouchbase/src/connspec.h +0 -27
- data/ext/libcouchbase/src/dump.cc +2 -2
- data/ext/libcouchbase/src/getconfig.cc +33 -7
- data/ext/libcouchbase/src/handler.cc +2 -0
- data/ext/libcouchbase/src/hostlist.cc +36 -0
- data/ext/libcouchbase/src/hostlist.h +62 -41
- data/ext/libcouchbase/src/http/http-priv.h +112 -125
- data/ext/libcouchbase/src/http/http.cc +30 -15
- data/ext/libcouchbase/src/http/http.h +34 -1
- data/ext/libcouchbase/src/http/http_io.cc +26 -22
- data/ext/libcouchbase/src/instance.cc +23 -94
- data/ext/libcouchbase/src/internal.h +26 -52
- data/ext/libcouchbase/src/jsparse/parser.cc +202 -146
- data/ext/libcouchbase/src/jsparse/parser.h +98 -91
- data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +163 -174
- data/ext/libcouchbase/src/lcbio/connect.c +557 -0
- data/ext/libcouchbase/src/lcbio/connect.h +2 -9
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +16 -61
- data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
- data/ext/libcouchbase/src/lcbio/manager.c +2 -2
- data/ext/libcouchbase/src/mc/mcreq.h +2 -9
- data/ext/libcouchbase/src/mcserver/mcserver.cc +34 -143
- data/ext/libcouchbase/src/mcserver/mcserver.h +12 -7
- data/ext/libcouchbase/src/mcserver/negotiate.cc +38 -132
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
- data/ext/libcouchbase/src/n1ql/n1ql.cc +32 -56
- data/ext/libcouchbase/src/newconfig.cc +6 -6
- data/ext/libcouchbase/src/nodeinfo.cc +2 -2
- data/ext/libcouchbase/src/operations/{cbflush.cc → cbflush.c} +15 -7
- data/ext/libcouchbase/src/operations/{counter.cc → counter.c} +0 -0
- data/ext/libcouchbase/src/operations/durability.cc +26 -6
- data/ext/libcouchbase/src/operations/durability_internal.h +3 -6
- data/ext/libcouchbase/src/operations/{get.cc → get.c} +26 -24
- data/ext/libcouchbase/src/operations/{observe.cc → observe.c} +93 -68
- data/ext/libcouchbase/src/operations/{pktfwd.cc → pktfwd.c} +0 -0
- data/ext/libcouchbase/src/operations/{remove.cc → remove.c} +0 -0
- data/ext/libcouchbase/src/operations/stats.cc +8 -3
- data/ext/libcouchbase/src/operations/{store.cc → store.c} +32 -27
- data/ext/libcouchbase/src/operations/subdoc.cc +18 -38
- data/ext/libcouchbase/src/operations/{touch.cc → touch.c} +0 -0
- data/ext/libcouchbase/src/packetutils.c +37 -0
- data/ext/libcouchbase/src/packetutils.h +2 -2
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/{retrychk.cc → retrychk.c} +3 -2
- data/ext/libcouchbase/src/retryq.cc +4 -4
- data/ext/libcouchbase/src/settings.c +0 -3
- data/ext/libcouchbase/src/settings.h +0 -5
- data/ext/libcouchbase/src/simplestring.c +211 -0
- data/ext/libcouchbase/src/simplestring.h +228 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +0 -1
- data/ext/libcouchbase/src/ssl/ssl_common.c +0 -2
- data/ext/libcouchbase/src/ssl/ssl_e.c +1 -0
- data/ext/libcouchbase/src/ssobuf.h +82 -0
- data/ext/libcouchbase/src/trace.h +4 -4
- data/ext/libcouchbase/src/vbucket/vbucket.c +1 -0
- data/ext/libcouchbase/src/views/{docreq.cc → docreq.c} +54 -48
- data/ext/libcouchbase/src/views/docreq.h +30 -24
- data/ext/libcouchbase/src/views/viewreq.c +358 -0
- data/ext/libcouchbase/src/views/viewreq.h +13 -43
- data/ext/libcouchbase/tests/basic/t_connstr.cc +50 -89
- data/ext/libcouchbase/tests/basic/t_host.cc +75 -67
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +78 -27
- data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +78 -58
- data/ext/libcouchbase/tests/iotests/mock-environment.h +1 -2
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +114 -96
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
- data/lib/libcouchbase/ext/tasks.rb +6 -2
- data/lib/libcouchbase/query_view.rb +1 -1
- data/lib/libcouchbase/results_fiber.rb +6 -6
- data/lib/libcouchbase/version.rb +1 -1
- metadata +26 -26
- data/ext/libcouchbase/src/bootstrap.cc +0 -216
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +0 -281
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +0 -528
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +0 -115
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +0 -378
- data/ext/libcouchbase/src/dns-srv.cc +0 -142
- data/ext/libcouchbase/src/errmap.cc +0 -107
- data/ext/libcouchbase/src/errmap.h +0 -113
- data/ext/libcouchbase/src/lcbht/lcbht.cc +0 -177
- data/ext/libcouchbase/src/lcbio/connect.cc +0 -562
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +0 -87
- data/ext/libcouchbase/src/mctx-helper.h +0 -51
- data/ext/libcouchbase/src/views/viewreq.cc +0 -318
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +0 -97
|
@@ -221,7 +221,7 @@ iterwipe_cb(mc_CMDQUEUE *cq, mc_PIPELINE *oldpl, mc_PACKET *oldpkt, void *)
|
|
|
221
221
|
return MCREQ_KEEP_PACKET;
|
|
222
222
|
}
|
|
223
223
|
|
|
224
|
-
lcb_log(LOGARGS((lcb_t)cq->cqdata, DEBUG), "Remapped packet %p (SEQ=%u) from "
|
|
224
|
+
lcb_log(LOGARGS((lcb_t)cq->cqdata, DEBUG), "Remapped packet %p (SEQ=%u) from "SERVER_FMT " to " SERVER_FMT,
|
|
225
225
|
(void*)oldpkt, oldpkt->opaque, SERVER_ARGS((lcb::Server*)oldpl), SERVER_ARGS((lcb::Server*)newpl));
|
|
226
226
|
|
|
227
227
|
/** Otherwise, copy over the packet and find the new vBucket to map to */
|
|
@@ -256,7 +256,7 @@ replace_config(lcb_t instance, lcbvb_CONFIG *oldconfig, lcbvb_CONFIG *newconfig)
|
|
|
256
256
|
cur->set_new_index(newix);
|
|
257
257
|
ppnew[newix] = cur;
|
|
258
258
|
ppold[ii] = NULL;
|
|
259
|
-
lcb_log(LOGARGS(instance, INFO), "Reusing server "
|
|
259
|
+
lcb_log(LOGARGS(instance, INFO), "Reusing server "SERVER_FMT". OldIndex=%d. NewIndex=%d", SERVER_ARGS(cur), ii, newix);
|
|
260
260
|
}
|
|
261
261
|
}
|
|
262
262
|
|
|
@@ -305,14 +305,14 @@ replace_config(lcb_t instance, lcbvb_CONFIG *oldconfig, lcbvb_CONFIG *newconfig)
|
|
|
305
305
|
free(ppold);
|
|
306
306
|
}
|
|
307
307
|
|
|
308
|
-
void lcb_update_vbconfig(lcb_t instance,
|
|
308
|
+
void lcb_update_vbconfig(lcb_t instance, clconfig_info *config)
|
|
309
309
|
{
|
|
310
310
|
lcb_configuration_t change_status;
|
|
311
|
-
|
|
311
|
+
clconfig_info *old_config = instance->cur_configinfo;
|
|
312
312
|
mc_CMDQUEUE *q = &instance->cmdq;
|
|
313
313
|
|
|
314
314
|
instance->cur_configinfo = config;
|
|
315
|
-
config
|
|
315
|
+
lcb_clconfig_incref(config);
|
|
316
316
|
q->config = instance->cur_configinfo->vbc;
|
|
317
317
|
q->cqdata = instance;
|
|
318
318
|
|
|
@@ -328,7 +328,7 @@ void lcb_update_vbconfig(lcb_t instance, lcb_pCONFIGINFO config)
|
|
|
328
328
|
lcb_vbguess_newconfig(instance, config->vbc, instance->vbguess);
|
|
329
329
|
|
|
330
330
|
replace_config(instance, old_config->vbc, config->vbc);
|
|
331
|
-
old_config
|
|
331
|
+
lcb_clconfig_decref(old_config);
|
|
332
332
|
change_status = LCB_CONFIGURATION_CHANGED;
|
|
333
333
|
} else {
|
|
334
334
|
size_t nservers = VB_NSERVERS(config->vbc);
|
|
@@ -70,7 +70,7 @@ lcb_get_node(lcb_t instance, lcb_GETNODETYPE type, unsigned ix)
|
|
|
70
70
|
|
|
71
71
|
if (type & LCB_NODE_HTCONFIG) {
|
|
72
72
|
if (type & LCB_NODE_CONNECTED) {
|
|
73
|
-
const lcb_host_t *host =
|
|
73
|
+
const lcb_host_t *host = lcb_confmon_get_rest_host(instance->confmon);
|
|
74
74
|
if (host) {
|
|
75
75
|
return mk_scratch_host(instance, host);
|
|
76
76
|
} else {
|
|
@@ -167,7 +167,7 @@ lcb_int32_t lcb_get_num_nodes(lcb_t instance)
|
|
|
167
167
|
LIBCOUCHBASE_API
|
|
168
168
|
const char *const *lcb_get_server_list(lcb_t instance)
|
|
169
169
|
{
|
|
170
|
-
return instance->ht_nodes
|
|
170
|
+
return hostlist_strents(instance->ht_nodes);
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
LIBCOUCHBASE_API
|
|
@@ -15,10 +15,11 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
#include "internal.h"
|
|
18
|
+
#include "simplestring.h"
|
|
18
19
|
#include <http/http.h>
|
|
19
20
|
|
|
20
21
|
static void
|
|
21
|
-
flush_cb(lcb_t instance, int, const lcb_RESPBASE *rb)
|
|
22
|
+
flush_cb(lcb_t instance, int cbtype, const lcb_RESPBASE *rb)
|
|
22
23
|
{
|
|
23
24
|
const lcb_RESPHTTP *resp = (const lcb_RESPHTTP *)rb;
|
|
24
25
|
lcb_RESPCBFLUSH fresp = { 0 };
|
|
@@ -34,30 +35,37 @@ flush_cb(lcb_t instance, int, const lcb_RESPBASE *rb)
|
|
|
34
35
|
if (callback) {
|
|
35
36
|
callback(instance, LCB_CALLBACK_CBFLUSH, (lcb_RESPBASE*)&fresp);
|
|
36
37
|
}
|
|
38
|
+
(void)cbtype;
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
LIBCOUCHBASE_API
|
|
40
42
|
lcb_error_t
|
|
41
|
-
lcb_cbflush3(lcb_t instance, const void *cookie, const lcb_CMDBASE *)
|
|
43
|
+
lcb_cbflush3(lcb_t instance, const void *cookie, const lcb_CMDBASE *cmd)
|
|
42
44
|
{
|
|
43
45
|
lcb_http_request_t htr;
|
|
44
46
|
lcb_CMDHTTP htcmd = { 0 };
|
|
47
|
+
lcb_string urlpath;
|
|
45
48
|
lcb_error_t rc;
|
|
46
49
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
urlpath
|
|
50
|
+
(void)cmd;
|
|
51
|
+
|
|
52
|
+
lcb_string_init(&urlpath);
|
|
53
|
+
lcb_string_appendz(&urlpath, "/pools/default/buckets/");
|
|
54
|
+
lcb_string_appendz(&urlpath, LCBT_SETTING(instance, bucket));
|
|
55
|
+
lcb_string_appendz(&urlpath, "/controller/doFlush");
|
|
56
|
+
|
|
50
57
|
|
|
51
58
|
htcmd.type = LCB_HTTP_TYPE_MANAGEMENT;
|
|
52
59
|
htcmd.method = LCB_HTTP_METHOD_POST;
|
|
53
60
|
htcmd.reqhandle = &htr;
|
|
54
|
-
LCB_CMD_SET_KEY(&htcmd, urlpath.
|
|
61
|
+
LCB_CMD_SET_KEY(&htcmd, urlpath.base, urlpath.nused);
|
|
55
62
|
|
|
56
63
|
rc = lcb_http3(instance, cookie, &htcmd);
|
|
64
|
+
lcb_string_release(&urlpath);
|
|
57
65
|
|
|
58
66
|
if (rc != LCB_SUCCESS) {
|
|
59
67
|
return rc;
|
|
60
68
|
}
|
|
61
|
-
htr
|
|
69
|
+
lcb_htreq_setcb(htr, flush_cb);
|
|
62
70
|
return LCB_SUCCESS;
|
|
63
71
|
}
|
|
File without changes
|
|
@@ -323,7 +323,16 @@ lcb_durability_validate(lcb_t instance,
|
|
|
323
323
|
|
|
324
324
|
}
|
|
325
325
|
|
|
326
|
-
lcb_error_t
|
|
326
|
+
static lcb_error_t
|
|
327
|
+
dset_ctx_add(lcb_MULTICMD_CTX *mctx, const lcb_CMDBASE *cmd)
|
|
328
|
+
{
|
|
329
|
+
return static_cast<Durset*>(mctx)->mctx_add(cmd);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
lcb_error_t
|
|
333
|
+
Durset::mctx_add(const lcb_CMDBASE *cmd)
|
|
334
|
+
{
|
|
335
|
+
|
|
327
336
|
if (LCB_KEYBUF_IS_EMPTY(&cmd->key)) {
|
|
328
337
|
return LCB_EMPTY_KEY;
|
|
329
338
|
}
|
|
@@ -348,8 +357,14 @@ lcb_error_t Durset::MCTX_addcmd(const lcb_CMDBASE *cmd) {
|
|
|
348
357
|
return after_add(ent, reinterpret_cast<const lcb_CMDENDURE*>(cmd));
|
|
349
358
|
}
|
|
350
359
|
|
|
360
|
+
static lcb_error_t
|
|
361
|
+
dset_ctx_schedule(lcb_MULTICMD_CTX *mctx, const void *cookie)
|
|
362
|
+
{
|
|
363
|
+
return static_cast<Durset*>(mctx)->mctx_schedule(cookie);
|
|
364
|
+
}
|
|
365
|
+
|
|
351
366
|
lcb_error_t
|
|
352
|
-
Durset::
|
|
367
|
+
Durset::mctx_schedule(const void *cookie_) {
|
|
353
368
|
lcb_error_t err;
|
|
354
369
|
const char *kptr = kvbufs.c_str();
|
|
355
370
|
|
|
@@ -380,8 +395,10 @@ Durset::MCTX_done(const void *cookie_) {
|
|
|
380
395
|
return LCB_SUCCESS;
|
|
381
396
|
}
|
|
382
397
|
|
|
383
|
-
void
|
|
384
|
-
|
|
398
|
+
static void
|
|
399
|
+
dset_ctx_fail(lcb_MULTICMD_CTX *mctx)
|
|
400
|
+
{
|
|
401
|
+
delete static_cast<Durset*>(mctx);
|
|
385
402
|
}
|
|
386
403
|
|
|
387
404
|
void lcbdurctx_set_durstore(lcb_MULTICMD_CTX *mctx, int enabled)
|
|
@@ -419,11 +436,14 @@ get_poll_meth(lcb_t instance, const lcb_durability_opts_t *options)
|
|
|
419
436
|
}
|
|
420
437
|
|
|
421
438
|
Durset::Durset(lcb_t instance_, const lcb_durability_opts_t *options)
|
|
422
|
-
:
|
|
423
|
-
nremaining(0), waiting(0), refcnt(0), next_state(STATE_OBSPOLL),
|
|
439
|
+
: nremaining(0), waiting(0), refcnt(0), next_state(STATE_OBSPOLL),
|
|
424
440
|
lasterr(LCB_SUCCESS), is_durstore(false), cookie(NULL),
|
|
425
441
|
ns_timeout(0), timer(NULL), instance(instance_)
|
|
426
442
|
{
|
|
443
|
+
lcb_MULTICMD_CTX::addcmd = dset_ctx_add;
|
|
444
|
+
lcb_MULTICMD_CTX::done = dset_ctx_schedule;
|
|
445
|
+
lcb_MULTICMD_CTX::fail = dset_ctx_fail;
|
|
446
|
+
|
|
427
447
|
const lcb_DURABILITYOPTSv0 *opts_in = &options->v.v0;
|
|
428
448
|
|
|
429
449
|
std::memset(&opts, 0, sizeof opts);
|
|
@@ -19,8 +19,6 @@
|
|
|
19
19
|
#define LCB_DURABILITY_INTERNAL_H
|
|
20
20
|
|
|
21
21
|
#ifdef __cplusplus
|
|
22
|
-
#include "mctx-helper.h"
|
|
23
|
-
|
|
24
22
|
extern "C" {
|
|
25
23
|
#endif
|
|
26
24
|
|
|
@@ -193,7 +191,7 @@ struct Item : public CallbackCookie {
|
|
|
193
191
|
* A collection encompassing one or more entries which are to be checked for
|
|
194
192
|
* persistence
|
|
195
193
|
*/
|
|
196
|
-
struct Durset : public
|
|
194
|
+
struct Durset : public lcb_MULTICMD_CTX {
|
|
197
195
|
/**
|
|
198
196
|
* Call this when the polling method (poll_impl()) has completed. This will
|
|
199
197
|
* trigger a new poll after the interval.
|
|
@@ -250,9 +248,8 @@ struct Durset : public MultiCmdContext {
|
|
|
250
248
|
Durset(lcb_t instance, const lcb_durability_opts_t* options);
|
|
251
249
|
|
|
252
250
|
// Implementation for MULTICMD_CTX
|
|
253
|
-
lcb_error_t
|
|
254
|
-
lcb_error_t
|
|
255
|
-
void MCTX_fail();
|
|
251
|
+
inline lcb_error_t mctx_schedule(const void *cookie);
|
|
252
|
+
inline lcb_error_t mctx_add(const lcb_CMDBASE *cmd);
|
|
256
253
|
|
|
257
254
|
/**
|
|
258
255
|
* This function calls poll_impl(). The implementation should then call
|
|
@@ -181,31 +181,28 @@ lcb_unlock(lcb_t instance, const void *cookie, lcb_size_t num,
|
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
struct
|
|
185
|
-
|
|
186
|
-
void decref() {
|
|
187
|
-
if (!--remaining) {
|
|
188
|
-
delete this;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
184
|
+
typedef struct {
|
|
185
|
+
mc_REQDATAEX base;
|
|
192
186
|
unsigned r_cur;
|
|
193
187
|
unsigned r_max;
|
|
194
188
|
int remaining;
|
|
195
189
|
int vbucket;
|
|
196
190
|
lcb_replica_t strategy;
|
|
197
191
|
lcb_t instance;
|
|
198
|
-
};
|
|
192
|
+
} rget_cookie;
|
|
199
193
|
|
|
200
194
|
static void rget_dtor(mc_PACKET *pkt) {
|
|
201
|
-
|
|
195
|
+
rget_cookie *rck = (rget_cookie *)pkt->u_rdata.exdata;
|
|
196
|
+
if (! --rck->remaining) {
|
|
197
|
+
free(rck);
|
|
198
|
+
}
|
|
202
199
|
}
|
|
203
200
|
|
|
204
201
|
static void
|
|
205
|
-
rget_callback(mc_PIPELINE
|
|
202
|
+
rget_callback(mc_PIPELINE *pl, mc_PACKET *pkt, lcb_error_t err, const void *arg)
|
|
206
203
|
{
|
|
207
|
-
|
|
208
|
-
lcb_RESPGET *resp =
|
|
204
|
+
rget_cookie *rck = (rget_cookie *)pkt->u_rdata.exdata;
|
|
205
|
+
lcb_RESPGET *resp = (void *)arg;
|
|
209
206
|
lcb_RESPCALLBACK callback;
|
|
210
207
|
lcb_t instance = rck->instance;
|
|
211
208
|
|
|
@@ -250,7 +247,11 @@ rget_callback(mc_PIPELINE *, mc_PACKET *pkt, lcb_error_t err, const void *arg)
|
|
|
250
247
|
rck->remaining = 2;
|
|
251
248
|
}
|
|
252
249
|
}
|
|
253
|
-
|
|
250
|
+
|
|
251
|
+
if (!--rck->remaining) {
|
|
252
|
+
free(rck);
|
|
253
|
+
}
|
|
254
|
+
(void)pl;
|
|
254
255
|
}
|
|
255
256
|
|
|
256
257
|
static mc_REQDATAPROCS rget_procs = {
|
|
@@ -258,13 +259,6 @@ static mc_REQDATAPROCS rget_procs = {
|
|
|
258
259
|
rget_dtor
|
|
259
260
|
};
|
|
260
261
|
|
|
261
|
-
RGetCookie::RGetCookie(const void *cookie_, lcb_t instance_,
|
|
262
|
-
lcb_replica_t strategy_, int vbucket_)
|
|
263
|
-
: mc_REQDATAEX(cookie_, rget_procs, gethrtime()),
|
|
264
|
-
r_cur(0), r_max(LCBT_NREPLICAS(instance_)), remaining(0),
|
|
265
|
-
vbucket(vbucket_), strategy(strategy_), instance(instance_) {
|
|
266
|
-
}
|
|
267
|
-
|
|
268
262
|
LIBCOUCHBASE_API
|
|
269
263
|
lcb_error_t
|
|
270
264
|
lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
@@ -277,6 +271,7 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
277
271
|
int vbid, ixtmp;
|
|
278
272
|
protocol_binary_request_header req;
|
|
279
273
|
unsigned r0, r1 = 0;
|
|
274
|
+
rget_cookie *rck = NULL;
|
|
280
275
|
|
|
281
276
|
if (LCB_KEYBUF_IS_EMPTY(&cmd->key)) {
|
|
282
277
|
return LCB_EMPTY_KEY;
|
|
@@ -328,7 +323,15 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
328
323
|
}
|
|
329
324
|
|
|
330
325
|
/* Initialize the cookie */
|
|
331
|
-
|
|
326
|
+
rck = calloc(1, sizeof(*rck));
|
|
327
|
+
rck->base.cookie = cookie;
|
|
328
|
+
rck->base.start = gethrtime();
|
|
329
|
+
rck->base.procs = &rget_procs;
|
|
330
|
+
rck->strategy = cmd->strategy;
|
|
331
|
+
rck->r_cur = r0;
|
|
332
|
+
rck->r_max = LCBT_NREPLICAS(instance);
|
|
333
|
+
rck->instance = instance;
|
|
334
|
+
rck->vbucket = vbid;
|
|
332
335
|
|
|
333
336
|
/* Initialize the packet */
|
|
334
337
|
req.request.magic = PROTOCOL_BINARY_REQ;
|
|
@@ -340,7 +343,6 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
340
343
|
req.request.keylen = htons((lcb_uint16_t)cmd->key.contig.nbytes);
|
|
341
344
|
req.request.bodylen = htonl((lcb_uint32_t)cmd->key.contig.nbytes);
|
|
342
345
|
|
|
343
|
-
rck->r_cur = r0;
|
|
344
346
|
do {
|
|
345
347
|
int curix;
|
|
346
348
|
mc_PIPELINE *pl;
|
|
@@ -357,7 +359,7 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
357
359
|
return LCB_CLIENT_ENOMEM;
|
|
358
360
|
}
|
|
359
361
|
|
|
360
|
-
pkt->u_rdata.exdata = rck;
|
|
362
|
+
pkt->u_rdata.exdata = &rck->base;
|
|
361
363
|
pkt->flags |= MCREQ_F_REQEXT;
|
|
362
364
|
|
|
363
365
|
mcreq_reserve_key(pl, pkt, sizeof(req.bytes), &cmd->key);
|
|
@@ -16,28 +16,23 @@
|
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
18
|
#include "internal.h"
|
|
19
|
+
#include "simplestring.h"
|
|
19
20
|
#include "durability_internal.h"
|
|
20
21
|
#include "trace.h"
|
|
21
|
-
#include "mctx-helper.h"
|
|
22
|
-
|
|
23
|
-
struct ObserveCtx : mc_REQDATAEX, lcb::MultiCmdContext {
|
|
24
|
-
void clear_requests() { requests.clear(); }
|
|
25
|
-
ObserveCtx(lcb_t instance_);
|
|
26
|
-
|
|
27
|
-
// Overrides
|
|
28
|
-
lcb_error_t MCTX_addcmd(const lcb_CMDBASE*);
|
|
29
|
-
lcb_error_t MCTX_done(const void *);
|
|
30
|
-
void MCTX_fail();
|
|
31
22
|
|
|
23
|
+
typedef struct {
|
|
24
|
+
mc_REQDATAEX base;
|
|
25
|
+
lcb_MULTICMD_CTX mctx;
|
|
32
26
|
lcb_t instance;
|
|
27
|
+
|
|
33
28
|
size_t remaining;
|
|
34
29
|
unsigned oflags;
|
|
35
30
|
|
|
36
|
-
typedef std::vector<uint8_t> ServerBuf;
|
|
37
31
|
/* requests array contains one buffer per server. nrequest essentially
|
|
38
32
|
* says how many elements (and thus how many servers) */
|
|
39
|
-
|
|
40
|
-
|
|
33
|
+
size_t nrequests;
|
|
34
|
+
lcb_string requests[1];
|
|
35
|
+
} OBSERVECTX;
|
|
41
36
|
|
|
42
37
|
typedef enum {
|
|
43
38
|
F_DURABILITY = 0x01,
|
|
@@ -45,20 +40,12 @@ typedef enum {
|
|
|
45
40
|
F_SCHEDFAILED = 0x04
|
|
46
41
|
} obs_flags;
|
|
47
42
|
|
|
48
|
-
// TODO: Move this to a common file
|
|
49
|
-
template <typename ContainerType, typename ValueType>
|
|
50
|
-
void add_to_buf(ContainerType& c, ValueType v) {
|
|
51
|
-
typename ContainerType::value_type *p =
|
|
52
|
-
reinterpret_cast<typename ContainerType::value_type*>(&v);
|
|
53
|
-
c.insert(c.end(), p, p + sizeof(ValueType));
|
|
54
|
-
}
|
|
55
|
-
|
|
56
43
|
static void
|
|
57
44
|
handle_observe_callback(mc_PIPELINE *pl,
|
|
58
45
|
mc_PACKET *pkt, lcb_error_t err, const void *arg)
|
|
59
46
|
{
|
|
60
|
-
|
|
61
|
-
lcb_RESPOBSERVE *resp =
|
|
47
|
+
OBSERVECTX *oc = (void *)pkt->u_rdata.exdata;
|
|
48
|
+
lcb_RESPOBSERVE *resp = (void *)arg;
|
|
62
49
|
lcb_t instance = oc->instance;
|
|
63
50
|
|
|
64
51
|
(void)pl;
|
|
@@ -81,7 +68,7 @@ handle_observe_callback(mc_PIPELINE *pl,
|
|
|
81
68
|
memset(&cur, 0, sizeof(cur));
|
|
82
69
|
cur.key = ptr;
|
|
83
70
|
cur.nkey = nkey;
|
|
84
|
-
cur.cookie = (void *)oc->cookie;
|
|
71
|
+
cur.cookie = (void *)oc->base.cookie;
|
|
85
72
|
cur.rc = err;
|
|
86
73
|
handle_observe_callback(NULL, pkt, err, &cur);
|
|
87
74
|
ptr += nkey;
|
|
@@ -91,7 +78,7 @@ handle_observe_callback(mc_PIPELINE *pl,
|
|
|
91
78
|
return;
|
|
92
79
|
}
|
|
93
80
|
|
|
94
|
-
resp->cookie = (void *)oc->cookie;
|
|
81
|
+
resp->cookie = (void *)oc->base.cookie;
|
|
95
82
|
resp->rc = err;
|
|
96
83
|
if (oc->oflags & F_DURABILITY) {
|
|
97
84
|
resp->ttp = pl ? pl->index : -1;
|
|
@@ -114,23 +101,36 @@ handle_observe_callback(mc_PIPELINE *pl,
|
|
|
114
101
|
resp2.rflags = LCB_RESP_F_CLIENTGEN|LCB_RESP_F_FINAL;
|
|
115
102
|
oc->oflags |= F_DESTROY;
|
|
116
103
|
handle_observe_callback(NULL, pkt, err, &resp2);
|
|
117
|
-
|
|
104
|
+
free(oc);
|
|
118
105
|
}
|
|
119
106
|
}
|
|
120
107
|
|
|
121
108
|
static void
|
|
122
109
|
handle_schedfail(mc_PACKET *pkt)
|
|
123
110
|
{
|
|
124
|
-
|
|
111
|
+
OBSERVECTX *oc = (void *)pkt->u_rdata.exdata;
|
|
125
112
|
oc->oflags |= F_SCHEDFAILED;
|
|
126
113
|
handle_observe_callback(NULL, pkt, LCB_SCHEDFAIL_INTERNAL, NULL);
|
|
127
114
|
}
|
|
128
115
|
|
|
129
|
-
|
|
116
|
+
static void destroy_requests(OBSERVECTX *reqs)
|
|
117
|
+
{
|
|
118
|
+
size_t ii;
|
|
119
|
+
for (ii = 0; ii < reqs->nrequests; ii++) {
|
|
120
|
+
lcb_string_release(reqs->requests + ii);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
#define CTX_FROM_MULTI(mcmd) (void *) ((((char *) (mcmd))) - offsetof(OBSERVECTX, mctx))
|
|
125
|
+
|
|
126
|
+
static lcb_error_t
|
|
127
|
+
obs_ctxadd(lcb_MULTICMD_CTX *mctx, const lcb_CMDBASE *cmdbase)
|
|
130
128
|
{
|
|
131
129
|
int vbid, srvix_dummy;
|
|
132
130
|
unsigned ii;
|
|
133
131
|
const lcb_CMDOBSERVE *cmd = (const lcb_CMDOBSERVE *)cmdbase;
|
|
132
|
+
OBSERVECTX *ctx = CTX_FROM_MULTI(mctx);
|
|
133
|
+
lcb_t instance = ctx->instance;
|
|
134
134
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
|
135
135
|
lcb_U16 servers_s[4];
|
|
136
136
|
const lcb_U16 *servers;
|
|
@@ -178,18 +178,23 @@ lcb_error_t ObserveCtx::MCTX_addcmd(const lcb_CMDBASE *cmdbase)
|
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
for (ii = 0; ii < nservers; ii++) {
|
|
181
|
+
lcb_string *rr;
|
|
182
|
+
lcb_U16 vb16, klen16;
|
|
181
183
|
lcb_U16 ix = servers[ii];
|
|
182
184
|
|
|
183
|
-
lcb_assert(ix <
|
|
185
|
+
lcb_assert(ix < ctx->nrequests);
|
|
186
|
+
rr = ctx->requests + ix;
|
|
187
|
+
if (0 != lcb_string_reserve(rr, 4 + cmd->key.contig.nbytes)) {
|
|
188
|
+
return LCB_CLIENT_ENOMEM;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
vb16 = htons((lcb_U16)vbid);
|
|
192
|
+
klen16 = htons((lcb_U16)cmd->key.contig.nbytes);
|
|
193
|
+
lcb_string_append(rr, &vb16, sizeof vb16);
|
|
194
|
+
lcb_string_append(rr, &klen16, sizeof klen16);
|
|
195
|
+
lcb_string_append(rr, cmd->key.contig.bytes, cmd->key.contig.nbytes);
|
|
184
196
|
|
|
185
|
-
|
|
186
|
-
add_to_buf(rr, uint16_t(htons(vbid)));
|
|
187
|
-
add_to_buf(rr, uint16_t(htons(cmd->key.contig.nbytes)));
|
|
188
|
-
rr.insert(rr.end(),
|
|
189
|
-
reinterpret_cast<const uint8_t*>(cmd->key.contig.bytes),
|
|
190
|
-
reinterpret_cast<const uint8_t*>(cmd->key.contig.bytes) +
|
|
191
|
-
cmd->key.contig.nbytes);
|
|
192
|
-
remaining++;
|
|
197
|
+
ctx->remaining++;
|
|
193
198
|
}
|
|
194
199
|
return LCB_SUCCESS;
|
|
195
200
|
}
|
|
@@ -199,19 +204,21 @@ static mc_REQDATAPROCS obs_procs = {
|
|
|
199
204
|
handle_schedfail
|
|
200
205
|
};
|
|
201
206
|
|
|
202
|
-
lcb_error_t
|
|
207
|
+
static lcb_error_t
|
|
208
|
+
obs_ctxdone(lcb_MULTICMD_CTX *mctx, const void *cookie)
|
|
203
209
|
{
|
|
204
210
|
unsigned ii;
|
|
205
|
-
|
|
211
|
+
OBSERVECTX *ctx = CTX_FROM_MULTI(mctx);
|
|
212
|
+
mc_CMDQUEUE *cq = &ctx->instance->cmdq;
|
|
206
213
|
|
|
207
|
-
for (ii = 0; ii <
|
|
214
|
+
for (ii = 0; ii < ctx->nrequests; ii++) {
|
|
208
215
|
protocol_binary_request_header hdr;
|
|
209
216
|
mc_PACKET *pkt;
|
|
210
217
|
mc_PIPELINE *pipeline;
|
|
211
|
-
|
|
218
|
+
lcb_string *rr = ctx->requests + ii;
|
|
212
219
|
pipeline = cq->pipelines[ii];
|
|
213
220
|
|
|
214
|
-
if (rr
|
|
221
|
+
if (!rr->nused) {
|
|
215
222
|
continue;
|
|
216
223
|
}
|
|
217
224
|
|
|
@@ -219,7 +226,7 @@ lcb_error_t ObserveCtx::MCTX_done(const void *cookie_)
|
|
|
219
226
|
lcb_assert(pkt);
|
|
220
227
|
|
|
221
228
|
mcreq_reserve_header(pipeline, pkt, MCREQ_PKT_BASESIZE);
|
|
222
|
-
mcreq_reserve_value2(pipeline, pkt, rr
|
|
229
|
+
mcreq_reserve_value2(pipeline, pkt, rr->nused);
|
|
223
230
|
|
|
224
231
|
hdr.request.magic = PROTOCOL_BINARY_REQ;
|
|
225
232
|
hdr.request.opcode = PROTOCOL_BINARY_CMD_OBSERVE;
|
|
@@ -229,52 +236,70 @@ lcb_error_t ObserveCtx::MCTX_done(const void *cookie_)
|
|
|
229
236
|
hdr.request.vbucket = 0;
|
|
230
237
|
hdr.request.extlen = 0;
|
|
231
238
|
hdr.request.opaque = pkt->opaque;
|
|
232
|
-
hdr.request.bodylen = htonl((lcb_uint32_t)rr
|
|
239
|
+
hdr.request.bodylen = htonl((lcb_uint32_t)rr->nused);
|
|
233
240
|
|
|
234
241
|
memcpy(SPAN_BUFFER(&pkt->kh_span), hdr.bytes, sizeof(hdr.bytes));
|
|
235
|
-
memcpy(SPAN_BUFFER(&pkt->u_value.single),
|
|
242
|
+
memcpy(SPAN_BUFFER(&pkt->u_value.single), rr->base, rr->nused);
|
|
236
243
|
|
|
237
244
|
pkt->flags |= MCREQ_F_REQEXT;
|
|
238
|
-
pkt->u_rdata.exdata =
|
|
245
|
+
pkt->u_rdata.exdata = (mc_REQDATAEX *)ctx;
|
|
239
246
|
mcreq_sched_add(pipeline, pkt);
|
|
240
247
|
TRACE_OBSERVE_BEGIN(&hdr, SPAN_BUFFER(&pkt->u_value.single));
|
|
241
248
|
}
|
|
242
249
|
|
|
243
|
-
|
|
244
|
-
|
|
250
|
+
destroy_requests(ctx);
|
|
251
|
+
ctx->base.start = gethrtime();
|
|
252
|
+
ctx->base.cookie = cookie;
|
|
253
|
+
ctx->base.procs = &obs_procs;
|
|
245
254
|
|
|
246
|
-
if (
|
|
247
|
-
|
|
255
|
+
if (ctx->nrequests == 0 || ctx->remaining == 0) {
|
|
256
|
+
free(ctx);
|
|
248
257
|
return LCB_EINVAL;
|
|
249
258
|
} else {
|
|
250
|
-
MAYBE_SCHEDLEAVE(instance);
|
|
259
|
+
MAYBE_SCHEDLEAVE(ctx->instance);
|
|
251
260
|
return LCB_SUCCESS;
|
|
252
261
|
}
|
|
253
262
|
}
|
|
254
263
|
|
|
255
|
-
void
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
instance(instance_),
|
|
262
|
-
remaining(0),
|
|
263
|
-
oflags(0) {
|
|
264
|
-
|
|
265
|
-
requests.resize(LCBT_NSERVERS(instance));
|
|
264
|
+
static void
|
|
265
|
+
obs_ctxfail(lcb_MULTICMD_CTX *mctx)
|
|
266
|
+
{
|
|
267
|
+
OBSERVECTX *ctx = CTX_FROM_MULTI(mctx);
|
|
268
|
+
destroy_requests(ctx);
|
|
269
|
+
free(ctx);
|
|
266
270
|
}
|
|
267
271
|
|
|
268
272
|
LIBCOUCHBASE_API
|
|
269
|
-
lcb_MULTICMD_CTX *
|
|
270
|
-
|
|
273
|
+
lcb_MULTICMD_CTX *
|
|
274
|
+
lcb_observe3_ctxnew(lcb_t instance)
|
|
275
|
+
{
|
|
276
|
+
OBSERVECTX *ctx;
|
|
277
|
+
size_t ii, n_extra = LCBT_NSERVERS(instance)-1;
|
|
278
|
+
ctx = calloc(1, sizeof(*ctx) + sizeof(ctx->requests) * n_extra);
|
|
279
|
+
ctx->instance = instance;
|
|
280
|
+
ctx->nrequests = n_extra + 1;
|
|
281
|
+
ctx->mctx.addcmd = obs_ctxadd;
|
|
282
|
+
ctx->mctx.done = obs_ctxdone;
|
|
283
|
+
ctx->mctx.fail = obs_ctxfail;
|
|
284
|
+
|
|
285
|
+
/* note this block doesn't do anything not done with calloc, but makes for
|
|
286
|
+
* easier reading/tracking */
|
|
287
|
+
for (ii = 0; ii < ctx->nrequests; ii++) {
|
|
288
|
+
lcb_string_init(ctx->requests + ii);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return &ctx->mctx;
|
|
271
292
|
}
|
|
272
293
|
|
|
273
294
|
lcb_MULTICMD_CTX *
|
|
274
|
-
lcb_observe_ctx_dur_new(lcb_t instance)
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
295
|
+
lcb_observe_ctx_dur_new(lcb_t instance)
|
|
296
|
+
{
|
|
297
|
+
lcb_MULTICMD_CTX *mctx = lcb_observe3_ctxnew(instance);
|
|
298
|
+
if (mctx) {
|
|
299
|
+
OBSERVECTX *ctx = CTX_FROM_MULTI(mctx);
|
|
300
|
+
ctx->oflags |= F_DURABILITY;
|
|
301
|
+
}
|
|
302
|
+
return mctx;
|
|
278
303
|
}
|
|
279
304
|
|
|
280
305
|
LIBCOUCHBASE_API
|