libcouchbase 0.3.3 → 1.0.0

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.
Files changed (167) hide show
  1. checksums.yaml +4 -4
  2. data/ext/libcouchbase/CMakeLists.txt +6 -8
  3. data/ext/libcouchbase/README.markdown +2 -2
  4. data/ext/libcouchbase/RELEASE_NOTES.markdown +229 -2
  5. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
  6. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +18 -0
  7. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +3 -2
  8. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  9. data/ext/libcouchbase/cmake/config-cmake.h.in +4 -0
  10. data/ext/libcouchbase/cmake/defs.mk.in +0 -2
  11. data/ext/libcouchbase/cmake/source_files.cmake +21 -5
  12. data/ext/libcouchbase/contrib/cJSON/cJSON.c +1 -1
  13. data/ext/libcouchbase/contrib/cbsasl/src/client.c +2 -0
  14. data/ext/libcouchbase/example/users/README +48 -0
  15. data/ext/libcouchbase/example/users/users.c +147 -0
  16. data/ext/libcouchbase/include/libcouchbase/auth.h +175 -31
  17. data/ext/libcouchbase/include/libcouchbase/cntl.h +82 -1
  18. data/ext/libcouchbase/include/libcouchbase/couchbase.h +45 -3
  19. data/ext/libcouchbase/include/libcouchbase/error.h +19 -1
  20. data/ext/libcouchbase/include/libcouchbase/iops.h +3 -0
  21. data/ext/libcouchbase/include/libcouchbase/n1ql.h +31 -1
  22. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +4 -1
  23. data/ext/libcouchbase/include/libcouchbase/subdoc.h +36 -2
  24. data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
  25. data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
  26. data/ext/libcouchbase/include/memcached/protocol_binary.h +24 -1146
  27. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  28. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
  29. data/ext/libcouchbase/src/README.md +0 -2
  30. data/ext/libcouchbase/src/auth-priv.h +23 -4
  31. data/ext/libcouchbase/src/auth.cc +51 -43
  32. data/ext/libcouchbase/src/bootstrap.cc +244 -0
  33. data/ext/libcouchbase/src/bootstrap.h +58 -38
  34. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +120 -158
  35. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
  36. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +526 -0
  37. data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
  38. data/ext/libcouchbase/src/bucketconfig/bc_static.cc +150 -0
  39. data/ext/libcouchbase/src/bucketconfig/clconfig.h +410 -386
  40. data/ext/libcouchbase/src/bucketconfig/confmon.cc +393 -0
  41. data/ext/libcouchbase/src/cbft.cc +22 -27
  42. data/ext/libcouchbase/src/cntl.cc +56 -22
  43. data/ext/libcouchbase/src/connspec.cc +47 -6
  44. data/ext/libcouchbase/src/connspec.h +27 -0
  45. data/ext/libcouchbase/src/dns-srv.cc +147 -0
  46. data/ext/libcouchbase/src/dump.cc +3 -3
  47. data/ext/libcouchbase/src/errmap.cc +173 -0
  48. data/ext/libcouchbase/src/errmap.h +198 -0
  49. data/ext/libcouchbase/src/getconfig.cc +7 -33
  50. data/ext/libcouchbase/src/handler.cc +118 -7
  51. data/ext/libcouchbase/src/hostlist.cc +0 -36
  52. data/ext/libcouchbase/src/hostlist.h +44 -62
  53. data/ext/libcouchbase/src/http/http-priv.h +125 -112
  54. data/ext/libcouchbase/src/http/http.cc +27 -35
  55. data/ext/libcouchbase/src/http/http.h +1 -34
  56. data/ext/libcouchbase/src/http/http_io.cc +28 -36
  57. data/ext/libcouchbase/src/instance.cc +131 -34
  58. data/ext/libcouchbase/src/internal.h +58 -26
  59. data/ext/libcouchbase/src/jsparse/parser.cc +136 -210
  60. data/ext/libcouchbase/src/jsparse/parser.h +84 -98
  61. data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
  62. data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
  63. data/ext/libcouchbase/src/lcbio/connect.cc +569 -0
  64. data/ext/libcouchbase/src/lcbio/connect.h +16 -7
  65. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  66. data/ext/libcouchbase/src/lcbio/iotable.h +101 -16
  67. data/ext/libcouchbase/src/lcbio/{ioutils.c → ioutils.cc} +30 -51
  68. data/ext/libcouchbase/src/lcbio/ioutils.h +29 -90
  69. data/ext/libcouchbase/src/lcbio/manager.cc +543 -0
  70. data/ext/libcouchbase/src/lcbio/manager.h +133 -96
  71. data/ext/libcouchbase/src/lcbio/protoctx.c +2 -2
  72. data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
  73. data/ext/libcouchbase/src/mc/mcreq.c +11 -2
  74. data/ext/libcouchbase/src/mc/mcreq.h +9 -2
  75. data/ext/libcouchbase/src/mcserver/mcserver.cc +175 -43
  76. data/ext/libcouchbase/src/mcserver/mcserver.h +9 -13
  77. data/ext/libcouchbase/src/mcserver/negotiate.cc +181 -62
  78. data/ext/libcouchbase/src/mcserver/negotiate.h +1 -3
  79. data/ext/libcouchbase/src/mctx-helper.h +51 -0
  80. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
  81. data/ext/libcouchbase/src/n1ql/n1ql.cc +74 -42
  82. data/ext/libcouchbase/src/netbuf/netbuf.c +4 -4
  83. data/ext/libcouchbase/src/newconfig.cc +6 -6
  84. data/ext/libcouchbase/src/nodeinfo.cc +2 -2
  85. data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
  86. data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
  87. data/ext/libcouchbase/src/operations/durability.cc +6 -26
  88. data/ext/libcouchbase/src/operations/durability_internal.h +6 -3
  89. data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
  90. data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +68 -93
  91. data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
  92. data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
  93. data/ext/libcouchbase/src/operations/stats.cc +3 -8
  94. data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
  95. data/ext/libcouchbase/src/operations/subdoc.cc +129 -42
  96. data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
  97. data/ext/libcouchbase/src/packetutils.h +30 -2
  98. data/ext/libcouchbase/src/probes.d +1 -1
  99. data/ext/libcouchbase/src/rdb/rope.c +1 -1
  100. data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +2 -3
  101. data/ext/libcouchbase/src/retryq.cc +52 -14
  102. data/ext/libcouchbase/src/retryq.h +3 -3
  103. data/ext/libcouchbase/src/settings.c +5 -0
  104. data/ext/libcouchbase/src/settings.h +11 -0
  105. data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
  106. data/ext/libcouchbase/src/ssl/ssl_common.c +2 -0
  107. data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
  108. data/ext/libcouchbase/src/strcodecs/strcodecs.h +1 -1
  109. data/ext/libcouchbase/src/trace.h +4 -4
  110. data/ext/libcouchbase/src/vbucket/vbucket.c +6 -10
  111. data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
  112. data/ext/libcouchbase/src/views/docreq.h +24 -30
  113. data/ext/libcouchbase/src/views/viewreq.cc +318 -0
  114. data/ext/libcouchbase/src/views/viewreq.h +43 -13
  115. data/ext/libcouchbase/tests/basic/t_connstr.cc +88 -50
  116. data/ext/libcouchbase/tests/basic/t_creds.cc +47 -5
  117. data/ext/libcouchbase/tests/basic/t_host.cc +67 -75
  118. data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -82
  119. data/ext/libcouchbase/tests/basic/t_misc.cc +1 -1
  120. data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +0 -1
  121. data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
  122. data/ext/libcouchbase/tests/ioserver/connection.cc +1 -1
  123. data/ext/libcouchbase/tests/ioserver/ioserver.cc +19 -6
  124. data/ext/libcouchbase/tests/iotests/mock-environment.cc +28 -2
  125. data/ext/libcouchbase/tests/iotests/mock-environment.h +51 -1
  126. data/ext/libcouchbase/tests/iotests/t_behavior.cc +1 -7
  127. data/ext/libcouchbase/tests/iotests/t_confmon.cc +97 -115
  128. data/ext/libcouchbase/tests/iotests/t_durability.cc +0 -1
  129. data/ext/libcouchbase/tests/iotests/t_eerrs.cc +119 -0
  130. data/ext/libcouchbase/tests/iotests/t_errmap.cc +178 -0
  131. data/ext/libcouchbase/tests/iotests/t_misc.cc +3 -3
  132. data/ext/libcouchbase/tests/iotests/t_netfail.cc +1 -1
  133. data/ext/libcouchbase/tests/iotests/t_obseqno.cc +0 -1
  134. data/ext/libcouchbase/tests/iotests/t_subdoc.cc +18 -11
  135. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  136. data/ext/libcouchbase/tests/socktests/socktest.cc +7 -10
  137. data/ext/libcouchbase/tests/socktests/socktest.h +2 -3
  138. data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
  139. data/ext/libcouchbase/tests/socktests/t_manager.cc +5 -6
  140. data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
  141. data/ext/libcouchbase/tests/vbucket/confdata/ketama_expected.json +2562 -0
  142. data/ext/libcouchbase/tests/vbucket/confdata/memd_ketama_config.json +31 -0
  143. data/ext/libcouchbase/tests/vbucket/t_config.cc +35 -5
  144. data/ext/libcouchbase/tools/CMakeLists.txt +2 -2
  145. data/ext/libcouchbase/tools/cbc-handlers.h +128 -0
  146. data/ext/libcouchbase/tools/cbc-n1qlback.cc +64 -10
  147. data/ext/libcouchbase/tools/cbc-pillowfight.cc +2 -2
  148. data/ext/libcouchbase/tools/cbc.cc +143 -10
  149. data/ext/libcouchbase/tools/docgen/loc.h +1 -1
  150. data/lib/libcouchbase/connection.rb +4 -3
  151. data/lib/libcouchbase/version.rb +1 -1
  152. metadata +37 -28
  153. data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
  154. data/ext/libcouchbase/src/bootstrap.c +0 -269
  155. data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
  156. data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
  157. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
  158. data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
  159. data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
  160. data/ext/libcouchbase/src/lcbio/connect.c +0 -557
  161. data/ext/libcouchbase/src/lcbio/manager.c +0 -584
  162. data/ext/libcouchbase/src/packetutils.c +0 -37
  163. data/ext/libcouchbase/src/simplestring.c +0 -211
  164. data/ext/libcouchbase/src/simplestring.h +0 -228
  165. data/ext/libcouchbase/src/ssobuf.h +0 -82
  166. data/ext/libcouchbase/src/views/viewreq.c +0 -358
  167. data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
