libcouchbase 0.0.7 → 0.0.8
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/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
|
@@ -18,12 +18,52 @@
|
|
|
18
18
|
#ifndef LCB_DURABILITY_INTERNAL_H
|
|
19
19
|
#define LCB_DURABILITY_INTERNAL_H
|
|
20
20
|
|
|
21
|
-
#include "simplestring.h"
|
|
22
|
-
#include "ssobuf.h"
|
|
23
21
|
#ifdef __cplusplus
|
|
22
|
+
#include "mctx-helper.h"
|
|
23
|
+
|
|
24
24
|
extern "C" {
|
|
25
25
|
#endif
|
|
26
26
|
|
|
27
|
+
/**
|
|
28
|
+
* @name internal durability functions
|
|
29
|
+
* These functions are used internally beyond the durability module.
|
|
30
|
+
* @{
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Called from the OBSERVE codebase to update an item's status for CAS-based
|
|
35
|
+
* observe
|
|
36
|
+
*/
|
|
37
|
+
void lcbdur_cas_update(lcb_t, void *dset, lcb_error_t, const lcb_RESPOBSERVE *);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Called from the OBSERVE codebase to update an item's status for seqno-based
|
|
41
|
+
* observe
|
|
42
|
+
*/
|
|
43
|
+
void lcbdur_update_seqno(lcb_t, void *dset, const lcb_RESPOBSEQNO*);
|
|
44
|
+
|
|
45
|
+
/** Indicate that this durability command context is for an original storage op */
|
|
46
|
+
void lcbdurctx_set_durstore(lcb_MULTICMD_CTX *ctx, int enabled);
|
|
47
|
+
|
|
48
|
+
void lcbdur_destroy(void *dset);
|
|
49
|
+
|
|
50
|
+
/** Called from durability-cas to request an OBSERVE with a special callback */
|
|
51
|
+
lcb_MULTICMD_CTX *lcb_observe_ctx_dur_new(lcb_t instance);
|
|
52
|
+
|
|
53
|
+
/**@}
|
|
54
|
+
*
|
|
55
|
+
* The rest of this file is internal to the various durability operations and
|
|
56
|
+
* is not accessed by the rest of the codebase
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
#ifdef __cplusplus
|
|
60
|
+
}
|
|
61
|
+
#endif
|
|
62
|
+
|
|
63
|
+
#ifdef LCBDUR_PRIV_SYMS
|
|
64
|
+
namespace lcb {
|
|
65
|
+
namespace durability {
|
|
66
|
+
|
|
27
67
|
/**
|
|
28
68
|
* Here is the internal API for the durability functions.
|
|
29
69
|
*
|
|
@@ -42,158 +82,206 @@ extern "C" {
|
|
|
42
82
|
* persisted to or replicated to. This is tied to a given mc_SERVER
|
|
43
83
|
* instance.
|
|
44
84
|
*/
|
|
45
|
-
|
|
46
|
-
const
|
|
85
|
+
struct ServerInfo {
|
|
86
|
+
const lcb::Server *server; /**< Server pointer (for comparison only) */
|
|
47
87
|
lcb_U16 persisted; /**< Exists on server */
|
|
48
88
|
lcb_U16 exists; /**< Persisted to server */
|
|
49
|
-
|
|
89
|
+
|
|
90
|
+
ServerInfo() : server(NULL), persisted(0), exists(0) {
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
void clear() {
|
|
94
|
+
server = NULL;
|
|
95
|
+
persisted = 0;
|
|
96
|
+
exists = 0;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
struct Durset;
|
|
101
|
+
|
|
102
|
+
// For use in conjunction with MCREQ_F_PRIVCALLBACK
|
|
103
|
+
struct CallbackCookie {
|
|
104
|
+
lcb_RESPCALLBACK callback;
|
|
105
|
+
};
|
|
50
106
|
|
|
51
107
|
/**Information a single entry in a durability set. Each entry contains a single
|
|
52
108
|
* key */
|
|
53
|
-
|
|
109
|
+
struct Item : public CallbackCookie {
|
|
110
|
+
/**
|
|
111
|
+
* Returns true if the entry is complete, false otherwise. This only assumes
|
|
112
|
+
* successful entries.
|
|
113
|
+
*/
|
|
114
|
+
bool is_all_done() const;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Determine if this item has been satisfied on a specific server. This
|
|
118
|
+
* function is used to determine if a probe should be sent to the server.
|
|
119
|
+
*
|
|
120
|
+
* If there are no items "tied" to the server (because they have all been
|
|
121
|
+
* completed) then we employ a bandwidth saving optimization by not sending
|
|
122
|
+
* additional probes to it.
|
|
123
|
+
*
|
|
124
|
+
* @param info Server to check against
|
|
125
|
+
* @param is_master If this server is the master for the item's vbucket
|
|
126
|
+
*
|
|
127
|
+
* @return true if the item is both persisted and replicated on the server,
|
|
128
|
+
* OR if the item has been replicated, but replication is not
|
|
129
|
+
* required for the item.
|
|
130
|
+
*/
|
|
131
|
+
bool is_server_done(const ServerInfo& info, bool is_master) const;
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Updates the state of the given entry and synchronizes it with the
|
|
135
|
+
* current server list.
|
|
136
|
+
*
|
|
137
|
+
* Specifically this function will return a list of
|
|
138
|
+
* servers which still need to be contacted, and will increment internal
|
|
139
|
+
* counters on behalf of those (still active) servers which the item has
|
|
140
|
+
* already been replicated to (and persisted to, if requested).
|
|
141
|
+
*
|
|
142
|
+
* This will invalidate any cached information of the cluster configuration
|
|
143
|
+
* in respect to this item has changed -- this includes things like servers
|
|
144
|
+
* moving indices or being recreated entirely.
|
|
145
|
+
*
|
|
146
|
+
* This function should be called during poll().
|
|
147
|
+
* @param[out] ixarray An array of server indices which should be queried
|
|
148
|
+
* @return the number of effective entries in the array.
|
|
149
|
+
*/
|
|
150
|
+
size_t prepare(uint16_t ixarray[4]);
|
|
151
|
+
|
|
152
|
+
enum UpdateFlags {
|
|
153
|
+
NO_CHANGES = 0x00,
|
|
154
|
+
UPDATE_PERSISTED = 0x01,
|
|
155
|
+
UPDATE_REPLICATED = 0x02
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* Update an item's status.
|
|
160
|
+
* @param flags OR'd set of UPDATE_PERSISTED and UPDATE_REPLICATED
|
|
161
|
+
* @param ix The server index
|
|
162
|
+
*/
|
|
163
|
+
void update(int flags, int srvix);
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Set the logical state of the entry to done, and invoke the callback.
|
|
167
|
+
* It is safe to call this multiple times
|
|
168
|
+
*/
|
|
169
|
+
void finish();
|
|
170
|
+
|
|
171
|
+
void finish(lcb_error_t err) {
|
|
172
|
+
result.rc = err;
|
|
173
|
+
finish();
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
lcb_RESPENDURE& res() { return result; }
|
|
177
|
+
const lcb_RESPENDURE& res() const { return result; }
|
|
178
|
+
ServerInfo* get_server_info(int index);
|
|
179
|
+
|
|
54
180
|
lcb_U64 reqcas; /**< Last known CAS for the user */
|
|
55
181
|
lcb_U64 reqseqno; /**< Last known seqno for the user */
|
|
56
182
|
lcb_U64 uuid;
|
|
57
183
|
lcb_RESPENDURE result; /**< Result to be passed to user */
|
|
58
|
-
|
|
59
|
-
lcb_RESPCALLBACK callback; /**< For F_INTERNAL_CALLBACK */
|
|
184
|
+
Durset *parent;
|
|
60
185
|
lcb_U16 vbid; /**< vBucket ID (computed via hashkey) */
|
|
61
186
|
lcb_U8 done; /**< Whether we have a conclusive result for this entry */
|
|
62
187
|
|
|
63
188
|
/** Array of servers which have satisfied constraints */
|
|
64
|
-
|
|
65
|
-
} lcb_DURITEM;
|
|
66
|
-
|
|
67
|
-
struct lcbdur_PROCS_st;
|
|
68
|
-
|
|
69
|
-
enum {
|
|
70
|
-
LCBDUR_STATE_OBSPOLL = 0,
|
|
71
|
-
LCBDUR_STATE_INIT,
|
|
72
|
-
LCBDUR_STATE_TIMEOUT,
|
|
73
|
-
LCBDUR_STATE_IGNORE
|
|
189
|
+
ServerInfo sinfo[4];
|
|
74
190
|
};
|
|
75
191
|
|
|
76
192
|
/**
|
|
77
193
|
* A collection encompassing one or more entries which are to be checked for
|
|
78
194
|
* persistence
|
|
79
195
|
*/
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
unsigned refcnt; /**< Reference count */
|
|
87
|
-
unsigned next_state; /**< Internal state */
|
|
88
|
-
lcb_error_t lasterr;
|
|
89
|
-
int is_durstore; /** Whether the callback should be DURSTORE */
|
|
90
|
-
lcb_string kvbufs; /**< Backing storage for key buffers */
|
|
91
|
-
const void *cookie; /**< User cookie */
|
|
92
|
-
hrtime_t ns_timeout; /**< Timestamp of next timeout */
|
|
93
|
-
void *timer;
|
|
94
|
-
lcb_t instance;
|
|
95
|
-
void *impldata;
|
|
96
|
-
} lcb_DURSET;
|
|
97
|
-
|
|
98
|
-
typedef struct lcbdur_PROCS_st {
|
|
99
|
-
lcb_error_t (*poll)(lcb_DURSET *dset);
|
|
100
|
-
lcb_error_t (*ent_add)(lcb_DURSET*,lcb_DURITEM*,const lcb_CMDENDURE*);
|
|
101
|
-
lcb_error_t (*schedule)(lcb_DURSET*);
|
|
102
|
-
void (*clean)(lcb_DURSET*);
|
|
103
|
-
} lcbdur_PROCS;
|
|
104
|
-
|
|
105
|
-
void
|
|
106
|
-
lcbdur_cas_update(lcb_t instance, lcb_DURSET *dset, lcb_error_t err,
|
|
107
|
-
const lcb_RESPOBSERVE *resp);
|
|
108
|
-
void
|
|
109
|
-
lcbdur_update_seqno(lcb_t instance, lcb_DURSET *dset,
|
|
110
|
-
const lcb_RESPOBSEQNO *resp);
|
|
111
|
-
|
|
112
|
-
/** Indicate that this durability command context is for an original storage op */
|
|
113
|
-
void
|
|
114
|
-
lcbdurctx_set_durstore(lcb_MULTICMD_CTX *ctx, int enabled);
|
|
196
|
+
struct Durset : public MultiCmdContext {
|
|
197
|
+
/**
|
|
198
|
+
* Call this when the polling method (poll_impl()) has completed. This will
|
|
199
|
+
* trigger a new poll after the interval.
|
|
200
|
+
*/
|
|
201
|
+
void on_poll_done();
|
|
115
202
|
|
|
116
|
-
|
|
117
|
-
lcb_observe_ctx_dur_new(lcb_t instance);
|
|
203
|
+
void incref() { refcnt++; }
|
|
118
204
|
|
|
119
|
-
|
|
205
|
+
/**
|
|
206
|
+
* Decrement the refcount for the 'dset'. When it hits zero then the dset is
|
|
207
|
+
* freed
|
|
208
|
+
*/
|
|
209
|
+
void decref() { if (!--refcnt) { delete this; } }
|
|
120
210
|
|
|
121
|
-
|
|
122
|
-
|
|
211
|
+
enum State {
|
|
212
|
+
STATE_OBSPOLL,
|
|
213
|
+
STATE_INIT,
|
|
214
|
+
STATE_TIMEOUT,
|
|
215
|
+
STATE_IGNORE
|
|
216
|
+
};
|
|
123
217
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
#define DSET_PROCS(ds) ((ds)->opts.pollopts == LCB_DURABILITY_MODE_CAS \
|
|
130
|
-
? (&lcbdur_cas_procs) : (&lcbdur_seqno_procs))
|
|
131
|
-
#define ENT_NUMINFO(ent) 4
|
|
218
|
+
/**
|
|
219
|
+
* Schedules us to be notified with the given state within a particular amount
|
|
220
|
+
* of time. This is used both for the timeout and for the interval
|
|
221
|
+
*/
|
|
222
|
+
void switch_state(State state);
|
|
132
223
|
|
|
133
|
-
/**
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
224
|
+
/**
|
|
225
|
+
* Called from mctx_schedule(). This allows implementations to do any
|
|
226
|
+
* additional bookeeping, having guaranteed that all items are now
|
|
227
|
+
* added.
|
|
228
|
+
*/
|
|
229
|
+
virtual lcb_error_t prepare_schedule() {
|
|
230
|
+
return LCB_SUCCESS;
|
|
231
|
+
}
|
|
138
232
|
|
|
139
|
-
/**
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
233
|
+
/**
|
|
234
|
+
* Called from mctx_add. Called to register any item-specific data (i.e.
|
|
235
|
+
* to associate item data with internal structures)
|
|
236
|
+
* @param itm the newly added item
|
|
237
|
+
* @param the original command, for more context
|
|
238
|
+
*/
|
|
239
|
+
virtual lcb_error_t after_add(Item&, const lcb_CMDENDURE*) {
|
|
240
|
+
return LCB_SUCCESS;
|
|
241
|
+
}
|
|
144
242
|
|
|
145
|
-
/**
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
243
|
+
/**
|
|
244
|
+
* Called to actually check for persistence/replication. This must be
|
|
245
|
+
* implemented.
|
|
246
|
+
*/
|
|
247
|
+
virtual lcb_error_t poll_impl() = 0;
|
|
149
248
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
* current server list.
|
|
153
|
-
*
|
|
154
|
-
* Specifically this function will return a list of
|
|
155
|
-
* servers which still need to be contacted, and will increment internal
|
|
156
|
-
* counters on behalf of those (still active) servers which the item has
|
|
157
|
-
* already been replicated to (and persisted to, if requested).
|
|
158
|
-
*
|
|
159
|
-
* This will invalidate any cached information of the cluster configuration
|
|
160
|
-
* in respect to this item has changed -- this includes things like servers
|
|
161
|
-
* moving indices or being recreated entirely.
|
|
162
|
-
*
|
|
163
|
-
* This function should be called during poll().
|
|
164
|
-
* @param item The item to update
|
|
165
|
-
* @param[out] ixarray An array of server indices which should be queried
|
|
166
|
-
* @param[out] nitems the number of effective entries in the array.
|
|
167
|
-
*/
|
|
168
|
-
void
|
|
169
|
-
lcbdur_prepare_item(lcb_DURITEM *item, lcb_U16 *ixarray, size_t *nitems);
|
|
249
|
+
virtual ~Durset();
|
|
250
|
+
Durset(lcb_t instance, const lcb_durability_opts_t* options);
|
|
170
251
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
* @param item The item to update
|
|
176
|
-
* @param flags OR'd set of UPDATE_PERSISTED and UPDATE_REPLICATED
|
|
177
|
-
* @param ix The server index
|
|
178
|
-
*/
|
|
179
|
-
void
|
|
180
|
-
lcbdur_update_item(lcb_DURITEM *item, int flags, int ix);
|
|
252
|
+
// Implementation for MULTICMD_CTX
|
|
253
|
+
lcb_error_t MCTX_done(const void *cookie);
|
|
254
|
+
lcb_error_t MCTX_addcmd(const lcb_CMDBASE *cmd);
|
|
255
|
+
void MCTX_fail();
|
|
181
256
|
|
|
182
|
-
|
|
183
|
-
|
|
257
|
+
/**
|
|
258
|
+
* This function calls poll_impl(). The implementation should then call
|
|
259
|
+
* on_poll_done() once the polling is finished
|
|
260
|
+
*/
|
|
261
|
+
inline void poll();
|
|
184
262
|
|
|
185
|
-
/**
|
|
186
|
-
|
|
187
|
-
* of time. This is used both for the timeout and for the interval
|
|
188
|
-
*/
|
|
189
|
-
void lcbdur_switch_state(lcb_DURSET *dset, unsigned int state);
|
|
190
|
-
#define lcbdur_ref(dset) (dset)->refcnt++;
|
|
191
|
-
void lcbdur_unref(lcb_DURSET *dset);
|
|
263
|
+
/** Called after timeouts and intervals. */
|
|
264
|
+
inline void tick();
|
|
192
265
|
|
|
193
|
-
|
|
266
|
+
static Durset* createCasDurset(lcb_t, const lcb_durability_opts_t*);
|
|
267
|
+
static Durset* createSeqnoDurset(lcb_t, const lcb_durability_opts_t*);
|
|
194
268
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
269
|
+
lcb_DURABILITYOPTSv0 opts; /**< Sanitized user options */
|
|
270
|
+
std::vector<Item> entries;
|
|
271
|
+
unsigned nremaining; /**< Number of entries remaining to poll for */
|
|
272
|
+
int waiting; /**< Set if currently awaiting an observe callback */
|
|
273
|
+
unsigned refcnt; /**< Reference count */
|
|
274
|
+
State next_state; /**< Internal state */
|
|
275
|
+
lcb_error_t lasterr;
|
|
276
|
+
bool is_durstore; /** Whether the callback should be DURSTORE */
|
|
277
|
+
std::string kvbufs; /**< Backing storage for key buffers */
|
|
278
|
+
const void *cookie; /**< User cookie */
|
|
279
|
+
hrtime_t ns_timeout; /**< Timestamp of next timeout */
|
|
280
|
+
void *timer;
|
|
281
|
+
lcb_t instance;
|
|
282
|
+
};
|
|
198
283
|
|
|
199
|
-
|
|
284
|
+
} // namespace durability
|
|
285
|
+
} // namespace lcb
|
|
286
|
+
#endif // __cplusplus
|
|
287
|
+
#endif // LCB_DURABILITY_INTERNAL_H
|
|
@@ -181,28 +181,31 @@ lcb_unlock(lcb_t instance, const void *cookie, lcb_size_t num,
|
|
|
181
181
|
}
|
|
182
182
|
}
|
|
183
183
|
|
|
184
|
-
|
|
185
|
-
|
|
184
|
+
struct RGetCookie : mc_REQDATAEX {
|
|
185
|
+
RGetCookie(const void *cookie, lcb_t instance, lcb_replica_t, int vb);
|
|
186
|
+
void decref() {
|
|
187
|
+
if (!--remaining) {
|
|
188
|
+
delete this;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
186
192
|
unsigned r_cur;
|
|
187
193
|
unsigned r_max;
|
|
188
194
|
int remaining;
|
|
189
195
|
int vbucket;
|
|
190
196
|
lcb_replica_t strategy;
|
|
191
197
|
lcb_t instance;
|
|
192
|
-
}
|
|
198
|
+
};
|
|
193
199
|
|
|
194
200
|
static void rget_dtor(mc_PACKET *pkt) {
|
|
195
|
-
|
|
196
|
-
if (! --rck->remaining) {
|
|
197
|
-
free(rck);
|
|
198
|
-
}
|
|
201
|
+
static_cast<RGetCookie*>(pkt->u_rdata.exdata)->decref();
|
|
199
202
|
}
|
|
200
203
|
|
|
201
204
|
static void
|
|
202
|
-
rget_callback(mc_PIPELINE
|
|
205
|
+
rget_callback(mc_PIPELINE *, mc_PACKET *pkt, lcb_error_t err, const void *arg)
|
|
203
206
|
{
|
|
204
|
-
|
|
205
|
-
lcb_RESPGET *resp = (void
|
|
207
|
+
RGetCookie *rck = static_cast<RGetCookie*>(pkt->u_rdata.exdata);
|
|
208
|
+
lcb_RESPGET *resp = reinterpret_cast<lcb_RESPGET*>(const_cast<void*>(arg));
|
|
206
209
|
lcb_RESPCALLBACK callback;
|
|
207
210
|
lcb_t instance = rck->instance;
|
|
208
211
|
|
|
@@ -247,11 +250,7 @@ rget_callback(mc_PIPELINE *pl, mc_PACKET *pkt, lcb_error_t err, const void *arg)
|
|
|
247
250
|
rck->remaining = 2;
|
|
248
251
|
}
|
|
249
252
|
}
|
|
250
|
-
|
|
251
|
-
if (!--rck->remaining) {
|
|
252
|
-
free(rck);
|
|
253
|
-
}
|
|
254
|
-
(void)pl;
|
|
253
|
+
rck->decref();
|
|
255
254
|
}
|
|
256
255
|
|
|
257
256
|
static mc_REQDATAPROCS rget_procs = {
|
|
@@ -259,6 +258,13 @@ static mc_REQDATAPROCS rget_procs = {
|
|
|
259
258
|
rget_dtor
|
|
260
259
|
};
|
|
261
260
|
|
|
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
|
+
|
|
262
268
|
LIBCOUCHBASE_API
|
|
263
269
|
lcb_error_t
|
|
264
270
|
lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
@@ -271,7 +277,6 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
271
277
|
int vbid, ixtmp;
|
|
272
278
|
protocol_binary_request_header req;
|
|
273
279
|
unsigned r0, r1 = 0;
|
|
274
|
-
rget_cookie *rck = NULL;
|
|
275
280
|
|
|
276
281
|
if (LCB_KEYBUF_IS_EMPTY(&cmd->key)) {
|
|
277
282
|
return LCB_EMPTY_KEY;
|
|
@@ -323,15 +328,7 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
323
328
|
}
|
|
324
329
|
|
|
325
330
|
/* Initialize the cookie */
|
|
326
|
-
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;
|
|
331
|
+
RGetCookie *rck = new RGetCookie(cookie, instance, cmd->strategy, vbid);
|
|
335
332
|
|
|
336
333
|
/* Initialize the packet */
|
|
337
334
|
req.request.magic = PROTOCOL_BINARY_REQ;
|
|
@@ -343,6 +340,7 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
343
340
|
req.request.keylen = htons((lcb_uint16_t)cmd->key.contig.nbytes);
|
|
344
341
|
req.request.bodylen = htonl((lcb_uint32_t)cmd->key.contig.nbytes);
|
|
345
342
|
|
|
343
|
+
rck->r_cur = r0;
|
|
346
344
|
do {
|
|
347
345
|
int curix;
|
|
348
346
|
mc_PIPELINE *pl;
|
|
@@ -359,7 +357,7 @@ lcb_rget3(lcb_t instance, const void *cookie, const lcb_CMDGETREPLICA *cmd)
|
|
|
359
357
|
return LCB_CLIENT_ENOMEM;
|
|
360
358
|
}
|
|
361
359
|
|
|
362
|
-
pkt->u_rdata.exdata =
|
|
360
|
+
pkt->u_rdata.exdata = rck;
|
|
363
361
|
pkt->flags |= MCREQ_F_REQEXT;
|
|
364
362
|
|
|
365
363
|
mcreq_reserve_key(pl, pkt, sizeof(req.bytes), &cmd->key);
|