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
|
@@ -23,16 +23,7 @@
|
|
|
23
23
|
#include "settings.h"
|
|
24
24
|
#include "hostlist.h"
|
|
25
25
|
#ifdef __cplusplus
|
|
26
|
-
namespace lcb {
|
|
27
|
-
namespace io {
|
|
28
|
-
struct Connstart;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
typedef lcb::io::Connstart* lcbio_pCONNSTART;
|
|
32
26
|
extern "C" {
|
|
33
|
-
#else
|
|
34
|
-
struct lcbio_CONNSTART;
|
|
35
|
-
typedef struct lcbio_CONNSTART* lcbio_pCONNSTART;
|
|
36
27
|
#endif
|
|
37
28
|
|
|
38
29
|
/**
|
|
@@ -48,9 +39,11 @@ typedef struct lcbio_CONNSTART* lcbio_pCONNSTART;
|
|
|
48
39
|
* @{
|
|
49
40
|
*/
|
|
50
41
|
|
|
42
|
+
struct lcbio_CONNSTART;
|
|
51
43
|
struct lcbio_MGRREQ;
|
|
52
44
|
|
|
53
45
|
/** @brief Pending connection request */
|
|
46
|
+
typedef struct lcbio_CONNSTART *lcbio_pCONNSTART;
|
|
54
47
|
typedef struct lcbio_MGRREQ *lcbio_pMGRREQ;
|
|
55
48
|
typedef struct lcbio_TABLE *lcbio_pTABLE;
|
|
56
49
|
typedef struct lcbio_TIMER *lcbio_pTIMER, *lcbio_pASYNC;
|
|
@@ -148,7 +148,7 @@ lcbio_ctx_close_ex(lcbio_CTX *ctx, lcbio_CTXCLOSE_cb cb, void *arg,
|
|
|
148
148
|
}
|
|
149
149
|
|
|
150
150
|
oldrc = ctx->sock->refcount;
|
|
151
|
-
lcb_log(LOGARGS(ctx, DEBUG), CTX_LOGFMT "Destroying
|
|
151
|
+
lcb_log(LOGARGS(ctx, DEBUG), CTX_LOGFMT "Destroying. PND=%d,ENT=%d,SORC=%d", CTX_LOGID(ctx), (int)ctx->npending, (int)ctx->entered, oldrc);
|
|
152
152
|
|
|
153
153
|
if (cb) {
|
|
154
154
|
int reusable =
|
|
@@ -37,6 +37,22 @@
|
|
|
37
37
|
extern "C" {
|
|
38
38
|
#endif
|
|
39
39
|
|
|
40
|
+
typedef struct lcbio_TABLE {
|
|
41
|
+
lcb_io_opt_t p;
|
|
42
|
+
lcb_iomodel_t model;
|
|
43
|
+
lcb_timer_procs timer;
|
|
44
|
+
lcb_loop_procs loop;
|
|
45
|
+
|
|
46
|
+
union {
|
|
47
|
+
struct {
|
|
48
|
+
lcb_ev_procs ev;
|
|
49
|
+
lcb_bsd_procs io;
|
|
50
|
+
} v0;
|
|
51
|
+
lcb_completion_procs completion;
|
|
52
|
+
} u_io;
|
|
53
|
+
unsigned refcount;
|
|
54
|
+
void (*dtor)(void *);
|
|
55
|
+
} lcbio_TABLE;
|
|
40
56
|
|
|
41
57
|
/** Whether the underlying model is event-based */
|
|
42
58
|
#define IOT_IS_EVENT(iot) ((iot)->model == LCB_IOMODEL_EVENT)
|
|
@@ -62,67 +78,6 @@ extern "C" {
|
|
|
62
78
|
/** First argument to IO Table */
|
|
63
79
|
#define IOT_ARG(iot) (iot)->p
|
|
64
80
|
|
|
65
|
-
typedef struct lcbio_TABLE {
|
|
66
|
-
lcb_io_opt_t p;
|
|
67
|
-
lcb_iomodel_t model;
|
|
68
|
-
lcb_timer_procs timer;
|
|
69
|
-
lcb_loop_procs loop;
|
|
70
|
-
|
|
71
|
-
union {
|
|
72
|
-
struct {
|
|
73
|
-
lcb_ev_procs ev;
|
|
74
|
-
lcb_bsd_procs io;
|
|
75
|
-
} v0;
|
|
76
|
-
lcb_completion_procs completion;
|
|
77
|
-
} u_io;
|
|
78
|
-
unsigned refcount;
|
|
79
|
-
void (*dtor)(void *);
|
|
80
|
-
|
|
81
|
-
#ifdef __cplusplus
|
|
82
|
-
bool is_E() const { return IOT_IS_EVENT(this); }
|
|
83
|
-
bool is_C() const { return !is_E(); }
|
|
84
|
-
int get_errno() const { return IOT_ERRNO(this); }
|
|
85
|
-
|
|
86
|
-
void run_loop() { IOT_START(this); }
|
|
87
|
-
void stop_loop() { IOT_STOP(this); }
|
|
88
|
-
|
|
89
|
-
int E_connect(lcb_socket_t sock, const sockaddr* saddr, unsigned addrlen) {
|
|
90
|
-
return IOT_V0IO(this).connect0(p, sock, saddr, addrlen);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
void E_close(lcb_socket_t sock) {
|
|
94
|
-
IOT_V0IO(this).close(p, sock);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
void *E_event_create() {
|
|
98
|
-
return IOT_V0EV(this).create(p);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
void E_event_watch(lcb_socket_t fd, void *event, short mask, void *arg,
|
|
102
|
-
lcb_ioE_callback cb) {
|
|
103
|
-
IOT_V0EV(this).watch(p, fd, event, mask, arg, cb);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
void E_event_destroy(void *event) {
|
|
107
|
-
IOT_V0EV(this).destroy(p, event);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
void E_event_cancel(lcb_socket_t fd, void *event) {
|
|
111
|
-
IOT_V0EV(this).cancel(p, fd, event);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
void C_close(lcb_sockdata_t *sd) {
|
|
115
|
-
IOT_V1(this).close(p, sd);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
int C_connect(lcb_sockdata_t *sd, const sockaddr *addr, unsigned addrlen,
|
|
119
|
-
lcb_io_connect_cb callback) {
|
|
120
|
-
return IOT_V1(this).connect(p, sd, addr, addrlen, callback);
|
|
121
|
-
}
|
|
122
|
-
#endif
|
|
123
|
-
|
|
124
|
-
} lcbio_TABLE;
|
|
125
|
-
|
|
126
81
|
#ifdef __cplusplus
|
|
127
82
|
}
|
|
128
83
|
#endif
|
|
@@ -142,7 +142,7 @@ typedef struct {
|
|
|
142
142
|
#define LCBIO_CONNREQ_POOLED 2
|
|
143
143
|
#define LCBIO_CONNREQ_GENERIC 3
|
|
144
144
|
union {
|
|
145
|
-
|
|
145
|
+
struct lcbio_CONNSTART *cs; /**< from lcbio_connect() */
|
|
146
146
|
struct lcbio_MGRREQ *preq; /**< from lcbio_mgr_get() */
|
|
147
147
|
void *p_generic; /**< Generic pointer. Destroyed via the dtor field */
|
|
148
148
|
} u;
|
|
@@ -314,11 +314,11 @@ start_new_connection(mgr_HOST *he, uint32_t tmo)
|
|
|
314
314
|
|
|
315
315
|
err = lcb_host_parsez(&tmphost, he->key, 80);
|
|
316
316
|
if (err != LCB_SUCCESS) {
|
|
317
|
-
lcb_log(LOGARGS(he->parent, ERROR), HE_LOGFMT "Could not parse host! Will supply dummy host
|
|
317
|
+
lcb_log(LOGARGS(he->parent, ERROR), HE_LOGFMT "Could not parse host! Will supply dummy host", HE_LOGID(he));
|
|
318
318
|
strcpy(tmphost.host, "BADHOST");
|
|
319
319
|
strcpy(tmphost.port, "BADPORT");
|
|
320
320
|
}
|
|
321
|
-
lcb_log(LOGARGS(he->parent,
|
|
321
|
+
lcb_log(LOGARGS(he->parent, DEBUG), HE_LOGFMT "Starting connection on I=%p", HE_LOGID(he), (void*)info);
|
|
322
322
|
|
|
323
323
|
info->cs = lcbio_connect(he->parent->io, he->parent->settings, &tmphost,
|
|
324
324
|
tmo, on_connected, info);
|
|
@@ -179,17 +179,10 @@ typedef struct {
|
|
|
179
179
|
* packets, or when the packet itself is generated internally rather than
|
|
180
180
|
* on behalf of an API request.
|
|
181
181
|
*/
|
|
182
|
-
typedef struct
|
|
182
|
+
typedef struct {
|
|
183
183
|
const void *cookie; /**< User data */
|
|
184
184
|
hrtime_t start; /**< Start time */
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
#ifdef __cplusplus
|
|
188
|
-
mc_REQDATAEX(const void *cookie_,
|
|
189
|
-
const mc_REQDATAPROCS &procs_, hrtime_t start_)
|
|
190
|
-
: cookie(cookie_), start(start_), procs(&procs_) {
|
|
191
|
-
}
|
|
192
|
-
#endif
|
|
185
|
+
mc_REQDATAPROCS *procs; /**< Common routines for the packet */
|
|
193
186
|
} mc_REQDATAEX;
|
|
194
187
|
|
|
195
188
|
/**
|
|
@@ -29,8 +29,6 @@
|
|
|
29
29
|
#define LOGARGS_T(lvl) LOGARGS(this, lvl)
|
|
30
30
|
|
|
31
31
|
#define LOGFMT "<%s:%s> (SRV=%p,IX=%d) "
|
|
32
|
-
#define PKTFMT "OP=0x%x, RC=0x%x, SEQ=%u"
|
|
33
|
-
#define PKTARGS(pkt) (pkt).opcode(), (pkt).status(), (pkt).opaque()
|
|
34
32
|
|
|
35
33
|
#define LOGID(server) get_ctx_host(server->connctx), get_ctx_port(server->connctx), (void*)server, server->index
|
|
36
34
|
#define LOGID_T() LOGID(this)
|
|
@@ -99,7 +97,7 @@ void
|
|
|
99
97
|
lcb_sched_flush(lcb_t instance)
|
|
100
98
|
{
|
|
101
99
|
for (size_t ii = 0; ii < LCBT_NSERVERS(instance); ii++) {
|
|
102
|
-
Server *server = instance
|
|
100
|
+
Server *server = LCBT_GET_SERVER(instance, ii);
|
|
103
101
|
|
|
104
102
|
if (!server->has_pending()) {
|
|
105
103
|
continue;
|
|
@@ -122,8 +120,8 @@ Server::handle_nmv(MemcachedResponse& resinfo, mc_PACKET *oldpkt)
|
|
|
122
120
|
protocol_binary_request_header hdr;
|
|
123
121
|
lcb_error_t err = LCB_ERROR;
|
|
124
122
|
lcb_U16 vbid;
|
|
125
|
-
|
|
126
|
-
|
|
123
|
+
clconfig_provider *cccp = lcb_confmon_get_provider(instance->confmon,
|
|
124
|
+
LCB_CLCONFIG_CCCP);
|
|
127
125
|
|
|
128
126
|
mcreq_read_hdr(oldpkt, &hdr);
|
|
129
127
|
vbid = ntohs(hdr.request.vbucket);
|
|
@@ -134,12 +132,12 @@ Server::handle_nmv(MemcachedResponse& resinfo, mc_PACKET *oldpkt)
|
|
|
134
132
|
|
|
135
133
|
if (resinfo.bodylen() && cccp->enabled) {
|
|
136
134
|
std::string s(resinfo.body<const char*>(), resinfo.vallen());
|
|
137
|
-
err =
|
|
135
|
+
err = lcb_cccp_update(cccp, curhost->host, s.c_str());
|
|
138
136
|
}
|
|
139
137
|
|
|
140
138
|
if (err != LCB_SUCCESS) {
|
|
141
139
|
int bs_options;
|
|
142
|
-
if (instance->cur_configinfo->
|
|
140
|
+
if (instance->cur_configinfo->origin == LCB_CLCONFIG_CCCP) {
|
|
143
141
|
/**
|
|
144
142
|
* XXX: Not enough to see if cccp was enabled, since cccp might
|
|
145
143
|
* be requested by a user, but would still not actually be active
|
|
@@ -148,11 +146,11 @@ Server::handle_nmv(MemcachedResponse& resinfo, mc_PACKET *oldpkt)
|
|
|
148
146
|
*
|
|
149
147
|
* For this reason, we don't use if (cccp->enabled) {...}
|
|
150
148
|
*/
|
|
151
|
-
bs_options =
|
|
149
|
+
bs_options = LCB_BS_REFRESH_THROTTLE;
|
|
152
150
|
} else {
|
|
153
|
-
bs_options =
|
|
151
|
+
bs_options = LCB_BS_REFRESH_ALWAYS;
|
|
154
152
|
}
|
|
155
|
-
instance
|
|
153
|
+
lcb_bootstrap_common(instance, bs_options);
|
|
156
154
|
}
|
|
157
155
|
|
|
158
156
|
if (!lcb_should_retry(settings, oldpkt, LCB_NOT_MY_VBUCKET)) {
|
|
@@ -166,107 +164,6 @@ Server::handle_nmv(MemcachedResponse& resinfo, mc_PACKET *oldpkt)
|
|
|
166
164
|
return true;
|
|
167
165
|
}
|
|
168
166
|
|
|
169
|
-
/**
|
|
170
|
-
* Determine if this is an error code that we can pass to the user, or can
|
|
171
|
-
* otherwise handle "innately"
|
|
172
|
-
*/
|
|
173
|
-
static bool is_fastpath_error(uint16_t rc) {
|
|
174
|
-
switch (rc) {
|
|
175
|
-
case PROTOCOL_BINARY_RESPONSE_SUCCESS:
|
|
176
|
-
case PROTOCOL_BINARY_RESPONSE_KEY_ENOENT:
|
|
177
|
-
case PROTOCOL_BINARY_RESPONSE_KEY_EEXISTS:
|
|
178
|
-
case PROTOCOL_BINARY_RESPONSE_E2BIG:
|
|
179
|
-
case PROTOCOL_BINARY_RESPONSE_NOT_STORED:
|
|
180
|
-
case PROTOCOL_BINARY_RESPONSE_DELTA_BADVAL:
|
|
181
|
-
case PROTOCOL_BINARY_RESPONSE_ERANGE:
|
|
182
|
-
case PROTOCOL_BINARY_RESPONSE_NOT_SUPPORTED:
|
|
183
|
-
case PROTOCOL_BINARY_RESPONSE_UNKNOWN_COMMAND:
|
|
184
|
-
case PROTOCOL_BINARY_RESPONSE_ETMPFAIL:
|
|
185
|
-
case PROTOCOL_BINARY_RESPONSE_ENOMEM:
|
|
186
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_ENOENT:
|
|
187
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EEXISTS:
|
|
188
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_MISMATCH:
|
|
189
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_EINVAL:
|
|
190
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_PATH_E2BIG:
|
|
191
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_CANTINSERT:
|
|
192
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_VALUE_ETOODEEP:
|
|
193
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_DOC_NOTJSON:
|
|
194
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_NUM_ERANGE:
|
|
195
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_DELTA_ERANGE:
|
|
196
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_INVALID_COMBO:
|
|
197
|
-
case PROTOCOL_BINARY_RESPONSE_SUBDOC_MULTI_PATH_FAILURE:
|
|
198
|
-
return true;
|
|
199
|
-
default:
|
|
200
|
-
if (rc >= 0xc0 && rc <= 0xcc) {
|
|
201
|
-
// other subdoc?
|
|
202
|
-
return true;
|
|
203
|
-
} else {
|
|
204
|
-
return false;
|
|
205
|
-
}
|
|
206
|
-
break;
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Handle an unknown memcached error
|
|
212
|
-
*
|
|
213
|
-
* @param mcresp Response which contains the unknown error
|
|
214
|
-
* @param[out] newerr more user-friendly based on error map attributes
|
|
215
|
-
*
|
|
216
|
-
* @return true if this function handled the error specially (by disconnecting)
|
|
217
|
-
* or false if normal handling should continue.
|
|
218
|
-
*/
|
|
219
|
-
bool Server::handle_unknown_error(const MemcachedResponse& mcresp,
|
|
220
|
-
lcb_error_t& newerr) {
|
|
221
|
-
|
|
222
|
-
if (!settings->errmap->isLoaded() || !settings->use_errmap) {
|
|
223
|
-
// If there's no error map, just return false
|
|
224
|
-
return false;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
// Look up the error map definition for this error
|
|
228
|
-
const errmap::Error& err = settings->errmap->getError(mcresp.status());
|
|
229
|
-
|
|
230
|
-
if (!err.isValid() || err.hasAttribute(errmap::SPECIAL_HANDLING)) {
|
|
231
|
-
lcb_log(LOGARGS_T(ERR), LOGFMT "Received error not in error map or requires special handling! " PKTFMT, LOGID_T(), PKTARGS(mcresp));
|
|
232
|
-
lcbio_ctx_senderr(connctx, LCB_PROTOCOL_ERROR);
|
|
233
|
-
return true;
|
|
234
|
-
} else {
|
|
235
|
-
lcb_log(LOGARGS_T(WARN), LOGFMT "Received server error %s (0x%x) on packet: " PKTFMT, LOGID_T(), err.shortname.c_str(), err.code, PKTARGS(mcresp));
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
if (err.hasAttribute(errmap::FETCH_CONFIG)) {
|
|
239
|
-
instance->bootstrap(BS_REFRESH_THROTTLE);
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
if (err.hasAttribute(errmap::TEMPORARY)) {
|
|
243
|
-
newerr = LCB_GENERIC_TMPERR;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
if (err.hasAttribute(errmap::CONSTRAINT_FAILURE)) {
|
|
247
|
-
newerr = LCB_GENERIC_CONSTRAINT_ERR;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
if (err.hasAttribute(errmap::AUTH)) {
|
|
251
|
-
newerr = LCB_AUTH_ERROR;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
if (err.hasAttribute(errmap::SUBDOC) && newerr == LCB_SUCCESS) {
|
|
255
|
-
newerr = LCB_GENERIC_SUBDOCERR;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
if (err.hasAttribute(errmap::CONN_STATE_INVALIDATED)) {
|
|
259
|
-
if (newerr != LCB_SUCCESS) {
|
|
260
|
-
newerr = LCB_ERROR;
|
|
261
|
-
}
|
|
262
|
-
lcbio_ctx_senderr(connctx, newerr);
|
|
263
|
-
return true;
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return false;
|
|
267
|
-
|
|
268
|
-
}
|
|
269
|
-
|
|
270
167
|
/* This function is called within a loop to process a single packet.
|
|
271
168
|
*
|
|
272
169
|
* If a full packet is available, it will process the packet and return
|
|
@@ -322,19 +219,12 @@ Server::try_read(lcbio_CTX *ctx, rdb_IOROPE *ior)
|
|
|
322
219
|
}
|
|
323
220
|
|
|
324
221
|
if (!request) {
|
|
325
|
-
lcb_log(LOGARGS_T(WARN), LOGFMT "
|
|
222
|
+
lcb_log(LOGARGS_T(WARN), LOGFMT "Found stale packet (OP=0x%x, RC=0x%x, SEQ=%u)", LOGID_T(), mcresp.opcode(), mcresp.status(), mcresp.opaque());
|
|
326
223
|
rdb_consumed(ior, pktsize);
|
|
327
224
|
return PKT_READ_COMPLETE;
|
|
328
225
|
}
|
|
329
226
|
|
|
330
|
-
|
|
331
|
-
ReadState rdstate = PKT_READ_COMPLETE;
|
|
332
|
-
|
|
333
|
-
/* Check if the status code is one which must be handled carefully by the
|
|
334
|
-
* client */
|
|
335
|
-
if (is_fastpath_error(mcresp.status())) {
|
|
336
|
-
// Nothing here!
|
|
337
|
-
} else if (mcresp.status() == PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET) {
|
|
227
|
+
if (mcresp.status() == PROTOCOL_BINARY_RESPONSE_NOT_MY_VBUCKET) {
|
|
338
228
|
/* consume the header */
|
|
339
229
|
DO_ASSIGN_PAYLOAD()
|
|
340
230
|
if (!handle_nmv(mcresp, request)) {
|
|
@@ -342,19 +232,13 @@ Server::try_read(lcbio_CTX *ctx, rdb_IOROPE *ior)
|
|
|
342
232
|
}
|
|
343
233
|
DO_SWALLOW_PAYLOAD()
|
|
344
234
|
goto GT_DONE;
|
|
345
|
-
} else if (handle_unknown_error(mcresp, err_override)) {
|
|
346
|
-
DO_ASSIGN_PAYLOAD()
|
|
347
|
-
mcreq_dispatch_response(this, request, &mcresp, err_override);
|
|
348
|
-
DO_SWALLOW_PAYLOAD()
|
|
349
|
-
rdstate = PKT_READ_ABORT;
|
|
350
|
-
goto GT_DONE;
|
|
351
235
|
}
|
|
352
236
|
|
|
353
237
|
/* Figure out if the request is 'ufwd' or not */
|
|
354
238
|
if (!(request->flags & MCREQ_F_UFWD)) {
|
|
355
239
|
DO_ASSIGN_PAYLOAD();
|
|
356
240
|
mcresp.bufh = rdb_get_first_segment(ior);
|
|
357
|
-
mcreq_dispatch_response(this, request, &mcresp,
|
|
241
|
+
mcreq_dispatch_response(this, request, &mcresp, LCB_SUCCESS);
|
|
358
242
|
DO_SWALLOW_PAYLOAD()
|
|
359
243
|
|
|
360
244
|
} else {
|
|
@@ -381,7 +265,7 @@ Server::try_read(lcbio_CTX *ctx, rdb_IOROPE *ior)
|
|
|
381
265
|
if (is_last) {
|
|
382
266
|
mcreq_packet_handled(this, request);
|
|
383
267
|
}
|
|
384
|
-
return
|
|
268
|
+
return PKT_READ_COMPLETE;
|
|
385
269
|
}
|
|
386
270
|
|
|
387
271
|
static void
|
|
@@ -456,7 +340,7 @@ void Server::purge_single(mc_PACKET *pkt, lcb_error_t err) {
|
|
|
456
340
|
hdr.request.opaque,
|
|
457
341
|
PROTOCOL_BINARY_RESPONSE_EINVAL);
|
|
458
342
|
|
|
459
|
-
lcb_log(LOGARGS_T(WARN), LOGFMT "Failing command (pkt=%p, opaque=%lu, opcode=0x%x) with error %
|
|
343
|
+
lcb_log(LOGARGS_T(WARN), LOGFMT "Failing command (pkt=%p, opaque=%lu, opcode=0x%x) with error 0x%x", LOGID_T(), (void*)pkt, (unsigned long)pkt->opaque, hdr.request.opcode, err);
|
|
460
344
|
int rv = mcreq_dispatch_response(this, pkt, &resp, err);
|
|
461
345
|
lcb_assert(rv == 0);
|
|
462
346
|
}
|
|
@@ -481,7 +365,8 @@ Server::purge(lcb_error_t error, hrtime_t thresh, hrtime_t *next,
|
|
|
481
365
|
}
|
|
482
366
|
|
|
483
367
|
if (affected || policy == REFRESH_ALWAYS) {
|
|
484
|
-
instance
|
|
368
|
+
lcb_bootstrap_common(instance,
|
|
369
|
+
LCB_BS_REFRESH_THROTTLE|LCB_BS_REFRESH_INCRERR);
|
|
485
370
|
}
|
|
486
371
|
return affected;
|
|
487
372
|
}
|
|
@@ -535,7 +420,7 @@ void Server::io_timeout()
|
|
|
535
420
|
}
|
|
536
421
|
|
|
537
422
|
uint32_t next_us = next_timeout();
|
|
538
|
-
lcb_log(LOGARGS_T(
|
|
423
|
+
lcb_log(LOGARGS_T(DEBUG), LOGFMT "Scheduling next timeout for %u ms", LOGID_T(), next_us / 1000);
|
|
539
424
|
lcbio_timer_rearm(io_timer, next_us);
|
|
540
425
|
lcb_maybe_breakout(instance);
|
|
541
426
|
}
|
|
@@ -580,7 +465,7 @@ Server::handle_connected(lcbio_SOCKET *sock, lcb_error_t err, lcbio_OSERR syserr
|
|
|
580
465
|
LCBIO_CONNREQ_CLEAR(&connreq);
|
|
581
466
|
|
|
582
467
|
if (err != LCB_SUCCESS) {
|
|
583
|
-
lcb_log(LOGARGS_T(ERR), LOGFMT "
|
|
468
|
+
lcb_log(LOGARGS_T(ERR), LOGFMT "Got error for connection! (OS=%d)", LOGID_T(), syserr);
|
|
584
469
|
if (!maybe_reconnect_on_fake_timeout(err)) {
|
|
585
470
|
socket_failed(err);
|
|
586
471
|
}
|
|
@@ -609,9 +494,10 @@ Server::handle_connected(lcbio_SOCKET *sock, lcb_error_t err, lcbio_OSERR syserr
|
|
|
609
494
|
procs.cb_flush_ready = on_flush_ready;
|
|
610
495
|
connctx = lcbio_ctx_new(sock, this, &procs);
|
|
611
496
|
connctx->subsys = "memcached";
|
|
612
|
-
flush_start = (mcreq_flushstart_fn)mcserver_flush;
|
|
497
|
+
mc_PIPELINE::flush_start = (mcreq_flushstart_fn)mcserver_flush;
|
|
613
498
|
|
|
614
499
|
uint32_t tmo = next_timeout();
|
|
500
|
+
lcb_log(LOGARGS_T(DEBUG), LOGFMT "Setting initial timeout=%ums", LOGID_T(), tmo/1000);
|
|
615
501
|
lcbio_timer_rearm(io_timer, tmo);
|
|
616
502
|
flush();
|
|
617
503
|
}
|
|
@@ -622,7 +508,7 @@ Server::connect()
|
|
|
622
508
|
lcbio_pMGRREQ mr = lcbio_mgr_get(instance->memd_sockpool, curhost,
|
|
623
509
|
default_timeout(), on_connected, this);
|
|
624
510
|
LCBIO_CONNREQ_MKPOOLED(&connreq, mr);
|
|
625
|
-
flush_start = flush_noop;
|
|
511
|
+
mc_PIPELINE::flush_start = flush_noop;
|
|
626
512
|
state = Server::S_CLEAN;
|
|
627
513
|
}
|
|
628
514
|
|
|
@@ -634,7 +520,7 @@ buf_done_cb(mc_PIPELINE *pl, const void *cookie, void *, void *)
|
|
|
634
520
|
}
|
|
635
521
|
|
|
636
522
|
Server::Server(lcb_t instance_, int ix)
|
|
637
|
-
:
|
|
523
|
+
: state(S_CLEAN),
|
|
638
524
|
io_timer(lcbio_timer_new(instance_->iotable, this, timeout_server)),
|
|
639
525
|
instance(instance_),
|
|
640
526
|
settings(lcb_settings_ref2(instance_->settings)),
|
|
@@ -643,10 +529,11 @@ Server::Server(lcb_t instance_, int ix)
|
|
|
643
529
|
connctx(NULL),
|
|
644
530
|
curhost(new lcb_host_t())
|
|
645
531
|
{
|
|
532
|
+
std::memset(static_cast<mc_PIPELINE*>(this), 0, sizeof(mc_PIPELINE));
|
|
646
533
|
mcreq_pipeline_init(this);
|
|
647
|
-
flush_start = (mcreq_flushstart_fn)server_connect;
|
|
648
|
-
buf_done_callback = buf_done_cb;
|
|
649
|
-
index = ix;
|
|
534
|
+
mc_PIPELINE::flush_start = (mcreq_flushstart_fn)server_connect;
|
|
535
|
+
mc_PIPELINE::buf_done_callback = buf_done_cb;
|
|
536
|
+
mc_PIPELINE::index = ix;
|
|
650
537
|
|
|
651
538
|
std::memset(&connreq, 0, sizeof connreq);
|
|
652
539
|
std::memset(curhost, 0, sizeof *curhost);
|
|
@@ -693,7 +580,7 @@ static void
|
|
|
693
580
|
on_error(lcbio_CTX *ctx, lcb_error_t err)
|
|
694
581
|
{
|
|
695
582
|
Server *server = Server::get(ctx);
|
|
696
|
-
lcb_log(LOGARGS(server, WARN), LOGFMT "Got socket error %
|
|
583
|
+
lcb_log(LOGARGS(server, WARN), LOGFMT "Got socket error 0x%x", LOGID(server), err);
|
|
697
584
|
if (server->check_closed()) {
|
|
698
585
|
return;
|
|
699
586
|
}
|
|
@@ -749,15 +636,13 @@ Server::start_errored_ctx(State next_state)
|
|
|
749
636
|
return;
|
|
750
637
|
} else {
|
|
751
638
|
/* Not closed but don't have a current context */
|
|
639
|
+
mc_PIPELINE::flush_start = (mcreq_flushstart_fn)server_connect;
|
|
752
640
|
if (has_pending()) {
|
|
753
641
|
if (!lcbio_timer_armed(io_timer)) {
|
|
754
642
|
/* TODO: Maybe throttle reconnection attempts? */
|
|
755
643
|
lcbio_timer_rearm(io_timer, default_timeout());
|
|
756
644
|
}
|
|
757
645
|
connect();
|
|
758
|
-
} else {
|
|
759
|
-
// Connect once someone actually wants a connection.
|
|
760
|
-
flush_start = (mcreq_flushstart_fn)server_connect;
|
|
761
646
|
}
|
|
762
647
|
}
|
|
763
648
|
|
|
@@ -771,7 +656,7 @@ Server::start_errored_ctx(State next_state)
|
|
|
771
656
|
/* Close the socket not to leak resources */
|
|
772
657
|
lcbio_shutdown(lcbio_ctx_sock(ctx));
|
|
773
658
|
if (next_state == Server::S_ERRDRAIN) {
|
|
774
|
-
flush_start = (mcreq_flushstart_fn)flush_errdrain;
|
|
659
|
+
mc_PIPELINE::flush_start = (mcreq_flushstart_fn)flush_errdrain;
|
|
775
660
|
}
|
|
776
661
|
} else {
|
|
777
662
|
finalize_errored_ctx();
|
|
@@ -816,6 +701,7 @@ Server::finalize_errored_ctx()
|
|
|
816
701
|
/* Otherwise, cycle the state back to CLEAN and reinit
|
|
817
702
|
* the connection */
|
|
818
703
|
state = Server::S_CLEAN;
|
|
704
|
+
mc_PIPELINE::flush_start = (mcreq_flushstart_fn)server_connect;
|
|
819
705
|
connect();
|
|
820
706
|
}
|
|
821
707
|
}
|
|
@@ -837,3 +723,8 @@ Server::check_closed()
|
|
|
837
723
|
finalize_errored_ctx();
|
|
838
724
|
return 1;
|
|
839
725
|
}
|
|
726
|
+
|
|
727
|
+
int
|
|
728
|
+
mcserver_supports_compression(mc_SERVER *server) {
|
|
729
|
+
return server->compsupport;
|
|
730
|
+
}
|