@@ -902,7 +902,6 @@ TEST_F(DurabilityUnitTest, testOptionValidation)
902
902
  HandleWrap hw;
903
903
  lcb_t instance;
904
904
  lcb_U16 persist = 0, replicate = 0;
905
- int options;
906
905
  lcb_error_t rc;
907
906
 
908
907
  createConnection(hw, instance);
@@ -0,0 +1,119 @@
1
+ #include "config.h"
2
+ #include "iotests.h"
3
+ #include "internal.h"
4
+
5
+ class EerrsUnitTest : public MockUnitTest {
6
+ protected:
7
+ virtual void createEerrConnection(HandleWrap& hw, lcb_t& instance) {
8
+ MockEnvironment::getInstance()->createConnection(hw, instance);
9
+ ASSERT_EQ(LCB_SUCCESS, lcb_connect(instance));
10
+ lcb_wait(instance);
11
+ ASSERT_EQ(LCB_SUCCESS, lcb_get_bootstrap_status(instance));
12
+ }
13
+
14
+ void enableEnhancedErrors() {
15
+ MockEnvironment::getInstance()->setEnhancedErrors(true);
16
+ }
17
+
18
+ void disableEnhancedErrors() {
19
+ MockEnvironment::getInstance()->setEnhancedErrors(false);
20
+ }
21
+
22
+ void checkRetryVerify(uint16_t errcode);
23
+
24
+ void TearDown() {
25
+ MockOpFailClearCommand clearCmd(MockEnvironment::getInstance()->getNumNodes());
26
+ doMockTxn(clearCmd);
27
+ MockUnitTest::TearDown();
28
+ }
29
+ };
30
+
31
+ struct EerrsCookie {
32
+ lcb_error_t rc;
33
+ bool called;
34
+ char *err_ref;
35
+ char *err_ctx;
36
+
37
+ void reset() {
38
+ rc = LCB_SUCCESS;
39
+ called = false;
40
+ free(err_ref);
41
+ err_ref = NULL;
42
+ free(err_ctx);
43
+ err_ctx = NULL;
44
+ }
45
+ EerrsCookie() : rc(LCB_SUCCESS), called(false), err_ref(NULL), err_ctx(NULL) {
46
+ }
47
+
48
+ ~EerrsCookie() {
49
+ free(err_ref);
50
+ free(err_ctx);
51
+ }
52
+ };
53
+
54
+ extern "C" {
55
+ static void opcb(lcb_t, int cbtype, const lcb_RESPBASE* rb) {
56
+ EerrsCookie *cookie = reinterpret_cast<EerrsCookie*>(rb->cookie);
57
+ cookie->called = true;
58
+ cookie->rc = rb->rc;
59
+
60
+ const char *ref = lcb_resp_get_error_ref(cbtype, rb);
61
+ if (ref != NULL) {
62
+ cookie->err_ref = strdup(ref);
63
+ }
64
+
65
+ const char *ctx = lcb_resp_get_error_context(cbtype, rb);
66
+ if (ctx != NULL) {
67
+ cookie->err_ctx = strdup(ctx);
68
+ }
69
+ }
70
+ }
71
+
72
+ TEST_F(EerrsUnitTest, testInCallbackWhenEnabled) {
73
+ SKIP_UNLESS_MOCK();
74
+ HandleWrap hw;
75
+ lcb_t instance;
76
+
77
+ enableEnhancedErrors();
78
+ createEerrConnection(hw, instance);
79
+ lcb_install_callback3(instance, LCB_CALLBACK_DEFAULT, opcb);
80
+
81
+ EerrsCookie cookie;
82
+
83
+ std::string key("hello");
84
+ lcb_CMDGET cmd = { 0 };
85
+ LCB_CMD_SET_KEY(&cmd, key.c_str(), key.size());
86
+ cmd.lock = 10;
87
+ lcb_get3(instance, &cookie, &cmd);
88
+
89
+ lcb_wait(instance);
90
+ ASSERT_TRUE(cookie.called);
91
+ ASSERT_EQ(LCB_KEY_ENOENT, cookie.rc);
92
+ ASSERT_NE((char *)NULL, cookie.err_ref);
93
+ ASSERT_EQ(36, strlen(cookie.err_ref)); // java.util.UUID generates 36-bytes long strings
94
+ ASSERT_STREQ("Failed to lookup item", cookie.err_ctx);
95
+ }
96
+
97
+
98
+ TEST_F(EerrsUnitTest, testInCallbackWhenDisabled) {
99
+ SKIP_UNLESS_MOCK();
100
+ HandleWrap hw;
101
+ lcb_t instance;
102
+
103
+ disableEnhancedErrors();
104
+ createEerrConnection(hw, instance);
105
+ lcb_install_callback3(instance, LCB_CALLBACK_DEFAULT, opcb);
106
+
107
+ EerrsCookie cookie;
108
+
109
+ std::string key("hello");
110
+ lcb_CMDGET cmd = { 0 };
111
+ LCB_CMD_SET_KEY(&cmd, key.c_str(), key.size());
112
+ cmd.lock = 10;
113
+ lcb_get3(instance, &cookie, &cmd);
114
+
115
+ lcb_wait(instance);
116
+ ASSERT_TRUE(cookie.called);
117
+ ASSERT_EQ((char *)NULL, cookie.err_ref);
118
+ ASSERT_EQ((char *)NULL, cookie.err_ctx);
119
+ }
@@ -0,0 +1,178 @@
1
+ #include "config.h"
2
+ #include "iotests.h"
3
+ #include "internal.h"
4
+ #include <map>
5
+
6
+ class ErrmapUnitTest : public MockUnitTest {
7
+ protected:
8
+ virtual void createErrmapConnection(HandleWrap& hw, lcb_t& instance) {
9
+ MockEnvironment::getInstance()->createConnection(hw, instance);
10
+ ASSERT_EQ(LCB_SUCCESS, lcb_cntl_string(instance, "enable_errmap", "true"));
11
+ ASSERT_EQ(LCB_SUCCESS, lcb_connect(instance));
12
+ lcb_wait(instance);
13
+ ASSERT_EQ(LCB_SUCCESS, lcb_get_bootstrap_status(instance));
14
+ }
15
+
16
+ void checkRetryVerify(uint16_t errcode);
17
+
18
+ void TearDown() {
19
+ MockOpFailClearCommand clearCmd(MockEnvironment::getInstance()->getNumNodes());
20
+ doMockTxn(clearCmd);
21
+ MockUnitTest::TearDown();
22
+ }
23
+ };
24
+
25
+ struct ResultCookie {
26
+ lcb_error_t rc;
27
+ bool called;
28
+
29
+ void reset() {
30
+ rc = LCB_SUCCESS;
31
+ called = false;
32
+ }
33
+ ResultCookie() : rc(LCB_SUCCESS), called(false) {
34
+ }
35
+ };
36
+
37
+ extern "C" {
38
+ static void opcb(lcb_t,int,const lcb_RESPBASE* rb) {
39
+ ResultCookie *cookie = reinterpret_cast<ResultCookie*>(rb->cookie);
40
+ cookie->called = true;
41
+ cookie->rc = rb->rc;
42
+ }
43
+ }
44
+
45
+ TEST_F(ErrmapUnitTest, hasRecognizedErrors) {
46
+ SKIP_UNLESS_MOCK();
47
+ HandleWrap hw;
48
+ lcb_t instance;
49
+
50
+ createErrmapConnection(hw, instance);
51
+
52
+ // Test the actual error map..
53
+ using namespace lcb;
54
+ const errmap::ErrorMap& em = *instance->settings->errmap;
55
+ const errmap::Error& err = em.getError(PROTOCOL_BINARY_RESPONSE_KEY_ENOENT);
56
+ ASSERT_TRUE(err.isValid());
57
+ ASSERT_TRUE(err.hasAttribute(errmap::CONSTRAINT_FAILURE));
58
+ }
59
+
60
+ TEST_F(ErrmapUnitTest, closesOnUnrecognizedError) {
61
+ // For now, EINTERNAL is an error code we don't know!
62
+ SKIP_UNLESS_MOCK();
63
+ HandleWrap hw;
64
+ lcb_t instance;
65
+ createErrmapConnection(hw, instance);
66
+
67
+ const char *key = "key";
68
+ lcb_CMDSTORE scmd = { 0 };
69
+ LCB_CMD_SET_KEY(&scmd, key, strlen(key));
70
+ LCB_CMD_SET_VALUE(&scmd, "val", 3);
71
+
72
+ ResultCookie cookie;
73
+ lcb_install_callback3(instance, LCB_CALLBACK_STORE, opcb);
74
+ ASSERT_EQ(LCB_SUCCESS, lcb_store3(instance, &cookie, &scmd));
75
+ lcb_wait(instance);
76
+ ASSERT_EQ(LCB_SUCCESS, cookie.rc);
77
+
78
+ MockCommand cmd(MockCommand::OPFAIL);
79
+
80
+ // Determine the server
81
+ int srvix = instance->map_key(key);
82
+
83
+ cmd.set("server", srvix);
84
+ cmd.set("code", PROTOCOL_BINARY_RESPONSE_EINTERNAL); // Invalidate the connection!
85
+ cmd.set("count", 1);
86
+ doMockTxn(cmd);
87
+
88
+ cookie.reset();
89
+ ASSERT_EQ(LCB_SUCCESS, lcb_store3(instance, &cookie, &scmd));
90
+ lcb_wait(instance);
91
+
92
+ ASSERT_TRUE(cookie.called);
93
+ ASSERT_NE(LCB_SUCCESS, cookie.rc);
94
+
95
+ cookie.reset();
96
+ ASSERT_EQ(LCB_SUCCESS, lcb_store3(instance, &cookie, &scmd));
97
+ lcb_wait(instance);
98
+ ASSERT_TRUE(cookie.called);
99
+
100
+ // Note, we can't determine what the actual error here is. It would be nice
101
+ // if we were able to reconnect and retry the other commands, but right now
102
+ // detecting a failed connection is better than having no detection at all:
103
+ //
104
+ // ASSERT_EQ(LCB_SUCCESS, cookie.rc);
105
+ }
106
+
107
+ void ErrmapUnitTest::checkRetryVerify(uint16_t errcode) {
108
+ HandleWrap hw;
109
+ lcb_t instance;
110
+ createErrmapConnection(hw, instance);
111
+ lcb_install_callback3(instance, LCB_CALLBACK_DEFAULT, opcb);
112
+
113
+ ResultCookie cookie;
114
+
115
+ std::string key("hello");
116
+ lcb_CMDSTORE scmd = { 0 };
117
+ LCB_CMD_SET_KEY(&scmd, key.c_str(), key.size());
118
+ LCB_CMD_SET_VALUE(&scmd, "Val", 3);
119
+
120
+ // Store the item once to ensure the server is actually connected
121
+ // (we don't want opfail to be active during negotiation).
122
+ lcb_store3(instance, &cookie, &scmd);
123
+ lcb_wait(instance);
124
+ ASSERT_TRUE(cookie.called);
125
+ ASSERT_EQ(LCB_SUCCESS, cookie.rc);
126
+
127
+ // Figure out the server this key belongs to.
128
+ int srvix = instance->map_key(key);
129
+
130
+ MockCommand cmd(MockCommand::START_RETRY_VERIFY);
131
+ cmd.set("idx", srvix);
132
+ cmd.set("bucket", instance->get_bucketname());
133
+ doMockTxn(cmd);
134
+
135
+ // Set up opfail
136
+ MockOpfailCommand failCmd(errcode, srvix, -1, instance->get_bucketname());
137
+ doMockTxn(failCmd);
138
+
139
+ // Run the command!
140
+ cookie.reset();
141
+ lcb_error_t rc = lcb_store3(instance, &cookie, &scmd);
142
+ ASSERT_EQ(LCB_SUCCESS, rc);
143
+ lcb_wait(instance);
144
+
145
+ ASSERT_TRUE(cookie.called);
146
+ ASSERT_EQ(LCB_GENERIC_TMPERR, cookie.rc);
147
+
148
+ // Check that we executed correctly:
149
+ MockBucketCommand verifyCmd(MockCommand::CHECK_RETRY_VERIFY, srvix, instance->get_bucketname());
150
+ verifyCmd.set("opcode", PROTOCOL_BINARY_CMD_SET);
151
+ verifyCmd.set("errcode", errcode);
152
+ #ifdef __APPLE__
153
+ // FIXME: on Jenkins OSX actual expected time does not match actual and mock raises exception like following:
154
+ // VerificationException: Not enough/too many retries. Last TS=1498594892704. Last expected=1498594892728. Diff=24. MaxDiff=20
155
+ verifyCmd.set("fuzz_ms", 25);
156
+ #else
157
+ verifyCmd.set("fuzz_ms", 20);
158
+ #endif
159
+ doMockTxn(verifyCmd);
160
+ }
161
+
162
+ static const uint16_t ERRCODE_CONSTANT = 0x7ff0;
163
+ static const uint16_t ERRCODE_LINEAR = 0x7ff1;
164
+ static const uint16_t ERRCODE_EXPONENTIAL = 0x7ff2;
165
+
166
+ TEST_F(ErrmapUnitTest, retrySpecConstant) {
167
+ SKIP_UNLESS_MOCK();
168
+ checkRetryVerify(ERRCODE_CONSTANT);
169
+ }
170
+
171
+ TEST_F(ErrmapUnitTest, retrySpecLinear) {
172
+ SKIP_UNLESS_MOCK();
173
+ checkRetryVerify(ERRCODE_LINEAR);
174
+ }
175
+
176
+ TEST_F(ErrmapUnitTest, retrySpecExponential) {
177
+ checkRetryVerify(ERRCODE_EXPONENTIAL);
178
+ }
@@ -293,7 +293,7 @@ TEST_F(MockUnitTest, testGetHostInfo)
293
293
  map<string,bool> smap;
