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
|
File without changes
|
|
File without changes
|
|
@@ -22,9 +22,14 @@ struct BcastCookie : mc_REQDATAEX {
|
|
|
22
22
|
int remaining;
|
|
23
23
|
|
|
24
24
|
BcastCookie(lcb_CALLBACKTYPE type_,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
25
|
+
mc_REQDATAPROCS* procs_,
|
|
26
|
+
const void *cookie_) {
|
|
27
|
+
|
|
28
|
+
mc_REQDATAEX::procs = procs_;
|
|
29
|
+
mc_REQDATAEX::cookie = cookie_;
|
|
30
|
+
mc_REQDATAEX::start = gethrtime();
|
|
31
|
+
type = type_;
|
|
32
|
+
remaining = 0;
|
|
28
33
|
}
|
|
29
34
|
};
|
|
30
35
|
|
|
@@ -19,30 +19,23 @@
|
|
|
19
19
|
#include "trace.h"
|
|
20
20
|
#include "durability_internal.h"
|
|
21
21
|
|
|
22
|
-
struct
|
|
22
|
+
typedef struct {
|
|
23
|
+
mc_REQDATAEX base;
|
|
23
24
|
lcb_t instance;
|
|
24
25
|
lcb_U16 persist_to;
|
|
25
26
|
lcb_U16 replicate_to;
|
|
26
|
-
|
|
27
|
-
static mc_REQDATAPROCS proctable;
|
|
28
|
-
|
|
29
|
-
DurStoreCtx(lcb_t instance_, lcb_U16 persist_, lcb_U16 replicate_,
|
|
30
|
-
const void *cookie_)
|
|
31
|
-
: mc_REQDATAEX(cookie_, proctable, gethrtime()),
|
|
32
|
-
instance(instance_), persist_to(persist_), replicate_to(replicate_) {
|
|
33
|
-
}
|
|
34
|
-
};
|
|
27
|
+
} DURSTORECTX;
|
|
35
28
|
|
|
36
29
|
/** Observe stuff */
|
|
37
30
|
static void
|
|
38
|
-
handle_dur_storecb(mc_PIPELINE
|
|
31
|
+
handle_dur_storecb(mc_PIPELINE *pl, mc_PACKET *pkt,
|
|
39
32
|
lcb_error_t err, const void *arg)
|
|
40
33
|
{
|
|
41
34
|
lcb_RESPCALLBACK cb;
|
|
42
35
|
lcb_RESPSTOREDUR resp = { 0 };
|
|
43
36
|
lcb_CMDENDURE dcmd = { 0 };
|
|
44
37
|
const lcb_MUTATION_TOKEN *mt;
|
|
45
|
-
|
|
38
|
+
DURSTORECTX *dctx = (DURSTORECTX *)pkt->u_rdata.exdata;
|
|
46
39
|
lcb_MULTICMD_CTX *mctx;
|
|
47
40
|
lcb_durability_opts_t opts = { 0 };
|
|
48
41
|
const lcb_RESPSTORE *sresp = (const lcb_RESPSTORE *)arg;
|
|
@@ -85,7 +78,7 @@ handle_dur_storecb(mc_PIPELINE *, mc_PACKET *pkt,
|
|
|
85
78
|
|
|
86
79
|
if (err == LCB_SUCCESS) {
|
|
87
80
|
/* Everything OK? */
|
|
88
|
-
|
|
81
|
+
free(dctx);
|
|
89
82
|
return;
|
|
90
83
|
}
|
|
91
84
|
|
|
@@ -99,15 +92,20 @@ handle_dur_storecb(mc_PIPELINE *, mc_PACKET *pkt,
|
|
|
99
92
|
resp.dur_resp = &dresp;
|
|
100
93
|
cb = lcb_find_callback(dctx->instance, LCB_CALLBACK_STOREDUR);
|
|
101
94
|
cb(dctx->instance, LCB_CALLBACK_STOREDUR, (const lcb_RESPBASE*)&resp);
|
|
102
|
-
|
|
95
|
+
free(dctx);
|
|
103
96
|
}
|
|
97
|
+
|
|
98
|
+
(void)pl;
|
|
104
99
|
}
|
|
105
100
|
|
|
106
|
-
static void
|
|
107
|
-
|
|
101
|
+
static void
|
|
102
|
+
handle_dur_schedfail(mc_PACKET *pkt)
|
|
103
|
+
{
|
|
104
|
+
DURSTORECTX *dctx = (void *)pkt->u_rdata.exdata;
|
|
105
|
+
free(dctx);
|
|
108
106
|
}
|
|
109
107
|
|
|
110
|
-
mc_REQDATAPROCS
|
|
108
|
+
mc_REQDATAPROCS storedur_procs = {
|
|
111
109
|
handle_dur_storecb,
|
|
112
110
|
handle_dur_schedfail
|
|
113
111
|
};
|
|
@@ -152,7 +150,7 @@ static int
|
|
|
152
150
|
can_compress(lcb_t instance, const mc_PIPELINE *pipeline,
|
|
153
151
|
const lcb_VALBUF *vbuf, lcb_datatype_t datatype)
|
|
154
152
|
{
|
|
155
|
-
|
|
153
|
+
mc_SERVER *server = (mc_SERVER *)pipeline;
|
|
156
154
|
int compressopts = LCBT_SETTING(instance, compressopts);
|
|
157
155
|
|
|
158
156
|
if (mcreq_compression_supported() == 0) {
|
|
@@ -165,8 +163,7 @@ can_compress(lcb_t instance, const mc_PIPELINE *pipeline,
|
|
|
165
163
|
if ((compressopts & LCB_COMPRESS_OUT) == 0) {
|
|
166
164
|
return 0;
|
|
167
165
|
}
|
|
168
|
-
if (server
|
|
169
|
-
(compressopts & LCB_COMPRESS_FORCE) == 0) {
|
|
166
|
+
if (mcserver_supports_compression(server) == 0 && (compressopts & LCB_COMPRESS_FORCE) == 0) {
|
|
170
167
|
return 0;
|
|
171
168
|
}
|
|
172
169
|
if (datatype & LCB_VALUE_F_SNAPPYCOMP) {
|
|
@@ -181,6 +178,7 @@ do_store3(lcb_t instance, const void *cookie,
|
|
|
181
178
|
{
|
|
182
179
|
mc_PIPELINE *pipeline;
|
|
183
180
|
mc_PACKET *packet;
|
|
181
|
+
mc_REQDATA *rdata;
|
|
184
182
|
mc_CMDQUEUE *cq = &instance->cmdq;
|
|
185
183
|
int hsize;
|
|
186
184
|
int should_compress = 0;
|
|
@@ -258,6 +256,8 @@ do_store3(lcb_t instance, const void *cookie,
|
|
|
258
256
|
int duropts = 0;
|
|
259
257
|
lcb_U16 persist_u , replicate_u;
|
|
260
258
|
const lcb_CMDSTOREDUR *dcmd = (const lcb_CMDSTOREDUR *)cmd;
|
|
259
|
+
DURSTORECTX *dctx = calloc(1, sizeof(*dctx));
|
|
260
|
+
|
|
261
261
|
persist_u = dcmd->persist_to;
|
|
262
262
|
replicate_u = dcmd->replicate_to;
|
|
263
263
|
if (dcmd->replicate_to == -1 || dcmd->persist_to == -1) {
|
|
@@ -268,19 +268,24 @@ do_store3(lcb_t instance, const void *cookie,
|
|
|
268
268
|
if (err != LCB_SUCCESS) {
|
|
269
269
|
mcreq_wipe_packet(pipeline, packet);
|
|
270
270
|
mcreq_release_packet(pipeline, packet);
|
|
271
|
+
free(dctx);
|
|
271
272
|
return err;
|
|
272
273
|
}
|
|
273
274
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
275
|
+
dctx->instance = instance;
|
|
276
|
+
dctx->persist_to = persist_u;
|
|
277
|
+
dctx->replicate_to = replicate_u;
|
|
278
|
+
packet->u_rdata.exdata = &dctx->base;
|
|
277
279
|
packet->flags |= MCREQ_F_REQEXT;
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
rdata->start = gethrtime();
|
|
280
|
+
|
|
281
|
+
dctx->base.cookie = cookie;
|
|
282
|
+
dctx->base.procs = &storedur_procs;
|
|
282
283
|
}
|
|
283
284
|
|
|
285
|
+
rdata = MCREQ_PKT_RDATA(packet);
|
|
286
|
+
rdata->cookie = cookie;
|
|
287
|
+
rdata->start = gethrtime();
|
|
288
|
+
|
|
284
289
|
scmd.message.body.expiration = htonl(cmd->exptime);
|
|
285
290
|
scmd.message.body.flags = htonl(flags);
|
|
286
291
|
hdr->request.magic = PROTOCOL_BINARY_REQ;
|
|
@@ -58,17 +58,6 @@ struct Traits {
|
|
|
58
58
|
return is_lookup ? LCB_SDMULTI_MODE_LOOKUP : LCB_SDMULTI_MODE_MUTATE;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
inline bool chk_allow_empty_path(uint32_t options) const {
|
|
62
|
-
if (allow_empty_path) {
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
if (!is_lookup) {
|
|
66
|
-
return false;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
return (options & LCB_SDSPEC_F_XATTRPATH) != 0;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
61
|
inline Traits(uint8_t op, unsigned options) :
|
|
73
62
|
allow_empty_path(options & EMPTY_PATH),
|
|
74
63
|
allow_expiry(options & ALLOW_EXPIRY),
|
|
@@ -174,28 +163,6 @@ get_valbuf_size(const lcb_VALBUF& vb)
|
|
|
174
163
|
}
|
|
175
164
|
}
|
|
176
165
|
|
|
177
|
-
static uint8_t
|
|
178
|
-
make_subdoc_flags(const uint32_t user)
|
|
179
|
-
{
|
|
180
|
-
uint8_t subdoc_flags = 0;
|
|
181
|
-
if (user & LCB_SDSPEC_F_MKINTERMEDIATES) {
|
|
182
|
-
subdoc_flags |= SUBDOC_FLAG_MKDIR_P;
|
|
183
|
-
}
|
|
184
|
-
if (user & LCB_SDSPEC_F_MKDOCUMENT) {
|
|
185
|
-
subdoc_flags |= SUBDOC_FLAG_MKDOC;
|
|
186
|
-
}
|
|
187
|
-
if (user & LCB_SDSPEC_F_XATTRPATH) {
|
|
188
|
-
subdoc_flags |= SUBDOC_FLAG_XATTR_PATH;
|
|
189
|
-
}
|
|
190
|
-
if (user & LCB_SDSPEC_F_XATTR_MACROVALUES) {
|
|
191
|
-
subdoc_flags |= (SUBDOC_FLAG_EXPAND_MACROS | SUBDOC_FLAG_XATTR_PATH);
|
|
192
|
-
}
|
|
193
|
-
if (user & LCB_SDSPEC_F_XATTR_DELETED_OK) {
|
|
194
|
-
subdoc_flags |= (SUBDOC_FLAG_XATTR_PATH|SUBDOC_FLAG_ACCESS_DELETED);
|
|
195
|
-
}
|
|
196
|
-
return subdoc_flags;
|
|
197
|
-
}
|
|
198
|
-
|
|
199
166
|
struct MultiBuilder {
|
|
200
167
|
MultiBuilder(const lcb_CMDSUBDOC *cmd_)
|
|
201
168
|
: cmd(cmd_), payload_size(0), mode(0) {
|
|
@@ -299,10 +266,17 @@ MultiBuilder::add_spec(const lcb_SDSPEC *spec)
|
|
|
299
266
|
// opcode
|
|
300
267
|
add_field(trait.opcode, 1);
|
|
301
268
|
// flags
|
|
302
|
-
|
|
269
|
+
uint8_t sdflags = 0;
|
|
270
|
+
if (spec->options & LCB_SDSPEC_F_MKINTERMEDIATES) {
|
|
271
|
+
sdflags = SUBDOC_FLAG_MKDIR_P;
|
|
272
|
+
}
|
|
273
|
+
if (spec->options & LCB_SDSPEC_F_MKDOCUMENT) {
|
|
274
|
+
sdflags |= SUBDOC_FLAG_MKDOC;
|
|
275
|
+
}
|
|
276
|
+
add_field(sdflags, 1);
|
|
303
277
|
|
|
304
278
|
uint16_t npath = static_cast<uint16_t>(spec->path.contig.nbytes);
|
|
305
|
-
if (!npath && !trait.
|
|
279
|
+
if (!npath && !trait.allow_empty_path) {
|
|
306
280
|
return LCB_EMPTY_PATH;
|
|
307
281
|
}
|
|
308
282
|
|
|
@@ -355,8 +329,7 @@ sd3_single(lcb_t instance, const void *cookie, const lcb_CMDSUBDOC *cmd)
|
|
|
355
329
|
if (LCB_KEYBUF_IS_EMPTY(&cmd->key)) {
|
|
356
330
|
return LCB_EMPTY_KEY;
|
|
357
331
|
}
|
|
358
|
-
if (LCB_KEYBUF_IS_EMPTY(&spec->path) &&
|
|
359
|
-
!traits.chk_allow_empty_path(spec->options)) {
|
|
332
|
+
if (LCB_KEYBUF_IS_EMPTY(&spec->path) && !traits.allow_empty_path) {
|
|
360
333
|
return LCB_EMPTY_PATH;
|
|
361
334
|
}
|
|
362
335
|
|
|
@@ -426,7 +399,14 @@ sd3_single(lcb_t instance, const void *cookie, const lcb_CMDSUBDOC *cmd)
|
|
|
426
399
|
ntohs(hdr->request.keylen) + get_value_size(packet));
|
|
427
400
|
|
|
428
401
|
request.message.extras.pathlen = htons(spec->path.contig.nbytes);
|
|
429
|
-
request.message.extras.subdoc_flags =
|
|
402
|
+
request.message.extras.subdoc_flags = 0;
|
|
403
|
+
|
|
404
|
+
if (spec->options & LCB_SDSPEC_F_MKINTERMEDIATES) {
|
|
405
|
+
request.message.extras.subdoc_flags |= SUBDOC_FLAG_MKDIR_P;
|
|
406
|
+
}
|
|
407
|
+
if (spec->options & LCB_SDSPEC_F_MKDOCUMENT) {
|
|
408
|
+
request.message.extras.subdoc_flags |= SUBDOC_FLAG_MKDOC;
|
|
409
|
+
}
|
|
430
410
|
|
|
431
411
|
hdr->request.opcode = traits.opcode;
|
|
432
412
|
memcpy(SPAN_BUFFER(&packet->kh_span), request.bytes, sizeof request.bytes);
|
|
File without changes
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "packetutils.h"
|
|
19
|
+
#include "rdb/rope.h"
|
|
20
|
+
|
|
21
|
+
#ifndef _WIN32 /* for win32 this is inside winsock, included in sysdefs.h */
|
|
22
|
+
#include <arpa/inet.h>
|
|
23
|
+
#endif
|
|
24
|
+
|
|
25
|
+
int
|
|
26
|
+
lcb_pktinfo_ior_get(packet_info *info, rdb_IOROPE *ior, unsigned *required)
|
|
27
|
+
{
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
void
|
|
31
|
+
lcb_pktinfo_ior_done(packet_info *info, rdb_IOROPE *ior)
|
|
32
|
+
{
|
|
33
|
+
if (!PACKET_NBODY(info)) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
rdb_consumed(ior, PACKET_NBODY(info));
|
|
37
|
+
}
|
|
@@ -43,8 +43,8 @@ public:
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
MemcachedResponse(protocol_binary_command cmd, uint32_t opaque_,
|
|
46
|
-
protocol_binary_response_status code)
|
|
47
|
-
|
|
46
|
+
protocol_binary_response_status code) {
|
|
47
|
+
std::memset(this, 0, sizeof *this);
|
|
48
48
|
res.response.opcode = cmd;
|
|
49
49
|
res.response.opaque = opaque_;
|
|
50
50
|
res.response.status = htons(code);
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
int
|
|
21
21
|
lcb_should_retry(const lcb_settings *settings, const mc_PACKET *pkt, lcb_error_t err)
|
|
22
22
|
{
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
lcb_RETRYCMDOPTS policy;
|
|
24
|
+
lcb_RETRYMODEOPTS mode;
|
|
25
25
|
protocol_binary_request_header hdr;
|
|
26
26
|
|
|
27
27
|
mcreq_read_hdr(pkt, &hdr);
|
|
@@ -70,6 +70,7 @@ lcb_should_retry(const lcb_settings *settings, const mc_PACKET *pkt, lcb_error_t
|
|
|
70
70
|
|
|
71
71
|
/* get is a safe operation which may be retried */
|
|
72
72
|
case PROTOCOL_BINARY_CMD_GET:
|
|
73
|
+
case PROTOCOL_BINARY_CMD_GETKQ:
|
|
73
74
|
case PROTOCOL_BINARY_CMD_SUBDOC_GET:
|
|
74
75
|
case PROTOCOL_BINARY_CMD_SUBDOC_EXISTS:
|
|
75
76
|
case PROTOCOL_BINARY_CMD_SUBDOC_MULTI_LOOKUP:
|
|
@@ -231,8 +231,8 @@ RetryQueue::flush(bool throttle)
|
|
|
231
231
|
* configuration (i.e. the attempt has not been throttled) then
|
|
232
232
|
* keep the command in there until it has a chance to be scheduled.
|
|
233
233
|
*/
|
|
234
|
-
get_instance()
|
|
235
|
-
if (get_instance()->confmon
|
|
234
|
+
lcb_bootstrap_common(get_instance(), LCB_BS_REFRESH_THROTTLE);
|
|
235
|
+
if (lcb_confmon_is_refreshing(get_instance()->confmon) ||
|
|
236
236
|
settings->retry[LCB_RETRY_ON_MISSINGNODE]) {
|
|
237
237
|
|
|
238
238
|
lcb_list_delete(static_cast<SchedNode*>(op));
|
|
@@ -276,8 +276,8 @@ static void op_dtorfn(mc_EPKTDATUM *d) {
|
|
|
276
276
|
delete static_cast<RetryOp*>(d);
|
|
277
277
|
}
|
|
278
278
|
|
|
279
|
-
RetryOp::RetryOp()
|
|
280
|
-
|
|
279
|
+
RetryOp::RetryOp() {
|
|
280
|
+
memset(this, 0, sizeof *this);
|
|
281
281
|
mc_EPKTDATUM::dtorfn = op_dtorfn;
|
|
282
282
|
mc_EPKTDATUM::key = RETRY_PKT_KEY;
|
|
283
283
|
}
|
|
@@ -57,7 +57,6 @@ void lcb_default_settings(lcb_settings *settings)
|
|
|
57
57
|
settings->tcp_nodelay = LCB_DEFAULT_TCP_NODELAY;
|
|
58
58
|
settings->retry_nmv_interval = LCB_DEFAULT_RETRY_NMV_INTERVAL;
|
|
59
59
|
settings->vb_noguess = LCB_DEFAULT_VB_NOGUESS;
|
|
60
|
-
settings->select_bucket = LCB_DEFAULT_SELECT_BUCKET;
|
|
61
60
|
}
|
|
62
61
|
|
|
63
62
|
LCB_INTERNAL_API
|
|
@@ -68,7 +67,6 @@ lcb_settings_new(void)
|
|
|
68
67
|
lcb_default_settings(settings);
|
|
69
68
|
settings->refcount = 1;
|
|
70
69
|
settings->auth = lcbauth_new();
|
|
71
|
-
settings->errmap = lcb_errmap_new();
|
|
72
70
|
return settings;
|
|
73
71
|
}
|
|
74
72
|
|
|
@@ -85,7 +83,6 @@ lcb_settings_unref(lcb_settings *settings)
|
|
|
85
83
|
free(settings->client_string);
|
|
86
84
|
|
|
87
85
|
lcbauth_unref(settings->auth);
|
|
88
|
-
lcb_errmap_free(settings->errmap);
|
|
89
86
|
|
|
90
87
|
if (settings->ssl_ctx) {
|
|
91
88
|
lcbio_ssl_free(settings->ssl_ctx);
|
|
@@ -84,11 +84,9 @@
|
|
|
84
84
|
#define LCB_DEFAULT_RETRY_NMV_INTERVAL LCB_MS2US(100)
|
|
85
85
|
#define LCB_DEFAULT_VB_NOGUESS 1
|
|
86
86
|
#define LCB_DEFAULT_TCP_NODELAY 1
|
|
87
|
-
#define LCB_DEFAULT_SELECT_BUCKET 0
|
|
88
87
|
|
|
89
88
|
#include "config.h"
|
|
90
89
|
#include <libcouchbase/couchbase.h>
|
|
91
|
-
#include "errmap.h"
|
|
92
90
|
|
|
93
91
|
#ifdef __cplusplus
|
|
94
92
|
extern "C" {
|
|
@@ -150,8 +148,6 @@ typedef struct lcb_settings_st {
|
|
|
150
148
|
unsigned ipv6 : 2;
|
|
151
149
|
unsigned tcp_nodelay : 1;
|
|
152
150
|
unsigned readj_ts_wait : 1;
|
|
153
|
-
unsigned use_errmap : 1;
|
|
154
|
-
unsigned select_bucket : 1;
|
|
155
151
|
|
|
156
152
|
short max_redir;
|
|
157
153
|
unsigned refcount;
|
|
@@ -169,7 +165,6 @@ typedef struct lcb_settings_st {
|
|
|
169
165
|
void (*dtorcb)(const void *);
|
|
170
166
|
void *dtorarg;
|
|
171
167
|
char *client_string;
|
|
172
|
-
lcb_pERRMAP errmap;
|
|
173
168
|
lcb_U32 retry_nmv_interval;
|
|
174
169
|
} lcb_settings;
|
|
175
170
|
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
#include "simplestring.h"
|
|
19
|
+
#include "assert.h"
|
|
20
|
+
|
|
21
|
+
static void ensure_cstr(lcb_string *str);
|
|
22
|
+
|
|
23
|
+
int lcb_string_init(lcb_string *str)
|
|
24
|
+
{
|
|
25
|
+
str->base = NULL;
|
|
26
|
+
str->nalloc = 0;
|
|
27
|
+
str->nused = 0;
|
|
28
|
+
return 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
void lcb_string_release(lcb_string *str)
|
|
32
|
+
{
|
|
33
|
+
if (str->base == NULL) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
free(str->base);
|
|
37
|
+
memset(str, 0, sizeof(*str));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
void lcb_string_clear(lcb_string *str)
|
|
41
|
+
{
|
|
42
|
+
str->nused = 0;
|
|
43
|
+
if (str->nalloc) {
|
|
44
|
+
ensure_cstr(str);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
void lcb_string_added(lcb_string *str, lcb_size_t nused)
|
|
49
|
+
{
|
|
50
|
+
str->nused += nused;
|
|
51
|
+
lcb_assert(str->nused <= str->nalloc);
|
|
52
|
+
ensure_cstr(str);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
int lcb_string_reserve(lcb_string *str, lcb_size_t size)
|
|
56
|
+
{
|
|
57
|
+
lcb_size_t newalloc;
|
|
58
|
+
char *newbuf;
|
|
59
|
+
|
|
60
|
+
/** Set size to one greater, for the terminating NUL */
|
|
61
|
+
size++;
|
|
62
|
+
if (!size) {
|
|
63
|
+
return -1;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (str->nalloc - str->nused >= size) {
|
|
67
|
+
return 0;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
newalloc = str->nalloc;
|
|
71
|
+
if (!newalloc) {
|
|
72
|
+
newalloc = 1;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
while (newalloc - str->nused < size) {
|
|
76
|
+
if (newalloc * 2 < newalloc) {
|
|
77
|
+
return -1;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
newalloc *= 2;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
newbuf = realloc(str->base, newalloc);
|
|
84
|
+
if (newbuf == NULL) {
|
|
85
|
+
return -1;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
str->base = newbuf;
|
|
89
|
+
str->nalloc = newalloc;
|
|
90
|
+
return 0;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
static void ensure_cstr(lcb_string *str)
|
|
94
|
+
{
|
|
95
|
+
str->base[str->nused] = '\0';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
int lcb_string_append(lcb_string *str, const void *data, lcb_size_t size)
|
|
99
|
+
{
|
|
100
|
+
if (lcb_string_reserve(str, size)) {
|
|
101
|
+
return -1;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
memcpy(str->base + str->nused, data, size);
|
|
105
|
+
str->nused += size;
|
|
106
|
+
ensure_cstr(str);
|
|
107
|
+
return 0;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
int lcb_string_appendz(lcb_string *str, const char *s)
|
|
111
|
+
{
|
|
112
|
+
return lcb_string_append(str, s, strlen(s));
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
int lcb_string_appendv(lcb_string *str, ...)
|
|
116
|
+
{
|
|
117
|
+
va_list ap;
|
|
118
|
+
va_start(ap, str);
|
|
119
|
+
|
|
120
|
+
while (1) {
|
|
121
|
+
size_t len;
|
|
122
|
+
int rc;
|
|
123
|
+
const char *ptr;
|
|
124
|
+
|
|
125
|
+
if ((ptr = va_arg(ap, const char *)) == NULL) {
|
|
126
|
+
return 0;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
len = va_arg(ap, size_t);
|
|
130
|
+
if (len == (size_t)-1) {
|
|
131
|
+
len = strlen(ptr);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
rc = lcb_string_append(str, ptr, len);
|
|
135
|
+
if (rc != 0) {
|
|
136
|
+
return -1;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
int lcb_string_rbappend(lcb_string *str, ringbuffer_t *rb, int rbadvance)
|
|
143
|
+
{
|
|
144
|
+
lcb_size_t expected, nw;
|
|
145
|
+
expected = rb->nbytes;
|
|
146
|
+
if (!expected) {
|
|
147
|
+
return 0;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (lcb_string_reserve(str, expected)) {
|
|
151
|
+
return -1;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
nw = ringbuffer_peek(rb, lcb_string_tail(str), expected);
|
|
155
|
+
if (nw != expected) {
|
|
156
|
+
return -1;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (rbadvance) {
|
|
160
|
+
ringbuffer_consumed(rb, nw);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
lcb_string_added(str, nw);
|
|
164
|
+
return 0;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
void lcb_string_erase_end(lcb_string *str, lcb_size_t to_remove)
|
|
168
|
+
{
|
|
169
|
+
lcb_assert(to_remove <= str->nused);
|
|
170
|
+
str->nused -= to_remove;
|
|
171
|
+
ensure_cstr(str);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
void lcb_string_erase_beginning(lcb_string *str, lcb_size_t to_remove)
|
|
175
|
+
{
|
|
176
|
+
lcb_assert(to_remove <= str->nused);
|
|
177
|
+
if (!to_remove) {
|
|
178
|
+
str->nused = 0;
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
memmove(str->base, str->base + to_remove, str->nused - to_remove);
|
|
183
|
+
str->nused -= to_remove;
|
|
184
|
+
ensure_cstr(str);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
int lcb_string_insert(lcb_string *str, size_t at, const char *src, size_t nsrc)
|
|
188
|
+
{
|
|
189
|
+
if (!nsrc) {
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
192
|
+
if (at == str->nused) {
|
|
193
|
+
return lcb_string_append(str, src, nsrc);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
if (lcb_string_reserve(str, nsrc) != 0) {
|
|
197
|
+
return -1;
|
|
198
|
+
}
|
|
199
|
+
memmove(str->base + at + nsrc, str->base + at, str->nused - at);
|
|
200
|
+
memcpy(str->base + at, src, nsrc);
|
|
201
|
+
str->nused += nsrc;
|
|
202
|
+
ensure_cstr(str);
|
|
203
|
+
return 0;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
void lcb_string_transfer(lcb_string *from, lcb_string *to)
|
|
207
|
+
{
|
|
208
|
+
lcb_assert(to->base == NULL);
|
|
209
|
+
*to = *from;
|
|
210
|
+
memset(from, 0, sizeof(*from));
|
|
211
|
+
}
|