libcouchbase 0.0.7 → 0.0.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/libcouchbase/.gitignore +2 -0
- data/ext/libcouchbase/CMakeLists.txt +5 -7
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +49 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +2 -1
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +2 -0
- data/ext/libcouchbase/cmake/defs.mk.in +0 -2
- data/ext/libcouchbase/cmake/source_files.cmake +34 -14
- data/ext/libcouchbase/configure.pl +1 -1
- data/ext/libcouchbase/contrib/genhash/genhash.h +6 -0
- data/ext/libcouchbase/include/libcouchbase/auth.h +10 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +10 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +7 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +13 -1
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +9 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
- data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +21 -1132
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
- data/ext/libcouchbase/src/README.md +0 -2
- data/ext/libcouchbase/src/auth-priv.h +1 -0
- data/ext/libcouchbase/src/auth.cc +10 -0
- data/ext/libcouchbase/src/bootstrap.cc +216 -0
- data/ext/libcouchbase/src/bootstrap.h +50 -39
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +455 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +528 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +115 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +407 -386
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +378 -0
- data/ext/libcouchbase/src/cbft.cc +22 -27
- data/ext/libcouchbase/src/cntl.cc +24 -24
- data/ext/libcouchbase/src/connspec.cc +30 -1
- data/ext/libcouchbase/src/connspec.h +17 -0
- data/ext/libcouchbase/src/dns-srv.cc +143 -0
- data/ext/libcouchbase/src/{dump.c → dump.cc} +8 -11
- data/ext/libcouchbase/src/getconfig.cc +73 -0
- data/ext/libcouchbase/src/handler.cc +84 -85
- data/ext/libcouchbase/src/hostlist.cc +0 -1
- data/ext/libcouchbase/src/hostlist.h +6 -1
- data/ext/libcouchbase/src/http/http-priv.h +125 -112
- data/ext/libcouchbase/src/http/http.cc +9 -29
- data/ext/libcouchbase/src/http/http.h +1 -34
- data/ext/libcouchbase/src/http/http_io.cc +22 -26
- data/ext/libcouchbase/src/instance.cc +102 -28
- data/ext/libcouchbase/src/internal.h +47 -29
- data/ext/libcouchbase/src/jsparse/parser.cc +146 -202
- data/ext/libcouchbase/src/jsparse/parser.h +91 -98
- data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
- data/ext/libcouchbase/src/lcbio/connect.cc +562 -0
- data/ext/libcouchbase/src/lcbio/connect.h +9 -2
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +61 -16
- data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
- data/ext/libcouchbase/src/lcbio/manager.c +2 -2
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
- data/ext/libcouchbase/src/mc/mcreq.h +9 -2
- data/ext/libcouchbase/src/mcserver/mcserver.cc +723 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +160 -70
- data/ext/libcouchbase/src/mcserver/negotiate.cc +118 -152
- data/ext/libcouchbase/src/mcserver/negotiate.h +85 -74
- data/ext/libcouchbase/src/mctx-helper.h +51 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
- data/ext/libcouchbase/src/n1ql/n1ql.cc +56 -32
- data/ext/libcouchbase/src/{newconfig.c → newconfig.cc} +42 -70
- data/ext/libcouchbase/src/nodeinfo.cc +4 -8
- data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
- data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
- data/ext/libcouchbase/src/operations/{durability-cas.c → durability-cas.cc} +92 -76
- data/ext/libcouchbase/src/operations/{durability-seqno.c → durability-seqno.cc} +55 -49
- data/ext/libcouchbase/src/operations/durability.cc +643 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +212 -124
- data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
- data/ext/libcouchbase/src/operations/{observe-seqno.c → observe-seqno.cc} +5 -8
- data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +69 -94
- data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
- data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
- data/ext/libcouchbase/src/operations/{stats.c → stats.cc} +66 -78
- data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
- data/ext/libcouchbase/src/operations/subdoc.cc +38 -18
- data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
- data/ext/libcouchbase/src/packetutils.h +200 -137
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +3 -4
- data/ext/libcouchbase/src/retryq.cc +394 -0
- data/ext/libcouchbase/src/retryq.h +116 -104
- data/ext/libcouchbase/src/settings.h +2 -1
- data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
- data/ext/libcouchbase/src/trace.h +8 -8
- data/ext/libcouchbase/src/vbucket/vbucket.c +0 -1
- data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
- data/ext/libcouchbase/src/views/docreq.h +24 -30
- data/ext/libcouchbase/src/views/viewreq.cc +318 -0
- data/ext/libcouchbase/src/views/viewreq.h +43 -13
- data/ext/libcouchbase/src/{wait.c → wait.cc} +12 -17
- data/ext/libcouchbase/tests/basic/t_connstr.cc +89 -50
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -78
- data/ext/libcouchbase/tests/basic/t_packet.cc +35 -42
- data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +94 -111
- data/ext/libcouchbase/tests/iotests/t_sched.cc +1 -2
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
- data/lib/libcouchbase/version.rb +1 -1
- metadata +36 -39
- data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
- data/ext/libcouchbase/src/bootstrap.c +0 -269
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +0 -495
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
- data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
- data/ext/libcouchbase/src/getconfig.c +0 -100
- data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
- data/ext/libcouchbase/src/lcbio/connect.c +0 -557
- data/ext/libcouchbase/src/mcserver/mcserver.c +0 -784
- data/ext/libcouchbase/src/operations/durability.c +0 -668
- data/ext/libcouchbase/src/packetutils.c +0 -60
- data/ext/libcouchbase/src/retryq.c +0 -424
- data/ext/libcouchbase/src/simplestring.c +0 -211
- data/ext/libcouchbase/src/simplestring.h +0 -228
- data/ext/libcouchbase/src/ssobuf.h +0 -82
- data/ext/libcouchbase/src/views/viewreq.c +0 -358
- data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
@@ -19,8 +19,6 @@ lcb_error_t
|
|
19
19
|
lcb_observe_seqno3(lcb_t instance, const void *cookie, const lcb_CMDOBSEQNO *cmd)
|
20
20
|
{
|
21
21
|
mc_PACKET *pkt;
|
22
|
-
mc_SERVER *server;
|
23
|
-
mc_PIPELINE *pl;
|
24
22
|
protocol_binary_request_header hdr;
|
25
23
|
lcb_U64 uuid;
|
26
24
|
|
@@ -28,11 +26,10 @@ lcb_observe_seqno3(lcb_t instance, const void *cookie, const lcb_CMDOBSEQNO *cmd
|
|
28
26
|
return LCB_EINVAL;
|
29
27
|
}
|
30
28
|
|
31
|
-
server =
|
32
|
-
|
33
|
-
pkt
|
34
|
-
|
35
|
-
mcreq_reserve_value2(pl, pkt, 8);
|
29
|
+
lcb::Server *server = instance->get_server(cmd->server_index);
|
30
|
+
pkt = mcreq_allocate_packet(server);
|
31
|
+
mcreq_reserve_header(server, pkt, MCREQ_PKT_BASESIZE);
|
32
|
+
mcreq_reserve_value2(server, pkt, 8);
|
36
33
|
|
37
34
|
/* Set the static fields */
|
38
35
|
MCREQ_PKT_RDATA(pkt)->cookie = cookie;
|
@@ -52,7 +49,7 @@ lcb_observe_seqno3(lcb_t instance, const void *cookie, const lcb_CMDOBSEQNO *cmd
|
|
52
49
|
|
53
50
|
uuid = lcb_htonll(cmd->uuid);
|
54
51
|
memcpy(SPAN_BUFFER(&pkt->u_value.single), &uuid, sizeof uuid);
|
55
|
-
LCB_SCHED_ADD(instance,
|
52
|
+
LCB_SCHED_ADD(instance, server, pkt);
|
56
53
|
return LCB_SUCCESS;
|
57
54
|
}
|
58
55
|
|
@@ -18,20 +18,26 @@
|
|
18
18
|
#include "internal.h"
|
19
19
|
#include "durability_internal.h"
|
20
20
|
#include "trace.h"
|
21
|
+
#include "mctx-helper.h"
|
21
22
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
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();
|
26
31
|
|
32
|
+
lcb_t instance;
|
27
33
|
size_t remaining;
|
28
34
|
unsigned oflags;
|
29
35
|
|
36
|
+
typedef std::vector<uint8_t> ServerBuf;
|
30
37
|
/* requests array contains one buffer per server. nrequest essentially
|
31
38
|
* says how many elements (and thus how many servers) */
|
32
|
-
|
33
|
-
|
34
|
-
} OBSERVECTX;
|
39
|
+
std::vector<ServerBuf> requests;
|
40
|
+
};
|
35
41
|
|
36
42
|
typedef enum {
|
37
43
|
F_DURABILITY = 0x01,
|
@@ -39,12 +45,20 @@ typedef enum {
|
|
39
45
|
F_SCHEDFAILED = 0x04
|
40
46
|
} obs_flags;
|
41
47
|
|
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
|
+
|
42
56
|
static void
|
43
57
|
handle_observe_callback(mc_PIPELINE *pl,
|
44
58
|
mc_PACKET *pkt, lcb_error_t err, const void *arg)
|
45
59
|
{
|
46
|
-
|
47
|
-
lcb_RESPOBSERVE *resp = (void
|
60
|
+
ObserveCtx *oc = static_cast<ObserveCtx*>(pkt->u_rdata.exdata);
|
61
|
+
lcb_RESPOBSERVE *resp = reinterpret_cast<lcb_RESPOBSERVE*>(const_cast<void*>(arg));
|
48
62
|
lcb_t instance = oc->instance;
|
49
63
|
|
50
64
|
(void)pl;
|
@@ -67,7 +81,7 @@ handle_observe_callback(mc_PIPELINE *pl,
|
|
67
81
|
memset(&cur, 0, sizeof(cur));
|
68
82
|
cur.key = ptr;
|
69
83
|
cur.nkey = nkey;
|
70
|
-
cur.cookie = (void *)oc->
|
84
|
+
cur.cookie = (void *)oc->cookie;
|
71
85
|
cur.rc = err;
|
72
86
|
handle_observe_callback(NULL, pkt, err, &cur);
|
73
87
|
ptr += nkey;
|
@@ -77,12 +91,11 @@ handle_observe_callback(mc_PIPELINE *pl,
|
|
77
91
|
return;
|
78
92
|
}
|
79
93
|
|
80
|
-
resp->cookie = (void *)oc->
|
94
|
+
resp->cookie = (void *)oc->cookie;
|
81
95
|
resp->rc = err;
|
82
96
|
if (oc->oflags & F_DURABILITY) {
|
83
97
|
resp->ttp = pl ? pl->index : -1;
|
84
|
-
lcbdur_cas_update(
|
85
|
-
(lcb_DURSET *)MCREQ_PKT_COOKIE(pkt), err, resp);
|
98
|
+
lcbdur_cas_update(instance, (void*)MCREQ_PKT_COOKIE(pkt), err, resp);
|
86
99
|
|
87
100
|
} else if ((oc->oflags & F_SCHEDFAILED) == 0) {
|
88
101
|
lcb_RESPCALLBACK callback = lcb_find_callback(instance, LCB_CALLBACK_OBSERVE);
|
@@ -101,36 +114,23 @@ handle_observe_callback(mc_PIPELINE *pl,
|
|
101
114
|
resp2.rflags = LCB_RESP_F_CLIENTGEN|LCB_RESP_F_FINAL;
|
102
115
|
oc->oflags |= F_DESTROY;
|
103
116
|
handle_observe_callback(NULL, pkt, err, &resp2);
|
104
|
-
|
117
|
+
delete oc;
|
105
118
|
}
|
106
119
|
}
|
107
120
|
|
108
121
|
static void
|
109
122
|
handle_schedfail(mc_PACKET *pkt)
|
110
123
|
{
|
111
|
-
|
124
|
+
ObserveCtx *oc = static_cast<ObserveCtx*>(pkt->u_rdata.exdata);
|
112
125
|
oc->oflags |= F_SCHEDFAILED;
|
113
126
|
handle_observe_callback(NULL, pkt, LCB_SCHEDFAIL_INTERNAL, NULL);
|
114
127
|
}
|
115
128
|
|
116
|
-
|
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)
|
129
|
+
lcb_error_t ObserveCtx::MCTX_addcmd(const lcb_CMDBASE *cmdbase)
|
128
130
|
{
|
129
131
|
int vbid, srvix_dummy;
|
130
132
|
unsigned ii;
|
131
133
|
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,23 +178,18 @@ obs_ctxadd(lcb_MULTICMD_CTX *mctx, 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;
|
183
181
|
lcb_U16 ix = servers[ii];
|
184
182
|
|
185
|
-
lcb_assert(ix <
|
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);
|
183
|
+
lcb_assert(ix < requests.size());
|
196
184
|
|
197
|
-
|
185
|
+
ServerBuf& rr = requests[ix];
|
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++;
|
198
193
|
}
|
199
194
|
return LCB_SUCCESS;
|
200
195
|
}
|
@@ -204,21 +199,19 @@ static mc_REQDATAPROCS obs_procs = {
|
|
204
199
|
handle_schedfail
|
205
200
|
};
|
206
201
|
|
207
|
-
|
208
|
-
obs_ctxdone(lcb_MULTICMD_CTX *mctx, const void *cookie)
|
202
|
+
lcb_error_t ObserveCtx::MCTX_done(const void *cookie_)
|
209
203
|
{
|
210
204
|
unsigned ii;
|
211
|
-
|
212
|
-
mc_CMDQUEUE *cq = &ctx->instance->cmdq;
|
205
|
+
mc_CMDQUEUE *cq = &instance->cmdq;
|
213
206
|
|
214
|
-
for (ii = 0; ii <
|
207
|
+
for (ii = 0; ii < requests.size(); ii++) {
|
215
208
|
protocol_binary_request_header hdr;
|
216
209
|
mc_PACKET *pkt;
|
217
210
|
mc_PIPELINE *pipeline;
|
218
|
-
|
211
|
+
ServerBuf& rr = requests[ii];
|
219
212
|
pipeline = cq->pipelines[ii];
|
220
213
|
|
221
|
-
if (
|
214
|
+
if (rr.empty()) {
|
222
215
|
continue;
|
223
216
|
}
|
224
217
|
|
@@ -226,7 +219,7 @@ obs_ctxdone(lcb_MULTICMD_CTX *mctx, const void *cookie)
|
|
226
219
|
lcb_assert(pkt);
|
227
220
|
|
228
221
|
mcreq_reserve_header(pipeline, pkt, MCREQ_PKT_BASESIZE);
|
229
|
-
mcreq_reserve_value2(pipeline, pkt, rr
|
222
|
+
mcreq_reserve_value2(pipeline, pkt, rr.size());
|
230
223
|
|
231
224
|
hdr.request.magic = PROTOCOL_BINARY_REQ;
|
232
225
|
hdr.request.opcode = PROTOCOL_BINARY_CMD_OBSERVE;
|
@@ -236,70 +229,52 @@ obs_ctxdone(lcb_MULTICMD_CTX *mctx, const void *cookie)
|
|
236
229
|
hdr.request.vbucket = 0;
|
237
230
|
hdr.request.extlen = 0;
|
238
231
|
hdr.request.opaque = pkt->opaque;
|
239
|
-
hdr.request.bodylen = htonl((lcb_uint32_t)rr
|
232
|
+
hdr.request.bodylen = htonl((lcb_uint32_t)rr.size());
|
240
233
|
|
241
234
|
memcpy(SPAN_BUFFER(&pkt->kh_span), hdr.bytes, sizeof(hdr.bytes));
|
242
|
-
memcpy(SPAN_BUFFER(&pkt->u_value.single), rr
|
235
|
+
memcpy(SPAN_BUFFER(&pkt->u_value.single), &rr[0], rr.size());
|
243
236
|
|
244
237
|
pkt->flags |= MCREQ_F_REQEXT;
|
245
|
-
pkt->u_rdata.exdata =
|
238
|
+
pkt->u_rdata.exdata = this;
|
246
239
|
mcreq_sched_add(pipeline, pkt);
|
247
240
|
TRACE_OBSERVE_BEGIN(&hdr, SPAN_BUFFER(&pkt->u_value.single));
|
248
241
|
}
|
249
242
|
|
250
|
-
|
251
|
-
|
252
|
-
ctx->base.cookie = cookie;
|
253
|
-
ctx->base.procs = &obs_procs;
|
243
|
+
start = gethrtime();
|
244
|
+
cookie = cookie_;
|
254
245
|
|
255
|
-
if (
|
256
|
-
|
246
|
+
if (requests.size() == 0 || remaining == 0) {
|
247
|
+
delete this;
|
257
248
|
return LCB_EINVAL;
|
258
249
|
} else {
|
259
|
-
MAYBE_SCHEDLEAVE(
|
250
|
+
MAYBE_SCHEDLEAVE(instance);
|
260
251
|
return LCB_SUCCESS;
|
261
252
|
}
|
262
253
|
}
|
263
254
|
|
264
|
-
|
265
|
-
|
266
|
-
{
|
267
|
-
OBSERVECTX *ctx = CTX_FROM_MULTI(mctx);
|
268
|
-
destroy_requests(ctx);
|
269
|
-
free(ctx);
|
255
|
+
void ObserveCtx::MCTX_fail() {
|
256
|
+
delete this;
|
270
257
|
}
|
271
258
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
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
|
-
}
|
259
|
+
ObserveCtx::ObserveCtx(lcb_t instance_)
|
260
|
+
: mc_REQDATAEX(NULL, obs_procs, 0),
|
261
|
+
instance(instance_),
|
262
|
+
remaining(0),
|
263
|
+
oflags(0) {
|
264
|
+
|
265
|
+
requests.resize(LCBT_NSERVERS(instance));
|
266
|
+
}
|
290
267
|
|
291
|
-
|
268
|
+
LIBCOUCHBASE_API
|
269
|
+
lcb_MULTICMD_CTX * lcb_observe3_ctxnew(lcb_t instance) {
|
270
|
+
return new ObserveCtx(instance);
|
292
271
|
}
|
293
272
|
|
294
273
|
lcb_MULTICMD_CTX *
|
295
|
-
lcb_observe_ctx_dur_new(lcb_t instance)
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
OBSERVECTX *ctx = CTX_FROM_MULTI(mctx);
|
300
|
-
ctx->oflags |= F_DURABILITY;
|
301
|
-
}
|
302
|
-
return mctx;
|
274
|
+
lcb_observe_ctx_dur_new(lcb_t instance) {
|
275
|
+
ObserveCtx *ctx = new ObserveCtx(instance);
|
276
|
+
ctx->oflags |= F_DURABILITY;
|
277
|
+
return ctx;
|
303
278
|
}
|
304
279
|
|
305
280
|
LIBCOUCHBASE_API
|
File without changes
|
File without changes
|
@@ -17,32 +17,44 @@
|
|
17
17
|
|
18
18
|
#include "internal.h"
|
19
19
|
|
20
|
-
|
21
|
-
mc_REQDATAEX base;
|
20
|
+
struct BcastCookie : mc_REQDATAEX {
|
22
21
|
lcb_CALLBACKTYPE type;
|
23
22
|
int remaining;
|
24
|
-
|
23
|
+
|
24
|
+
BcastCookie(lcb_CALLBACKTYPE type_,
|
25
|
+
const mc_REQDATAPROCS* procs_, const void *cookie_)
|
26
|
+
: mc_REQDATAEX(cookie_, *procs_, gethrtime()),
|
27
|
+
type(type_), remaining(0) {
|
28
|
+
}
|
29
|
+
};
|
25
30
|
|
26
31
|
static void
|
27
32
|
refcnt_dtor_common(mc_PACKET *pkt)
|
28
33
|
{
|
29
|
-
|
34
|
+
BcastCookie *ck = static_cast<BcastCookie *>(pkt->u_rdata.exdata);
|
30
35
|
if (!--ck->remaining) {
|
31
|
-
|
36
|
+
delete ck;
|
32
37
|
}
|
33
38
|
}
|
34
39
|
|
40
|
+
static const char *
|
41
|
+
make_hp_string(const lcb::Server& server, std::string& out) {
|
42
|
+
out.assign(server.get_host().host);
|
43
|
+
out.append(":");
|
44
|
+
out.append(server.get_host().port);
|
45
|
+
return out.c_str();
|
46
|
+
}
|
47
|
+
|
35
48
|
static void
|
36
49
|
stats_handler(mc_PIPELINE *pl, mc_PACKET *req, lcb_error_t err, const void *arg)
|
37
50
|
{
|
38
|
-
|
39
|
-
|
40
|
-
lcb_RESPSTATS *resp = (void
|
41
|
-
|
51
|
+
BcastCookie *ck = static_cast<BcastCookie *>(req->u_rdata.exdata);
|
52
|
+
lcb::Server *server = static_cast<lcb::Server*>(pl);
|
53
|
+
lcb_RESPSTATS *resp = reinterpret_cast<lcb_RESPSTATS*>(const_cast<void*>(arg));
|
54
|
+
|
42
55
|
lcb_RESPCALLBACK callback;
|
43
|
-
lcb_t instance = server->
|
56
|
+
lcb_t instance = server->get_instance();
|
44
57
|
|
45
|
-
sprintf(epbuf, "%s:%s", mcserver_get_host(server), mcserver_get_port(server));
|
46
58
|
callback = lcb_find_callback(instance, LCB_CALLBACK_STATS);
|
47
59
|
|
48
60
|
if (!arg) {
|
@@ -53,14 +65,15 @@ stats_handler(mc_PIPELINE *pl, mc_PACKET *req, lcb_error_t err, const void *arg)
|
|
53
65
|
}
|
54
66
|
|
55
67
|
s_resp.rc = err;
|
56
|
-
s_resp.cookie =
|
68
|
+
s_resp.cookie = const_cast<void *>(ck->cookie);
|
57
69
|
s_resp.rflags = LCB_RESP_F_CLIENTGEN|LCB_RESP_F_FINAL;
|
58
70
|
callback(instance, LCB_CALLBACK_STATS, (lcb_RESPBASE *)&s_resp);
|
59
|
-
|
71
|
+
delete ck;
|
60
72
|
|
61
73
|
} else {
|
62
|
-
|
63
|
-
resp->
|
74
|
+
std::string epbuf;
|
75
|
+
resp->server = make_hp_string(*server, epbuf);
|
76
|
+
resp->cookie = const_cast<void *>(ck->cookie);
|
64
77
|
callback(instance, LCB_CALLBACK_STATS, (lcb_RESPBASE *)resp);
|
65
78
|
return;
|
66
79
|
}
|
@@ -79,7 +92,6 @@ lcb_stats3(lcb_t instance, const void *cookie, const lcb_CMDSTATS * cmd)
|
|
79
92
|
int vbid = -1;
|
80
93
|
char ksbuf[512] = { 0 };
|
81
94
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
82
|
-
bcast_cookie *ckwrap = NULL;
|
83
95
|
lcbvb_CONFIG *vbc = cq->config;
|
84
96
|
const lcb_CONTIGBUF *kbuf_in = &cmd->key.contig;
|
85
97
|
lcb_KEYBUF kbuf_out;
|
@@ -113,10 +125,8 @@ lcb_stats3(lcb_t instance, const void *cookie, const lcb_CMDSTATS * cmd)
|
|
113
125
|
kbuf_out.contig = *kbuf_in;
|
114
126
|
}
|
115
127
|
|
116
|
-
ckwrap =
|
117
|
-
|
118
|
-
ckwrap->base.start = gethrtime();
|
119
|
-
ckwrap->base.procs = &stats_procs;
|
128
|
+
BcastCookie *ckwrap = new BcastCookie(LCB_CALLBACK_STATS,
|
129
|
+
&stats_procs, cookie);
|
120
130
|
|
121
131
|
for (ii = 0; ii < cq->npipelines; ii++) {
|
122
132
|
mc_PACKET *pkt;
|
@@ -143,7 +153,7 @@ lcb_stats3(lcb_t instance, const void *cookie, const lcb_CMDSTATS * cmd)
|
|
143
153
|
mcreq_reserve_header(pl, pkt, MCREQ_PKT_BASESIZE);
|
144
154
|
}
|
145
155
|
|
146
|
-
pkt->u_rdata.exdata =
|
156
|
+
pkt->u_rdata.exdata = ckwrap;
|
147
157
|
pkt->flags |= MCREQ_F_REQEXT;
|
148
158
|
|
149
159
|
ckwrap->remaining++;
|
@@ -153,7 +163,7 @@ lcb_stats3(lcb_t instance, const void *cookie, const lcb_CMDSTATS * cmd)
|
|
153
163
|
}
|
154
164
|
|
155
165
|
if (!ii) {
|
156
|
-
|
166
|
+
delete ckwrap;
|
157
167
|
return LCB_NO_MATCHING_SERVER;
|
158
168
|
}
|
159
169
|
|
@@ -165,9 +175,8 @@ static void
|
|
165
175
|
handle_bcast(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_error_t err,
|
166
176
|
const void *arg)
|
167
177
|
{
|
168
|
-
|
169
|
-
|
170
|
-
bcast_cookie *ck = (bcast_cookie *)req->u_rdata.exdata;
|
178
|
+
lcb::Server *server = static_cast<lcb::Server*>(pipeline);
|
179
|
+
BcastCookie *ck = (BcastCookie *)req->u_rdata.exdata;
|
171
180
|
lcb_RESPCALLBACK callback;
|
172
181
|
|
173
182
|
union {
|
@@ -187,19 +196,20 @@ handle_bcast(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_error_t err,
|
|
187
196
|
memset(&u_empty, 0, sizeof(u_empty));
|
188
197
|
|
189
198
|
if (arg) {
|
190
|
-
u_resp.base = (
|
199
|
+
u_resp.base = (lcb_RESPSERVERBASE*)arg;
|
191
200
|
} else {
|
192
201
|
u_resp.base = &u_empty.base;
|
193
202
|
u_resp.base->rflags = LCB_RESP_F_CLIENTGEN;
|
194
203
|
}
|
195
204
|
|
196
205
|
u_resp.base->rc = err;
|
197
|
-
u_resp.base->cookie = (
|
198
|
-
|
199
|
-
|
206
|
+
u_resp.base->cookie = const_cast<void*>(ck->cookie);
|
207
|
+
|
208
|
+
std::string epbuf;
|
209
|
+
u_resp.base->server = make_hp_string(*server, epbuf);
|
200
210
|
|
201
|
-
callback = lcb_find_callback(server->
|
202
|
-
callback(server->
|
211
|
+
callback = lcb_find_callback(server->get_instance(), ck->type);
|
212
|
+
callback(server->get_instance(), ck->type, (lcb_RESPBASE *)u_resp.base);
|
203
213
|
if (--ck->remaining) {
|
204
214
|
return;
|
205
215
|
}
|
@@ -207,9 +217,9 @@ handle_bcast(mc_PIPELINE *pipeline, mc_PACKET *req, lcb_error_t err,
|
|
207
217
|
u_empty.base.server = NULL;
|
208
218
|
u_empty.base.rc = err;
|
209
219
|
u_empty.base.rflags = LCB_RESP_F_CLIENTGEN|LCB_RESP_F_FINAL;
|
210
|
-
u_empty.base.cookie = (
|
211
|
-
callback(server->
|
212
|
-
|
220
|
+
u_empty.base.cookie = const_cast<void*>(ck->cookie);
|
221
|
+
callback(server->get_instance(), ck->type, (lcb_RESPBASE *)&u_empty.base);
|
222
|
+
delete ck;
|
213
223
|
}
|
214
224
|
|
215
225
|
static mc_REQDATAPROCS bcast_procs = {
|
@@ -222,17 +232,12 @@ pkt_bcast_simple(lcb_t instance, const void *cookie, lcb_CALLBACKTYPE type)
|
|
222
232
|
{
|
223
233
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
224
234
|
unsigned ii;
|
225
|
-
bcast_cookie *ckwrap;
|
226
235
|
|
227
236
|
if (!cq->config) {
|
228
237
|
return LCB_CLIENT_ETMPFAIL;
|
229
238
|
}
|
230
239
|
|
231
|
-
ckwrap =
|
232
|
-
ckwrap->base.cookie = cookie;
|
233
|
-
ckwrap->base.start = gethrtime();
|
234
|
-
ckwrap->base.procs = &bcast_procs;
|
235
|
-
ckwrap->type = type;
|
240
|
+
BcastCookie *ckwrap = new BcastCookie(type, &bcast_procs, cookie);
|
236
241
|
|
237
242
|
for (ii = 0; ii < cq->npipelines; ii++) {
|
238
243
|
mc_PIPELINE *pl = cq->pipelines[ii];
|
@@ -244,7 +249,7 @@ pkt_bcast_simple(lcb_t instance, const void *cookie, lcb_CALLBACKTYPE type)
|
|
244
249
|
return LCB_CLIENT_ENOMEM;
|
245
250
|
}
|
246
251
|
|
247
|
-
pkt->u_rdata.exdata =
|
252
|
+
pkt->u_rdata.exdata = ckwrap;
|
248
253
|
pkt->flags |= MCREQ_F_REQEXT;
|
249
254
|
|
250
255
|
hdr.request.magic = PROTOCOL_BINARY_REQ;
|
@@ -265,7 +270,7 @@ pkt_bcast_simple(lcb_t instance, const void *cookie, lcb_CALLBACKTYPE type)
|
|
265
270
|
}
|
266
271
|
|
267
272
|
if (ii == 0) {
|
268
|
-
|
273
|
+
delete ckwrap;
|
269
274
|
return LCB_NO_MATCHING_SERVER;
|
270
275
|
}
|
271
276
|
MAYBE_SCHEDLEAVE(instance);
|
@@ -274,18 +279,16 @@ pkt_bcast_simple(lcb_t instance, const void *cookie, lcb_CALLBACKTYPE type)
|
|
274
279
|
|
275
280
|
LIBCOUCHBASE_API
|
276
281
|
lcb_error_t
|
277
|
-
lcb_server_versions3(lcb_t instance, const void *cookie, const lcb_CMDBASE *
|
282
|
+
lcb_server_versions3(lcb_t instance, const void *cookie, const lcb_CMDBASE *)
|
278
283
|
{
|
279
|
-
(void)cmd;
|
280
284
|
return pkt_bcast_simple(instance, cookie, LCB_CALLBACK_VERSIONS);
|
281
285
|
}
|
282
286
|
|
283
287
|
|
284
288
|
LIBCOUCHBASE_API
|
285
289
|
lcb_error_t
|
286
|
-
lcb_flush3(lcb_t instance, const void *cookie, const lcb_CMDFLUSH *
|
290
|
+
lcb_flush3(lcb_t instance, const void *cookie, const lcb_CMDFLUSH *)
|
287
291
|
{
|
288
|
-
(void)cmd;
|
289
292
|
return pkt_bcast_simple(instance, cookie, LCB_CALLBACK_FLUSH);
|
290
293
|
}
|
291
294
|
|
@@ -296,30 +299,24 @@ lcb_server_verbosity3(lcb_t instance, const void *cookie,
|
|
296
299
|
{
|
297
300
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
298
301
|
unsigned ii;
|
299
|
-
bcast_cookie *ckwrap;
|
300
302
|
|
301
303
|
if (!cq->config) {
|
302
304
|
return LCB_CLIENT_ETMPFAIL;
|
303
305
|
}
|
304
306
|
|
305
|
-
ckwrap =
|
306
|
-
|
307
|
-
ckwrap->base.start = gethrtime();
|
308
|
-
ckwrap->base.procs = &bcast_procs;
|
309
|
-
ckwrap->type = LCB_CALLBACK_VERBOSITY;
|
307
|
+
BcastCookie *ckwrap = new BcastCookie(
|
308
|
+
LCB_CALLBACK_VERBOSITY, &bcast_procs, cookie);
|
310
309
|
|
311
310
|
for (ii = 0; ii < cq->npipelines; ii++) {
|
312
311
|
mc_PACKET *pkt;
|
313
|
-
|
314
|
-
mc_SERVER *server = (mc_SERVER *)pl;
|
315
|
-
char cmpbuf[NI_MAXHOST + NI_MAXSERV + 4];
|
312
|
+
lcb::Server *server = static_cast<lcb::Server*>(cq->pipelines[ii]);
|
316
313
|
protocol_binary_request_verbosity vcmd;
|
317
314
|
protocol_binary_request_header *hdr = &vcmd.message.header;
|
318
315
|
uint32_t level;
|
319
316
|
|
320
|
-
|
321
|
-
|
322
|
-
if (cmd->server &&
|
317
|
+
std::string cmpbuf;
|
318
|
+
make_hp_string(*server, cmpbuf);
|
319
|
+
if (cmd->server && cmpbuf != cmd->server) {
|
323
320
|
continue;
|
324
321
|
}
|
325
322
|
|
@@ -333,15 +330,15 @@ lcb_server_verbosity3(lcb_t instance, const void *cookie,
|
|
333
330
|
level = 0;
|
334
331
|
}
|
335
332
|
|
336
|
-
pkt = mcreq_allocate_packet(
|
333
|
+
pkt = mcreq_allocate_packet(server);
|
337
334
|
if (!pkt) {
|
338
335
|
return LCB_CLIENT_ENOMEM;
|
339
336
|
}
|
340
337
|
|
341
|
-
pkt->u_rdata.exdata =
|
338
|
+
pkt->u_rdata.exdata = ckwrap;
|
342
339
|
pkt->flags |= MCREQ_F_REQEXT;
|
343
340
|
|
344
|
-
mcreq_reserve_header(
|
341
|
+
mcreq_reserve_header(server, pkt, MCREQ_PKT_BASESIZE + 4);
|
345
342
|
hdr->request.magic = PROTOCOL_BINARY_REQ;
|
346
343
|
hdr->request.opcode = PROTOCOL_BINARY_CMD_VERBOSITY;
|
347
344
|
hdr->request.datatype = PROTOCOL_BINARY_RAW_BYTES;
|
@@ -354,12 +351,12 @@ lcb_server_verbosity3(lcb_t instance, const void *cookie,
|
|
354
351
|
vcmd.message.body.level = htonl((uint32_t)level);
|
355
352
|
|
356
353
|
memcpy(SPAN_BUFFER(&pkt->kh_span), vcmd.bytes, sizeof(vcmd.bytes));
|
357
|
-
mcreq_sched_add(
|
354
|
+
mcreq_sched_add(server, pkt);
|
358
355
|
ckwrap->remaining++;
|
359
356
|
}
|
360
357
|
|
361
358
|
if (!ckwrap->remaining) {
|
362
|
-
|
359
|
+
delete ckwrap;
|
363
360
|
return LCB_NO_MATCHING_SERVER;
|
364
361
|
}
|
365
362
|
MAYBE_SCHEDLEAVE(instance);
|
@@ -371,10 +368,8 @@ lcb_error_t
|
|
371
368
|
lcb_server_stats(lcb_t instance, const void *cookie, lcb_size_t num,
|
372
369
|
const lcb_server_stats_cmd_t * const * items)
|
373
370
|
{
|
374
|
-
unsigned ii;
|
375
|
-
|
376
371
|
lcb_sched_enter(instance);
|
377
|
-
for (ii = 0; ii < num; ii++) {
|
372
|
+
for (size_t ii = 0; ii < num; ii++) {
|
378
373
|
const lcb_server_stats_cmd_t *src = items[ii];
|
379
374
|
lcb_CMDSTATS dst;
|
380
375
|
lcb_error_t err;
|
@@ -397,10 +392,8 @@ lcb_error_t
|
|
397
392
|
lcb_set_verbosity(lcb_t instance, const void *cookie, lcb_size_t num,
|
398
393
|
const lcb_verbosity_cmd_t * const * items)
|
399
394
|
{
|
400
|
-
unsigned ii;
|
401
|
-
|
402
395
|
lcb_sched_enter(instance);
|
403
|
-
for (ii = 0; ii < num; ii++) {
|
396
|
+
for (size_t ii = 0; ii < num; ii++) {
|
404
397
|
lcb_CMDVERBOSITY dst;
|
405
398
|
lcb_error_t err;
|
406
399
|
const lcb_verbosity_cmd_t *src = items[ii];
|
@@ -421,12 +414,10 @@ lcb_set_verbosity(lcb_t instance, const void *cookie, lcb_size_t num,
|
|
421
414
|
LIBCOUCHBASE_API
|
422
415
|
lcb_error_t
|
423
416
|
lcb_flush(lcb_t instance, const void *cookie, lcb_size_t num,
|
424
|
-
const lcb_flush_cmd_t * const *
|
417
|
+
const lcb_flush_cmd_t * const *)
|
425
418
|
{
|
426
|
-
unsigned ii;
|
427
|
-
|
428
419
|
lcb_sched_enter(instance);
|
429
|
-
for (ii = 0; ii < num; ii++) {
|
420
|
+
for (size_t ii = 0; ii < num; ii++) {
|
430
421
|
lcb_error_t rc = lcb_flush3(instance, cookie, NULL);
|
431
422
|
if (rc != LCB_SUCCESS) {
|
432
423
|
lcb_sched_fail(instance);
|
@@ -434,20 +425,17 @@ lcb_flush(lcb_t instance, const void *cookie, lcb_size_t num,
|
|
434
425
|
}
|
435
426
|
}
|
436
427
|
lcb_sched_leave(instance);
|
437
|
-
(void)items;
|
438
428
|
SYNCMODE_INTERCEPT(instance)
|
439
429
|
}
|
440
430
|
|
441
431
|
LIBCOUCHBASE_API
|
442
432
|
lcb_error_t
|
443
433
|
lcb_server_versions(lcb_t instance, const void *cookie, lcb_size_t num,
|
444
|
-
const lcb_server_version_cmd_t * const *
|
434
|
+
const lcb_server_version_cmd_t * const *)
|
445
435
|
{
|
446
|
-
unsigned ii;
|
447
|
-
(void)items;
|
448
436
|
lcb_sched_enter(instance);
|
449
437
|
|
450
|
-
for (ii = 0; ii < num; ii++) {
|
438
|
+
for (size_t ii = 0; ii < num; ii++) {
|
451
439
|
lcb_error_t rc = lcb_server_versions3(instance, cookie, NULL);
|
452
440
|
if (rc != LCB_SUCCESS) {
|
453
441
|
lcb_sched_fail(instance);
|