294
294
 
295
295
  // Ensure we only get unique nodes
296
- for (size_t ii = 0; ii < lcb_get_num_nodes(instance); ii++) {
296
+ for (lcb_S32 ii = 0; ii < lcb_get_num_nodes(instance); ii++) {
297
297
  const char *cur = lcb_get_node(instance, LCB_NODE_DATA, ii);
298
298
  ASSERT_FALSE(cur == NULL);
299
299
  ASSERT_FALSE(smap[cur]);
@@ -435,7 +435,7 @@ TEST_F(MockUnitTest, testCtls)
435
435
  lcbvb_CONFIG *cfg = ctlGet<lcbvb_CONFIG*>(instance, LCB_CNTL_VBCONFIG);
436
436
  // Do we have a way to verify this?
437
437
  ASSERT_FALSE(cfg == NULL);
438
- ASSERT_GT(cfg->nsrv, 0);
438
+ ASSERT_GT(cfg->nsrv, (unsigned int)0);
439
439
 
440
440
  lcb_io_opt_t io = ctlGet<lcb_io_opt_t>(instance, LCB_CNTL_IOPS);
441
441
  ASSERT_TRUE(io == instance->getIOT()->p);
@@ -517,7 +517,7 @@ TEST_F(MockUnitTest, testCtls)
517
517
 
518
518
  ctlGetSet<int>(instance, LCB_CNTL_DETAILED_ERRCODES, 1);
519
519
  ctlGetSet<lcb_U32>(instance, LCB_CNTL_RETRY_INTERVAL, UINT_MAX);
520
- ctlGetSet<float>(instance, LCB_CNTL_RETRY_BACKOFF, 3.4);
520
+ ctlGetSet<float>(instance, LCB_CNTL_RETRY_BACKOFF, (float)3.4);
521
521
  ctlGetSet<lcb_SIZE>(instance, LCB_CNTL_HTTP_POOLSIZE, UINT_MAX);
522
522
  ctlGetSet<int>(instance, LCB_CNTL_HTTP_REFRESH_CONFIG_ON_ERROR, 0);
523
523
 
@@ -506,7 +506,7 @@ TEST_F(MockUnitTest, testSaslMechs)
506
506
  doLcbCreate(&instance, &crParams, protectedEnv);
507
507
 
508
508
  // Make the socket pool disallow idle connections
509
- instance->memd_sockpool->maxidle = 0;
509
+ instance->memd_sockpool->get_options().maxidle = 0;
510
510
 
511
511
  err = lcb_connect(instance);
512
512
  ASSERT_EQ(LCB_SUCCESS, err);
@@ -96,7 +96,6 @@ TEST_F(ObseqnoTest, testObserve) {
96
96
 
97
97
  HandleWrap hw;
98
98
  lcb_t instance;
99
- lcb_error_t rc;
100
99
  createConnection(hw, instance);
101
100
  lcbvb_CONFIG *vbc;
102
101
 
@@ -22,7 +22,7 @@
22
22
 
23
23
  namespace std {
24
24
  inline ostream& operator<<(ostream& os, const lcb_error_t& rc) {
25
- os << "LcbError<";
25
+ os << "LcbError <0x";
26
26
  os << std::hex << static_cast<unsigned>(rc);
27
27
  os << " (";
28
28
  os << lcb_strerror(NULL, rc);
@@ -300,7 +300,6 @@ TEST_F(SubdocUnitTest, testSdGetExists)
300
300
  CREATE_SUBDOC_CONNECTION(hw, instance);
301
301
 
302
302
  MultiResult res;
303
- lcb_error_t rc;
304
303
  lcb_SDSPEC spec = { 0 };
305
304
  lcb_CMDSUBDOC cmd = { 0 };
306
305
  LCB_CMD_SET_KEY(&cmd, key.c_str(), key.size());
@@ -403,7 +402,6 @@ TEST_F(SubdocUnitTest, testSdStore)
403
402
  {
404
403
  HandleWrap hw;
405
404
  lcb_t instance;
406
- lcb_error_t rc;
407
405
  CREATE_SUBDOC_CONNECTION(hw, instance);
408
406
  lcb_CMDSUBDOC cmd = { 0 };
409
407
  lcb_SDSPEC spec = { 0 };
@@ -495,7 +493,7 @@ TEST_F(SubdocUnitTest, testMkdoc) {
495
493
  HandleWrap hw;
496
494
  lcb_t instance;
497
495
  lcb_CMDSUBDOC cmd = { 0 };
498
- lcb_SDSPEC spec = { 0 };
496
+ lcb_SDSPEC spec[2] = {{0}};
499
497
  MultiResult res;
500
498
 
501
499
  CREATE_SUBDOC_CONNECTION(hw, instance);
@@ -504,16 +502,27 @@ TEST_F(SubdocUnitTest, testMkdoc) {
504
502
  removeKey(instance, key);
505
503
 
506
504
  LCB_CMD_SET_KEY(&cmd, key.c_str(), key.size());
507
- cmd.specs = &spec;
505
+ cmd.specs = spec;
508
506
  cmd.nspecs = 1;
507
+ cmd.cmdflags = LCB_CMDSUBDOC_F_UPSERT_DOC;
509
508
 
510
- LCB_SDSPEC_SET_PATH(&spec, "pth", 3);
511
- LCB_SDSPEC_SET_VALUE(&spec, "123", 3);
512
- spec.options |= LCB_SDSPEC_F_MKDOCUMENT;
513
- spec.sdcmd = LCB_SDCMD_DICT_UPSERT;
509
+ LCB_SDSPEC_SET_PATH(&spec[0], "pth", 3);
510
+ LCB_SDSPEC_SET_VALUE(&spec[0], "123", 3);
511
+ spec[0].sdcmd = LCB_SDCMD_DICT_UPSERT;
514
512
 
515
513
  ASSERT_EQ(LCB_SUCCESS, schedwait(instance, &res, &cmd, lcb_subdoc3));
514
+
516
515
  ASSERT_PATHVAL_EQ("123", instance, key, "pth");
516
+
517
+ removeKey(instance, key);
518
+ LCB_SDSPEC_SET_PATH(&spec[1], "pth2", 4);
519
+ LCB_SDSPEC_SET_VALUE(&spec[1], "456", 3);
520
+ spec[1].sdcmd = LCB_SDCMD_DICT_UPSERT;
521
+ cmd.nspecs = 2;
522
+ ASSERT_EQ(LCB_SUCCESS, schedwait(instance, &res, &cmd, lcb_subdoc3));
523
+
524
+ ASSERT_PATHVAL_EQ("123", instance, key, "pth");
525
+ ASSERT_PATHVAL_EQ("456", instance, key, "pth2");
517
526
  }
518
527
 
519
528
  TEST_F(SubdocUnitTest, testUnique)
@@ -572,7 +581,6 @@ TEST_F(SubdocUnitTest, testCounter)
572
581
  lcb_t instance;
573
582
  lcb_CMDSUBDOC cmd = { 0 };
574
583
  lcb_SDSPEC spec = { 0 };
575
- lcb_error_t rc;
576
584
  MultiResult res;
577
585
 
578
586
  CREATE_SUBDOC_CONNECTION(hw, instance);
@@ -788,7 +796,6 @@ TEST_F(SubdocUnitTest, testGetCount) {
788
796
  lcb_t instance;
789
797
  lcb_CMDSUBDOC cmd = { 0 };
790
798
  lcb_SDSPEC spec = { 0 };
791
- lcb_error_t rc;
792
799
  MultiResult mres;
793
800
 
794
801
  CREATE_SUBDOC_CONNECTION(hw, instance);
@@ -223,15 +223,16 @@ TEST_F(McAlloc, testValueAlloc)
223
223
  mcreq_release_packet(pipeline, packet);
224
224
  }
225
225
 
226
- struct ExtraCookie {
227
- mc_REQDATAEX base;
226
+ struct ExtraCookie : mc_REQDATAEX {
228
227
  int remaining;
228
+ ExtraCookie(const mc_REQDATAPROCS& procs_)
229
+ : mc_REQDATAEX(NULL, procs_, 0), remaining(0) {
230
+ }
229
231
  };
230
232
 
231
233
  extern "C" {
232
234
  static void pkt_dtor(mc_PACKET *pkt) {
233
- mc_REQDATAEX *rd = pkt->u_rdata.exdata;
234
- ExtraCookie *ec = (ExtraCookie *)rd;
235
+ ExtraCookie *ec = static_cast<ExtraCookie*>(pkt->u_rdata.exdata);
235
236
  ec->remaining--;
236
237
  }
237
238
  }
@@ -240,18 +241,17 @@ TEST_F(McAlloc, testRdataExDtor)
240
241
  {
241
242
  CQWrap q;
242
243
  lcb_CMDBASE basecmd;
243
- ExtraCookie ec;
244
+ const static mc_REQDATAPROCS procs = { NULL, pkt_dtor };
244
245
  protocol_binary_request_header hdr;
245
246
 
246
247
  memset(&hdr, 0, sizeof hdr);
247
248
  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;
252
250
  basecmd.key.contig.bytes = "foo";
253
251
  basecmd.key.contig.nbytes = 3;
254
252
 
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.base;
263
+ pkt->u_rdata.exdata = &ec;
264
264
  mcreq_sched_add(pl, pkt);
265
265
  ec.remaining++;
266
266
  }