libcouchbase 0.2.0 → 0.3.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -7,115 +7,130 @@
|
|
7
7
|
#include <lcbio/iotable.h>
|
8
8
|
#include <set>
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
class ConfmonTest : public ::testing::Test
|
10
|
+
class Confmon : public ::testing::Test
|
13
11
|
{
|
14
12
|
void SetUp() {
|
15
13
|
MockEnvironment::Reset();
|
16
14
|
}
|
17
15
|
};
|
18
16
|
|
19
|
-
struct evstop_listener
|
17
|
+
struct evstop_listener {
|
18
|
+
clconfig_listener base;
|
20
19
|
lcbio_pTABLE io;
|
21
20
|
int called;
|
22
|
-
|
23
|
-
void clconfig_lsn(EventType event, ConfigInfo*) {
|
24
|
-
if (event != CLCONFIG_EVENT_GOT_NEW_CONFIG) {
|
25
|
-
return;
|
26
|
-
}
|
27
|
-
called = 1;
|
28
|
-
IOT_STOP(io);
|
29
|
-
}
|
30
|
-
|
31
|
-
evstop_listener() : Listener(), io(NULL), called(0) {
|
32
|
-
}
|
33
21
|
};
|
34
22
|
|
35
23
|
extern "C" {
|
36
|
-
static void listen_callback1(
|
37
|
-
|
24
|
+
static void listen_callback1(clconfig_listener *lsn, clconfig_event_t event,
|
25
|
+
clconfig_info *info)
|
38
26
|
{
|
27
|
+
if (event != CLCONFIG_EVENT_GOT_NEW_CONFIG) {
|
28
|
+
return;
|
29
|
+
}
|
30
|
+
|
31
|
+
evstop_listener *me = reinterpret_cast<evstop_listener*>(lsn);
|
32
|
+
me->called = 1;
|
33
|
+
IOT_STOP(me->io);
|
39
34
|
}
|
40
35
|
}
|
41
36
|
|
42
|
-
TEST_F(
|
37
|
+
TEST_F(Confmon, testBasic)
|
43
38
|
{
|
44
39
|
HandleWrap hw;
|
45
40
|
lcb_t instance;
|
46
41
|
MockEnvironment::getInstance()->createConnection(hw, instance);
|
47
42
|
|
48
43
|
|
49
|
-
|
50
|
-
|
51
|
-
http
|
52
|
-
http
|
44
|
+
lcb_confmon *mon = lcb_confmon_create(instance->settings, instance->iotable);
|
45
|
+
clconfig_provider *http = lcb_confmon_get_provider(mon, LCB_CLCONFIG_HTTP);
|
46
|
+
lcb_clconfig_http_enable(http);
|
47
|
+
lcb_clconfig_http_set_nodes(http, instance->ht_nodes);
|
53
48
|
|
54
|
-
mon
|
49
|
+
lcb_confmon_prepare(mon);
|
55
50
|
|
56
|
-
EXPECT_EQ(NULL, mon
|
57
|
-
mon
|
58
|
-
mon
|
59
|
-
mon
|
60
|
-
mon
|
51
|
+
EXPECT_EQ(NULL, lcb_confmon_get_config(mon));
|
52
|
+
EXPECT_EQ(LCB_SUCCESS, lcb_confmon_start(mon));
|
53
|
+
EXPECT_EQ(LCB_SUCCESS, lcb_confmon_start(mon));
|
54
|
+
EXPECT_EQ(LCB_SUCCESS, lcb_confmon_stop(mon));
|
55
|
+
EXPECT_EQ(LCB_SUCCESS, lcb_confmon_stop(mon));
|
61
56
|
|
62
57
|
// Try to find a provider..
|
63
|
-
|
58
|
+
clconfig_provider *provider = lcb_confmon_get_provider(mon, LCB_CLCONFIG_HTTP);
|
64
59
|
ASSERT_NE(0, provider->enabled);
|
65
60
|
|
66
|
-
evstop_listener listener;
|
61
|
+
struct evstop_listener listener;
|
62
|
+
memset(&listener, 0, sizeof(listener));
|
63
|
+
|
64
|
+
listener.base.callback = listen_callback1;
|
65
|
+
listener.base.parent = mon;
|
67
66
|
listener.io = instance->iotable;
|
68
|
-
|
69
|
-
mon
|
67
|
+
|
68
|
+
lcb_confmon_add_listener(mon, &listener.base);
|
69
|
+
lcb_confmon_start(mon);
|
70
70
|
IOT_START(instance->iotable);
|
71
71
|
ASSERT_NE(0, listener.called);
|
72
|
-
|
72
|
+
|
73
|
+
lcb_confmon_destroy(mon);
|
73
74
|
}
|
74
75
|
|
75
76
|
|
76
|
-
struct listener2
|
77
|
+
struct listener2 {
|
78
|
+
clconfig_listener base;
|
77
79
|
int call_count;
|
78
80
|
lcbio_pTABLE io;
|
79
|
-
|
80
|
-
std::set<
|
81
|
+
clconfig_method_t last_source;
|
82
|
+
std::set<clconfig_event_t> expected_events;
|
81
83
|
|
82
84
|
void reset() {
|
83
85
|
call_count = 0;
|
84
|
-
last_source =
|
86
|
+
last_source = LCB_CLCONFIG_PHONY;
|
85
87
|
expected_events.clear();
|
86
88
|
}
|
87
89
|
|
88
|
-
listener2()
|
90
|
+
listener2() {
|
91
|
+
memset(&base, 0, sizeof(base));
|
89
92
|
io = NULL;
|
90
93
|
reset();
|
91
94
|
}
|
95
|
+
};
|
92
96
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
}
|
97
|
+
static struct listener2* getListener2(const void *p)
|
98
|
+
{
|
99
|
+
return reinterpret_cast<struct listener2*>(const_cast<void*>(p));
|
100
|
+
}
|
98
101
|
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
102
|
+
extern "C" {
|
103
|
+
static void listen_callback2(clconfig_listener *prov,
|
104
|
+
clconfig_event_t event,
|
105
|
+
clconfig_info *info)
|
106
|
+
{
|
107
|
+
// Increase the number of times we've received a callback..
|
108
|
+
struct listener2* lsn = getListener2(prov);
|
105
109
|
|
106
|
-
|
107
|
-
|
108
|
-
|
110
|
+
if (event == CLCONFIG_EVENT_MONITOR_STOPPED) {
|
111
|
+
IOT_START(lsn->io);
|
112
|
+
return;
|
113
|
+
}
|
109
114
|
|
115
|
+
if (!lsn->expected_events.empty()) {
|
116
|
+
if (lsn->expected_events.end() ==
|
117
|
+
lsn->expected_events.find(event)) {
|
118
|
+
return;
|
119
|
+
}
|
110
120
|
}
|
111
|
-
};
|
112
121
|
|
113
|
-
|
122
|
+
lsn->call_count++;
|
123
|
+
lsn->last_source = info->origin;
|
124
|
+
IOT_STOP(lsn->io);
|
125
|
+
}
|
126
|
+
}
|
127
|
+
|
128
|
+
static void runConfmon(lcbio_pTABLE io, lcb_confmon *mon)
|
114
129
|
{
|
115
130
|
IOT_START(io);
|
116
131
|
}
|
117
132
|
|
118
|
-
TEST_F(
|
133
|
+
TEST_F(Confmon, testCycle)
|
119
134
|
{
|
120
135
|
HandleWrap hw;
|
121
136
|
lcb_t instance;
|
@@ -130,54 +145,57 @@ TEST_F(ConfmonTest, testCycle)
|
|
130
145
|
instance->settings->bc_http_stream_time = 100000;
|
131
146
|
instance->memd_sockpool->tmoidle = 100000;
|
132
147
|
|
133
|
-
|
148
|
+
lcb_confmon *mon = lcb_confmon_create(instance->settings, instance->iotable);
|
134
149
|
|
135
150
|
struct listener2 lsn;
|
151
|
+
lsn.base.callback = listen_callback2;
|
136
152
|
lsn.io = instance->iotable;
|
137
153
|
lsn.reset();
|
138
|
-
|
154
|
+
|
155
|
+
lcb_confmon_add_listener(mon, &lsn.base);
|
139
156
|
|
140
157
|
mock->makeConnectParams(cropts, NULL);
|
141
|
-
|
142
|
-
|
158
|
+
clconfig_provider *cccp = lcb_confmon_get_provider(mon, LCB_CLCONFIG_CCCP);
|
159
|
+
clconfig_provider *http = lcb_confmon_get_provider(mon, LCB_CLCONFIG_HTTP);
|
143
160
|
|
144
|
-
|
145
|
-
hl
|
146
|
-
cccp
|
147
|
-
cccp
|
161
|
+
hostlist_t hl = hostlist_create();
|
162
|
+
hostlist_add_stringz(hl, cropts.v.v2.mchosts, 11210);
|
163
|
+
lcb_clconfig_cccp_enable(cccp, instance);
|
164
|
+
lcb_clconfig_cccp_set_nodes(cccp, hl);
|
148
165
|
|
149
|
-
http
|
150
|
-
http
|
166
|
+
lcb_clconfig_http_enable(http);
|
167
|
+
lcb_clconfig_http_set_nodes(http, instance->ht_nodes);
|
168
|
+
hostlist_destroy(hl);
|
151
169
|
|
152
|
-
mon
|
153
|
-
mon
|
170
|
+
lcb_confmon_prepare(mon);
|
171
|
+
lcb_confmon_start(mon);
|
154
172
|
lsn.expected_events.insert(CLCONFIG_EVENT_GOT_NEW_CONFIG);
|
155
|
-
|
173
|
+
runConfmon(lsn.io, mon);
|
156
174
|
|
157
175
|
// Ensure CCCP is functioning properly and we're called only once.
|
158
176
|
ASSERT_EQ(1, lsn.call_count);
|
159
|
-
ASSERT_EQ(
|
177
|
+
ASSERT_EQ(LCB_CLCONFIG_CCCP, lsn.last_source);
|
160
178
|
|
161
|
-
mon
|
179
|
+
lcb_confmon_start(mon);
|
162
180
|
lsn.reset();
|
163
181
|
lsn.expected_events.insert(CLCONFIG_EVENT_GOT_ANY_CONFIG);
|
164
|
-
|
182
|
+
runConfmon(lsn.io, mon);
|
165
183
|
ASSERT_EQ(1, lsn.call_count);
|
166
|
-
ASSERT_EQ(
|
184
|
+
ASSERT_EQ(LCB_CLCONFIG_CCCP, lsn.last_source);
|
167
185
|
|
168
186
|
mock->setCCCP(false);
|
169
187
|
mock->failoverNode(5);
|
170
188
|
lsn.reset();
|
171
|
-
mon
|
189
|
+
lcb_confmon_start(mon);
|
172
190
|
lsn.expected_events.insert(CLCONFIG_EVENT_GOT_ANY_CONFIG);
|
173
191
|
lsn.expected_events.insert(CLCONFIG_EVENT_GOT_NEW_CONFIG);
|
174
|
-
|
175
|
-
ASSERT_EQ(
|
192
|
+
runConfmon(lsn.io, mon);
|
193
|
+
ASSERT_EQ(LCB_CLCONFIG_HTTP, lsn.last_source);
|
176
194
|
ASSERT_EQ(1, lsn.call_count);
|
177
|
-
|
195
|
+
lcb_confmon_destroy(mon);
|
178
196
|
}
|
179
197
|
|
180
|
-
TEST_F(
|
198
|
+
TEST_F(Confmon, testBootstrapMethods)
|
181
199
|
{
|
182
200
|
lcb_t instance;
|
183
201
|
HandleWrap hw;
|
@@ -186,38 +204,38 @@ TEST_F(ConfmonTest, testBootstrapMethods)
|
|
186
204
|
ASSERT_EQ(LCB_SUCCESS, err);
|
187
205
|
|
188
206
|
// Try the various bootstrap times
|
189
|
-
|
190
|
-
hrtime_t last = bs->
|
207
|
+
struct lcb_BOOTSTRAP *bs = instance->bootstrap;
|
208
|
+
hrtime_t last = bs->last_refresh, cur = 0;
|
191
209
|
|
192
210
|
// Reset it for the time being
|
193
|
-
bs->
|
194
|
-
instance->confmon
|
211
|
+
bs->last_refresh = 0;
|
212
|
+
lcb_confmon_stop(instance->confmon);
|
195
213
|
|
196
214
|
// Refreshing now should work
|
197
|
-
instance
|
198
|
-
|
215
|
+
lcb_bootstrap_common(instance, LCB_BS_REFRESH_THROTTLE);
|
216
|
+
ASSERT_NE(0, lcb_confmon_is_refreshing(instance->confmon));
|
199
217
|
|
200
|
-
cur = bs->
|
218
|
+
cur = bs->last_refresh;
|
201
219
|
ASSERT_GT(cur, 0);
|
202
|
-
ASSERT_EQ(0, bs->
|
220
|
+
ASSERT_EQ(0, bs->errcounter);
|
203
221
|
last = cur;
|
204
222
|
|
205
223
|
// Stop it, so the state is reset
|
206
|
-
instance->confmon
|
207
|
-
|
224
|
+
lcb_confmon_stop(instance->confmon);
|
225
|
+
ASSERT_EQ(0, lcb_confmon_is_refreshing(instance->confmon));
|
208
226
|
|
209
|
-
instance
|
210
|
-
ASSERT_EQ(last, bs->
|
211
|
-
ASSERT_EQ(1, bs->
|
227
|
+
lcb_bootstrap_common(instance, LCB_BS_REFRESH_THROTTLE|LCB_BS_REFRESH_INCRERR);
|
228
|
+
ASSERT_EQ(last, bs->last_refresh);
|
229
|
+
ASSERT_EQ(1, bs->errcounter);
|
212
230
|
|
213
231
|
// Ensure that a throttled-without-incr doesn't actually incr
|
214
|
-
instance
|
215
|
-
ASSERT_EQ(1, bs->
|
232
|
+
lcb_bootstrap_common(instance, LCB_BS_REFRESH_THROTTLE);
|
233
|
+
ASSERT_EQ(1, bs->errcounter);
|
216
234
|
|
217
235
|
// No refresh yet
|
218
|
-
|
236
|
+
ASSERT_EQ(0, lcb_confmon_is_refreshing(instance->confmon));
|
219
237
|
|
220
|
-
instance
|
221
|
-
|
222
|
-
instance->confmon
|
238
|
+
lcb_bootstrap_common(instance, LCB_BS_REFRESH_ALWAYS);
|
239
|
+
ASSERT_NE(0, lcb_confmon_is_refreshing(instance->confmon));
|
240
|
+
lcb_confmon_stop(instance->confmon);
|
223
241
|
}
|
@@ -223,16 +223,15 @@ TEST_F(McAlloc, testValueAlloc)
|
|
223
223
|
mcreq_release_packet(pipeline, packet);
|
224
224
|
}
|
225
225
|
|
226
|
-
struct ExtraCookie
|
226
|
+
struct ExtraCookie {
|
227
|
+
mc_REQDATAEX base;
|
227
228
|
int remaining;
|
228
|
-
ExtraCookie(const mc_REQDATAPROCS& procs_)
|
229
|
-
: mc_REQDATAEX(NULL, procs_, 0), remaining(0) {
|
230
|
-
}
|
231
229
|
};
|
232
230
|
|
233
231
|
extern "C" {
|
234
232
|
static void pkt_dtor(mc_PACKET *pkt) {
|
235
|
-
|
233
|
+
mc_REQDATAEX *rd = pkt->u_rdata.exdata;
|
234
|
+
ExtraCookie *ec = (ExtraCookie *)rd;
|
236
235
|
ec->remaining--;
|
237
236
|
}
|
238
237
|
}
|
@@ -241,17 +240,18 @@ TEST_F(McAlloc, testRdataExDtor)
|
|
241
240
|
{
|
242
241
|
CQWrap q;
|
243
242
|
lcb_CMDBASE basecmd;
|
244
|
-
|
243
|
+
ExtraCookie ec;
|
245
244
|
protocol_binary_request_header hdr;
|
246
245
|
|
247
246
|
memset(&hdr, 0, sizeof hdr);
|
248
247
|
memset(&basecmd, 0, sizeof basecmd);
|
248
|
+
memset(&ec, 0, sizeof ec);
|
249
249
|
|
250
|
+
mc_REQDATAPROCS procs = { NULL, pkt_dtor };
|
251
|
+
ec.base.procs = &procs;
|
250
252
|
basecmd.key.contig.bytes = "foo";
|
251
253
|
basecmd.key.contig.nbytes = 3;
|
252
254
|
|
253
|
-
ExtraCookie ec(procs);
|
254
|
-
|
255
255
|
mcreq_sched_enter(&q);
|
256
256
|
for (unsigned ii = 0; ii < 5; ii++) {
|
257
257
|
lcb_error_t err;
|
@@ -260,7 +260,7 @@ TEST_F(McAlloc, testRdataExDtor)
|
|
260
260
|
err = mcreq_basic_packet(&q, &basecmd, &hdr, 0, &pkt, &pl, 0);
|
261
261
|
ASSERT_EQ(LCB_SUCCESS, err);
|
262
262
|
pkt->flags |= MCREQ_F_REQEXT;
|
263
|
-
pkt->u_rdata.exdata = &ec;
|
263
|
+
pkt->u_rdata.exdata = &ec.base;
|
264
264
|
mcreq_sched_add(pl, pkt);
|
265
265
|
ec.remaining++;
|
266
266
|
}
|
@@ -630,7 +630,7 @@ private:
|
|
630
630
|
|
631
631
|
const lcb_U64 elapsed_ns = now - previous_time;
|
632
632
|
const lcb_U64 wanted_duration_ns =
|
633
|
-
|
633
|
+
config.opsPerCycle * 1e9 / config.getRateLimit();
|
634
634
|
// On first invocation no previous_time, so skip attempting to sleep.
|
635
635
|
if (elapsed_ns > 0 && elapsed_ns < wanted_duration_ns) {
|
636
636
|
// Dampen the sleep time by averaging with the previous
|
@@ -74,14 +74,18 @@ else
|
|
74
74
|
end
|
75
75
|
|
76
76
|
file 'ext/libcouchbase/build/makefile' => 'ext/libcouchbase/build' do
|
77
|
+
result = nil
|
77
78
|
Dir.chdir("ext/libcouchbase") do |path|
|
78
|
-
system './cmake/configure', '-with-libuv', ::File.expand_path('../../', ::Libuv::Ext.path_to_internal_libuv)
|
79
|
+
result = system './cmake/configure', '-with-libuv', ::File.expand_path('../../', ::Libuv::Ext.path_to_internal_libuv)
|
79
80
|
end
|
81
|
+
raise 'could not find cmake on path' unless result
|
80
82
|
end
|
81
83
|
|
82
84
|
file "ext/libcouchbase/build/lib/libcouchbase_libuv.#{FFI::Platform::LIBSUFFIX}" => 'ext/libcouchbase/build/makefile' do
|
85
|
+
result = nil
|
83
86
|
Dir.chdir('ext/libcouchbase/build') do |path|
|
84
|
-
system 'make'
|
87
|
+
result = system 'make'
|
85
88
|
end
|
89
|
+
raise 'make failed' unless result
|
86
90
|
end
|
87
91
|
end
|
@@ -95,7 +95,7 @@ module Libcouchbase
|
|
95
95
|
# check for included document here
|
96
96
|
if @include_docs && row[:docresp]
|
97
97
|
doc = row[:docresp]
|
98
|
-
raw_string = doc[:value].read_string(doc[:nvalue])
|
98
|
+
raw_string = doc[:value].null? ? '' : doc[:value].read_string(doc[:nvalue])
|
99
99
|
resp.value, meta[:format] = @connection.parse_document(raw_string, flags: doc[:itmflags])
|
100
100
|
meta[:flags] = doc[:itmflags]
|
101
101
|
end
|
@@ -37,8 +37,8 @@ module Libcouchbase
|
|
37
37
|
@fiber = Fiber.current
|
38
38
|
|
39
39
|
begin
|
40
|
-
while
|
41
|
-
if
|
40
|
+
while !@query_completed || (cont = @results.length > 0) do
|
41
|
+
if cont
|
42
42
|
@resume_results = false
|
43
43
|
yield @results.shift
|
44
44
|
else
|
@@ -76,8 +76,8 @@ module Libcouchbase
|
|
76
76
|
@fiber = Fiber.current
|
77
77
|
|
78
78
|
begin
|
79
|
-
while
|
80
|
-
if
|
79
|
+
while !@query_completed || (cont = index < @results.length) do
|
80
|
+
if cont
|
81
81
|
@resume_results = false
|
82
82
|
yield @results[index]
|
83
83
|
index += 1
|
@@ -132,8 +132,8 @@ module Libcouchbase
|
|
132
132
|
|
133
133
|
result = []
|
134
134
|
begin
|
135
|
-
while
|
136
|
-
if
|
135
|
+
while !@query_completed || (cont = index < @results.length && index < num) do
|
136
|
+
if cont
|
137
137
|
result << @results[index]
|
138
138
|
index += 1
|
139
139
|
else
|