libcouchbase 1.2.8 → 1.3.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 (186) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -4
  3. data/README.md +16 -8
  4. data/ext/libcouchbase/CMakeLists.txt +34 -32
  5. data/ext/libcouchbase/RELEASE_NOTES.markdown +277 -6
  6. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +14 -0
  7. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +2 -0
  8. data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +2 -1
  9. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
  10. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +8 -1
  11. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  12. data/ext/libcouchbase/cmake/config-cmake.h.in +14 -0
  13. data/ext/libcouchbase/cmake/configure +8 -26
  14. data/ext/libcouchbase/cmake/defs.mk.in +2 -2
  15. data/ext/libcouchbase/cmake/libcouchbase.stp.in +829 -0
  16. data/ext/libcouchbase/cmake/source_files.cmake +11 -2
  17. data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +18 -2
  18. data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +44 -2
  19. data/ext/libcouchbase/contrib/cbsasl/src/client.c +285 -73
  20. data/ext/libcouchbase/contrib/cbsasl/src/common.c +4 -0
  21. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.c +500 -0
  22. data/ext/libcouchbase/contrib/cbsasl/src/scram-sha/scram_utils.h +99 -0
  23. data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +1 -1
  24. data/ext/libcouchbase/contrib/cliopts/cliopts.h +14 -1
  25. data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +2 -3
  26. data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +4 -0
  27. data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +7 -5
  28. data/ext/libcouchbase/contrib/snappy/snappy.cc +7 -2
  29. data/ext/libcouchbase/example/crypto/.gitignore +2 -0
  30. data/ext/libcouchbase/example/crypto/Makefile +13 -0
  31. data/ext/libcouchbase/example/crypto/common_provider.c +24 -0
  32. data/ext/libcouchbase/example/crypto/common_provider.h +31 -0
  33. data/ext/libcouchbase/example/crypto/openssl_symmetric_decrypt.c +139 -0
  34. data/ext/libcouchbase/example/crypto/openssl_symmetric_encrypt.c +147 -0
  35. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.c +281 -0
  36. data/ext/libcouchbase/example/crypto/openssl_symmetric_provider.h +29 -0
  37. data/ext/libcouchbase/example/tracing/.gitignore +2 -0
  38. data/ext/libcouchbase/example/tracing/Makefile +8 -0
  39. data/ext/libcouchbase/example/tracing/cJSON.c +1 -0
  40. data/ext/libcouchbase/example/tracing/cJSON.h +1 -0
  41. data/ext/libcouchbase/example/tracing/tracing.c +439 -0
  42. data/ext/libcouchbase/example/tracing/views.c +444 -0
  43. data/ext/libcouchbase/include/libcouchbase/auth.h +56 -4
  44. data/ext/libcouchbase/include/libcouchbase/cbft.h +8 -0
  45. data/ext/libcouchbase/include/libcouchbase/cntl-private.h +55 -1
  46. data/ext/libcouchbase/include/libcouchbase/cntl.h +101 -1
  47. data/ext/libcouchbase/include/libcouchbase/configuration.h.in +6 -0
  48. data/ext/libcouchbase/include/libcouchbase/couchbase.h +109 -6
  49. data/ext/libcouchbase/include/libcouchbase/crypto.h +140 -0
  50. data/ext/libcouchbase/include/libcouchbase/error.h +38 -2
  51. data/ext/libcouchbase/include/libcouchbase/kvbuf.h +6 -1
  52. data/ext/libcouchbase/include/libcouchbase/metrics.h +79 -0
  53. data/ext/libcouchbase/include/libcouchbase/n1ql.h +9 -0
  54. data/ext/libcouchbase/include/libcouchbase/tracing.h +319 -0
  55. data/ext/libcouchbase/include/libcouchbase/vbucket.h +1 -1
  56. data/ext/libcouchbase/include/libcouchbase/views.h +8 -0
  57. data/ext/libcouchbase/include/memcached/protocol_binary.h +40 -10
  58. data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +6 -14
  59. data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +3 -0
  60. data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +1 -0
  61. data/ext/libcouchbase/plugins/io/select/plugin-select.c +4 -1
  62. data/ext/libcouchbase/src/auth-priv.h +36 -4
  63. data/ext/libcouchbase/src/auth.cc +66 -27
  64. data/ext/libcouchbase/src/bootstrap.cc +1 -1
  65. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +12 -7
  66. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +26 -17
  67. data/ext/libcouchbase/src/bucketconfig/bc_http.h +1 -1
  68. data/ext/libcouchbase/src/bucketconfig/clconfig.h +4 -2
  69. data/ext/libcouchbase/src/bucketconfig/confmon.cc +6 -3
  70. data/ext/libcouchbase/src/cbft.cc +48 -0
  71. data/ext/libcouchbase/src/cntl.cc +138 -2
  72. data/ext/libcouchbase/src/config_static.h +17 -0
  73. data/ext/libcouchbase/src/connspec.cc +54 -6
  74. data/ext/libcouchbase/src/connspec.h +9 -1
  75. data/ext/libcouchbase/src/crypto.cc +386 -0
  76. data/ext/libcouchbase/src/ctx-log-inl.h +23 -6
  77. data/ext/libcouchbase/src/dump.cc +4 -0
  78. data/ext/libcouchbase/src/getconfig.cc +1 -2
  79. data/ext/libcouchbase/src/handler.cc +65 -27
  80. data/ext/libcouchbase/src/hostlist.cc +35 -7
  81. data/ext/libcouchbase/src/hostlist.h +7 -0
  82. data/ext/libcouchbase/src/http/http-priv.h +2 -0
  83. data/ext/libcouchbase/src/http/http.cc +77 -37
  84. data/ext/libcouchbase/src/http/http_io.cc +19 -2
  85. data/ext/libcouchbase/src/instance.cc +90 -17
  86. data/ext/libcouchbase/src/internal.h +5 -0
  87. data/ext/libcouchbase/src/lcbio/connect.cc +39 -4
  88. data/ext/libcouchbase/src/lcbio/connect.h +27 -0
  89. data/ext/libcouchbase/src/lcbio/ctx.c +49 -23
  90. data/ext/libcouchbase/src/lcbio/ioutils.cc +30 -3
  91. data/ext/libcouchbase/src/lcbio/ioutils.h +2 -0
  92. data/ext/libcouchbase/src/lcbio/manager.cc +44 -8
  93. data/ext/libcouchbase/src/lcbio/manager.h +2 -0
  94. data/ext/libcouchbase/src/lcbio/rw-inl.h +1 -0
  95. data/ext/libcouchbase/src/lcbio/ssl.h +3 -5
  96. data/ext/libcouchbase/src/logging.c +1 -1
  97. data/ext/libcouchbase/src/logging.h +2 -0
  98. data/ext/libcouchbase/src/mc/compress.cc +164 -0
  99. data/ext/libcouchbase/src/mc/compress.h +7 -12
  100. data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +5 -1
  101. data/ext/libcouchbase/src/mc/mcreq.c +11 -1
  102. data/ext/libcouchbase/src/mc/mcreq.h +35 -4
  103. data/ext/libcouchbase/src/mcserver/mcserver.cc +30 -7
  104. data/ext/libcouchbase/src/mcserver/mcserver.h +7 -0
  105. data/ext/libcouchbase/src/mcserver/negotiate.cc +103 -57
  106. data/ext/libcouchbase/src/mcserver/negotiate.h +2 -2
  107. data/ext/libcouchbase/src/mctx-helper.h +11 -0
  108. data/ext/libcouchbase/src/metrics.cc +132 -0
  109. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
  110. data/ext/libcouchbase/src/n1ql/n1ql.cc +66 -0
  111. data/ext/libcouchbase/src/newconfig.cc +9 -2
  112. data/ext/libcouchbase/src/operations/counter.cc +2 -1
  113. data/ext/libcouchbase/src/operations/durability-cas.cc +11 -0
  114. data/ext/libcouchbase/src/operations/durability-seqno.cc +3 -0
  115. data/ext/libcouchbase/src/operations/durability.cc +24 -2
  116. data/ext/libcouchbase/src/operations/durability_internal.h +19 -0
  117. data/ext/libcouchbase/src/operations/get.cc +4 -2
  118. data/ext/libcouchbase/src/operations/observe-seqno.cc +1 -0
  119. data/ext/libcouchbase/src/operations/observe.cc +113 -62
  120. data/ext/libcouchbase/src/operations/ping.cc +246 -67
  121. data/ext/libcouchbase/src/operations/remove.cc +2 -1
  122. data/ext/libcouchbase/src/operations/store.cc +17 -14
  123. data/ext/libcouchbase/src/operations/touch.cc +3 -0
  124. data/ext/libcouchbase/src/packetutils.h +68 -4
  125. data/ext/libcouchbase/src/probes.d +132 -161
  126. data/ext/libcouchbase/src/rdb/bigalloc.c +1 -1
  127. data/ext/libcouchbase/src/retryq.cc +6 -2
  128. data/ext/libcouchbase/src/rnd.cc +68 -0
  129. data/ext/libcouchbase/src/rnd.h +39 -0
  130. data/ext/libcouchbase/src/settings.c +27 -0
  131. data/ext/libcouchbase/src/settings.h +67 -3
  132. data/ext/libcouchbase/src/ssl/CMakeLists.txt +0 -12
  133. data/ext/libcouchbase/src/ssl/ssl_common.c +23 -4
  134. data/ext/libcouchbase/src/strcodecs/base64.c +141 -16
  135. data/ext/libcouchbase/src/strcodecs/strcodecs.h +16 -1
  136. data/ext/libcouchbase/src/trace.h +68 -61
  137. data/ext/libcouchbase/src/tracing/span.cc +289 -0
  138. data/ext/libcouchbase/src/tracing/threshold_logging_tracer.cc +171 -0
  139. data/ext/libcouchbase/src/tracing/tracer.cc +53 -0
  140. data/ext/libcouchbase/src/tracing/tracing-internal.h +213 -0
  141. data/ext/libcouchbase/src/utilities.c +5 -0
  142. data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -2
  143. data/ext/libcouchbase/src/vbucket/vbucket.c +50 -18
  144. data/ext/libcouchbase/src/views/docreq.cc +26 -1
  145. data/ext/libcouchbase/src/views/docreq.h +17 -0
  146. data/ext/libcouchbase/src/views/viewreq.cc +64 -1
  147. data/ext/libcouchbase/src/views/viewreq.h +21 -0
  148. data/ext/libcouchbase/tests/CMakeLists.txt +6 -6
  149. data/ext/libcouchbase/tests/basic/t_base64.cc +34 -6
  150. data/ext/libcouchbase/tests/basic/t_connstr.cc +14 -0
  151. data/ext/libcouchbase/tests/basic/t_creds.cc +10 -10
  152. data/ext/libcouchbase/tests/basic/t_host.cc +22 -2
  153. data/ext/libcouchbase/tests/basic/t_scram.cc +514 -0
  154. data/ext/libcouchbase/tests/check-all.cc +6 -2
  155. data/ext/libcouchbase/tests/iotests/mock-environment.cc +64 -0
  156. data/ext/libcouchbase/tests/iotests/mock-environment.h +27 -1
  157. data/ext/libcouchbase/tests/iotests/t_confmon.cc +2 -2
  158. data/ext/libcouchbase/tests/iotests/t_forward.cc +8 -0
  159. data/ext/libcouchbase/tests/iotests/t_netfail.cc +124 -0
  160. data/ext/libcouchbase/tests/iotests/t_smoke.cc +1 -1
  161. data/ext/libcouchbase/tests/iotests/t_snappy.cc +316 -0
  162. data/ext/libcouchbase/tests/socktests/socktest.cc +2 -2
  163. data/ext/libcouchbase/tests/socktests/t_basic.cc +6 -6
  164. data/ext/libcouchbase/tests/socktests/t_manager.cc +1 -1
  165. data/ext/libcouchbase/tests/socktests/t_ssl.cc +1 -1
  166. data/ext/libcouchbase/tools/CMakeLists.txt +1 -1
  167. data/ext/libcouchbase/tools/cbc-handlers.h +17 -0
  168. data/ext/libcouchbase/tools/cbc-n1qlback.cc +7 -4
  169. data/ext/libcouchbase/tools/cbc-pillowfight.cc +408 -100
  170. data/ext/libcouchbase/tools/cbc-proxy.cc +134 -3
  171. data/ext/libcouchbase/tools/cbc-subdoc.cc +1 -2
  172. data/ext/libcouchbase/tools/cbc.cc +113 -8
  173. data/ext/libcouchbase/tools/common/histogram.cc +1 -0
  174. data/ext/libcouchbase/tools/common/options.cc +28 -1
  175. data/ext/libcouchbase/tools/common/options.h +5 -0
  176. data/ext/libcouchbase/tools/docgen/docgen.h +36 -10
  177. data/ext/libcouchbase/tools/docgen/loc.h +5 -4
  178. data/ext/libcouchbase/tools/docgen/seqgen.h +28 -0
  179. data/lib/libcouchbase/ext/libcouchbase/enums.rb +10 -0
  180. data/lib/libcouchbase/n1ql.rb +6 -1
  181. data/lib/libcouchbase/version.rb +1 -1
  182. data/spec/connection_spec.rb +6 -6
  183. metadata +38 -5
  184. data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +0 -11
  185. data/ext/libcouchbase/src/mc/compress.c +0 -90
  186. data/ext/libcouchbase/tools/common/my_inttypes.h +0 -22
@@ -1,2 +1,2 @@
1
- ADD_LIBRARY(vbucket OBJECT vbucket.c ketama.c ${SOURCE_ROOT}/contrib/cJSON/cJSON.c)
2
- LCB_UTIL(vbucket)
1
+ ADD_LIBRARY(vbucket-lcb OBJECT vbucket.c ketama.c ${SOURCE_ROOT}/contrib/cJSON/cJSON.c)
2
+ LCB_UTIL(vbucket-lcb)
@@ -91,6 +91,16 @@ build_vbmap(lcbvb_CONFIG *cfg, cJSON *cj, unsigned *nitems)
91
91
  return NULL;
92
92
  }
93
93
 
94
+ static void copy_address(char *buf, size_t nbuf, const char *host, lcb_U16 port)
95
+ {
96
+ if (strchr(host, ':')) {
97
+ // IPv6 and should be bracketed
98
+ snprintf(buf, nbuf, "[%s]:%d", host, port);
99
+ } else {
100
+ snprintf(buf, nbuf, "%s:%d", host, port);
101
+ }
102
+ }
103
+
94
104
  static lcbvb_SERVER *
95
105
  find_server_memd(lcbvb_SERVER *servers, unsigned n, const char *s)
96
106
  {
@@ -98,7 +108,7 @@ find_server_memd(lcbvb_SERVER *servers, unsigned n, const char *s)
98
108
  for (ii = 0; ii < n; ii++) {
99
109
  char buf[4096] = { 0 };
100
110
  lcbvb_SERVER *cur = servers + ii;
101
- snprintf(buf, sizeof(buf), "%s:%d", cur->hostname, cur->svc.data);
111
+ copy_address(buf, sizeof(buf), cur->hostname, cur->svc.data);
102
112
  if (!strncmp(s, buf, sizeof(buf))) {
103
113
  return cur;
104
114
  }
@@ -179,7 +189,7 @@ pair_server_list(lcbvb_CONFIG *cfg, cJSON *vbconfig)
179
189
  }
180
190
 
181
191
  /* allocate an array for the reordered server list */
182
- newlist = malloc(sizeof(*cfg->servers) * nsrv);
192
+ newlist = calloc(nsrv, sizeof(*cfg->servers));
183
193
 
184
194
  for (ii = 0; ii < nsrv; ii++) {
185
195
  char *tmp;
@@ -343,14 +353,14 @@ build_server_strings(lcbvb_CONFIG *cfg, lcbvb_SERVER *server)
343
353
  /* get the authority */
344
354
  char tmpbuf[4096];
345
355
 
346
- sprintf(tmpbuf, "%s:%d", server->hostname, server->svc.data);
356
+ copy_address(tmpbuf, sizeof(tmpbuf), server->hostname, server->svc.data);
347
357
  server->authority = strdup(tmpbuf);
348
358
  if (!server->authority) {
349
359
  SET_ERRSTR(cfg, "Couldn't allocate authority");
350
360
  return 0;
351
361
  }
352
362
 
353
- server->svc.hoststrs[LCBVB_SVCTYPE_DATA] = server->authority;
363
+ server->svc.hoststrs[LCBVB_SVCTYPE_DATA] = strdup(server->authority);
354
364
  if (server->viewpath == NULL && server->svc.views) {
355
365
  server->viewpath = malloc(strlen(cfg->bname) + 2);
356
366
  sprintf(server->viewpath, "/%s", cfg->bname);
@@ -661,7 +671,16 @@ LIBCOUCHBASE_API
661
671
  void
662
672
  lcbvb_replace_host(lcbvb_CONFIG *cfg, const char *hoststr)
663
673
  {
664
- unsigned ii;
674
+ unsigned ii, copy = 0;
675
+ char *replacement = (char *)hoststr;
676
+ if (strchr(replacement, ':')) {
677
+ size_t len = strlen(hoststr);
678
+ replacement = calloc(len + 2, sizeof(char));
679
+ replacement[0] = '[';
680
+ memcpy(replacement + 1, hoststr, len);
681
+ replacement[len + 1] = ']';
682
+ copy = 1;
683
+ }
665
684
  for (ii = 0; ii < cfg->nsrv; ++ii) {
666
685
  unsigned jj;
667
686
  lcbvb_SERVER *srv = cfg->servers + ii;
@@ -671,13 +690,17 @@ lcbvb_replace_host(lcbvb_CONFIG *cfg, const char *hoststr)
671
690
  for (jj = 0; jj < 2; ++jj) {
672
691
  unsigned kk;
673
692
  lcbvb_SERVICES *cursvc = svcs[jj];
674
- replace_hoststr(&cursvc->views_base_, hoststr);
693
+ replace_hoststr(&cursvc->views_base_, replacement);
675
694
  for (kk = 0; kk < LCBVB_SVCTYPE__MAX; ++kk) {
676
- replace_hoststr(&cursvc->hoststrs[kk], hoststr);
695
+ replace_hoststr(&cursvc->hoststrs[kk], replacement);
677
696
  }
678
697
  }
679
698
  /* reassign authority */
680
- srv->authority = srv->svc.hoststrs[LCBVB_SVCTYPE_DATA];
699
+ free(srv->authority);
700
+ srv->authority = strdup(srv->svc.hoststrs[LCBVB_SVCTYPE_DATA]);
701
+ }
702
+ if (copy) {
703
+ free(replacement);
681
704
  }
682
705
  if (cfg->dtype == LCBVB_DIST_KETAMA) {
683
706
  update_ketama(cfg);
@@ -730,6 +753,7 @@ lcbvb_destroy(lcbvb_CONFIG *conf)
730
753
  free(srv->cbaspath);
731
754
  free_service_strs(&srv->svc);
732
755
  free_service_strs(&srv->svc_ssl);
756
+ free(srv->authority);
733
757
  }
734
758
  free(conf->servers);
735
759
  free(conf->continuum);
@@ -1181,8 +1205,9 @@ lcbvb_get_hostport(lcbvb_CONFIG *cfg,
1181
1205
 
1182
1206
  strp = &svc->hoststrs[type];
1183
1207
  if (*strp == NULL) {
1184
- *strp = malloc(strlen(srv->hostname) + 20);
1185
- sprintf(*strp, "%s:%d", srv->hostname, port);
1208
+ size_t strn = strlen(srv->hostname) + 20;
1209
+ *strp = calloc(strn, sizeof(char));
1210
+ copy_address(*strp, strn, srv->hostname, port);
1186
1211
  }
1187
1212
  return *strp;
1188
1213
  }
@@ -1260,7 +1285,6 @@ lcbvb_get_resturl(lcbvb_CONFIG *cfg, unsigned ix,
1260
1285
  lcbvb_SVCTYPE svc, lcbvb_SVCMODE mode)
1261
1286
  {
1262
1287
  char **strp;
1263
- char buf[4096];
1264
1288
  const char *prefix;
1265
1289
  const char *path;
1266
1290
 
@@ -1301,7 +1325,13 @@ lcbvb_get_resturl(lcbvb_CONFIG *cfg, unsigned ix,
1301
1325
  if (path == NULL) {
1302
1326
  return NULL;
1303
1327
  } else if (!*strp) {
1304
- sprintf(buf, "%s://%s:%d%s", prefix, srv->hostname, port, path);
1328
+ char buf[4096];
1329
+ if (strchr(srv->hostname, ':')) {
1330
+ // IPv6 and should be bracketed
1331
+ snprintf(buf, sizeof(buf), "%s://[%s]:%d%s", prefix, srv->hostname, port, path);
1332
+ } else {
1333
+ snprintf(buf, sizeof(buf), "%s://%s:%d%s", prefix, srv->hostname, port, path);
1334
+ }
1305
1335
  *strp = strdup(buf);
1306
1336
  }
1307
1337
 
@@ -1336,11 +1366,8 @@ LIBCOUCHBASE_API const char *lcbvb_get_error(const lcbvb_CONFIG *cfg) {
1336
1366
  ******************************************************************************
1337
1367
  ******************************************************************************/
1338
1368
 
1339
- static void
1340
- copy_service(const char *hostname,
1341
- const lcbvb_SERVICES *src, lcbvb_SERVICES *dst)
1369
+ static void copy_service(const char *hostname, const lcbvb_SERVICES *src, lcbvb_SERVICES *dst)
1342
1370
  {
1343
- char buf[4096];
1344
1371
  *dst = *src;
1345
1372
  memset(&dst->hoststrs, 0, sizeof dst->hoststrs);
1346
1373
  if (src->views_base_) {
@@ -1356,7 +1383,8 @@ copy_service(const char *hostname,
1356
1383
  dst->cbas_base_ = strdup(src->cbas_base_);
1357
1384
  }
1358
1385
  if (dst->data) {
1359
- sprintf(buf, "%s:%d", hostname, dst->data);
1386
+ char buf[4096];
1387
+ copy_address(buf, sizeof(buf), hostname, dst->data);
1360
1388
  dst->hoststrs[LCBVB_SVCTYPE_DATA] = strdup(buf);
1361
1389
  }
1362
1390
  }
@@ -1452,7 +1480,11 @@ lcbvb_genconfig_ex(lcbvb_CONFIG *vb,
1452
1480
 
1453
1481
  copy_service(src->hostname, &src->svc, &dst->svc);
1454
1482
  copy_service(src->hostname, &src->svc_ssl, &dst->svc_ssl);
1455
- dst->authority = dst->svc.hoststrs[LCBVB_SVCTYPE_DATA];
1483
+ {
1484
+ char tmpbuf[MAX_AUTHORITY_SIZE] = {0};
1485
+ copy_address(tmpbuf, sizeof(tmpbuf), dst->hostname, dst->svc.data);
1486
+ dst->authority = strdup(tmpbuf);
1487
+ }
1456
1488
  }
1457
1489
 
1458
1490
  for (ii = 0; ii < vb->nvb; ii++) {
@@ -1,4 +1,21 @@
1
- #include "docreq.h"
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014-2018 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #include "viewreq.h"
2
19
  #include "internal.h"
3
20
  #include "sllist-inl.h"
4
21
 
@@ -100,6 +117,14 @@ docreq_handler(void *arg)
100
117
  lcb_CMDGET gcmd = { 0 };
101
118
 
102
119
  LCB_CMD_SET_KEY(&gcmd, cont->docid.iov_base, cont->docid.iov_len);
120
+ #ifdef LCB_TRACING
121
+ if (cont->parent->parent) {
122
+ lcb::views::ViewRequest *req = reinterpret_cast<lcb::views::ViewRequest *>(cont->parent->parent);
123
+ if (req->span) {
124
+ LCB_CMD_SET_TRACESPAN(&gcmd, req->span);
125
+ }
126
+ }
127
+ #endif
103
128
  cont->callback = doc_callback;
104
129
  gcmd.cmdflags |= LCB_CMD_F_INTERNAL_CALLBACK;
105
130
  rc = lcb_get3(instance, &cont->callback, &gcmd);
@@ -1,3 +1,20 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014-2018 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
1
18
  /**
2
19
  * Document request routines
3
20
  */
@@ -1,3 +1,20 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014-2018 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
1
18
  #include "viewreq.h"
2
19
  #include "sllist-inl.h"
3
20
  #include "http/http.h"
@@ -188,6 +205,27 @@ cb_docq_throttle(lcb::docreq::Queue *q, int enabled)
188
205
  ViewRequest::~ViewRequest() {
189
206
  invoke_last();
190
207
 
208
+ #ifdef LCB_TRACING
209
+ if (span) {
210
+ if (htreq) {
211
+ lcbio_CTX *ctx = htreq->ioctx;
212
+ if (ctx) {
213
+ std::string remote;
214
+ if (htreq->ipv6) {
215
+ remote = "[" + std::string(htreq->host) + "]:" + std::string(htreq->port);
216
+ } else {
217
+ remote = std::string(htreq->host) + ":" + std::string(htreq->port);
218
+ }
219
+ lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_PEER_ADDRESS, remote.c_str());
220
+ lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_LOCAL_ADDRESS,
221
+ lcbio__inet_ntop(&ctx->sock->info->sa_local).c_str());
222
+ }
223
+ }
224
+ lcbtrace_span_finish(span, LCBTRACE_NOW);
225
+ span = NULL;
226
+ }
227
+ #endif
228
+
191
229
  if (parser != NULL) {
192
230
  delete parser;
193
231
  }
@@ -239,7 +277,11 @@ ViewRequest::ViewRequest(lcb_t instance_, const void *cookie_,
239
277
  cookie(cookie_), docq(NULL), callback(cmd->callback),
240
278
  instance(instance_), refcount(1),
241
279
  cmdflags(cmd->cmdflags),
242
- lasterr(LCB_SUCCESS) {
280
+ lasterr(LCB_SUCCESS)
281
+ #ifdef LCB_TRACING
282
+ , span(NULL)
283
+ #endif
284
+ {
243
285
 
244
286
  // Validate:
245
287
  if (cmd->nddoc == 0 || cmd->nview == 0 || callback == NULL) {
@@ -270,6 +312,15 @@ ViewRequest::ViewRequest(lcb_t instance_, const void *cookie_,
270
312
  lcb_aspend_add(&instance->pendops, LCB_PENDTYPE_COUNTER, NULL);
271
313
 
272
314
  lasterr = request_http(cmd);
315
+ #ifdef LCB_TRACING
316
+ if (lasterr == LCB_SUCCESS && instance->settings->tracer) {
317
+ char id[20] = {0};
318
+ snprintf(id, sizeof(id), "%p", (void *)this);
319
+ span = lcbtrace_span_start(instance->settings->tracer, LCBTRACE_OP_DISPATCH_TO_SERVER, LCBTRACE_NOW, NULL);
320
+ lcbtrace_span_add_tag_str(span, LCBTRACE_TAG_OPERATION_ID, id);
321
+ lcbtrace_span_add_system_tags(span, instance->settings, LCBTRACE_TAG_SERVICE_VIEW);
322
+ }
323
+ #endif
273
324
  }
274
325
 
275
326
  LIBCOUCHBASE_API
@@ -316,3 +367,15 @@ void ViewRequest::cancel() {
316
367
  }
317
368
  }
318
369
  }
370
+
371
+ #ifdef LCB_TRACING
372
+
373
+ LIBCOUCHBASE_API
374
+ void lcb_view_set_parent_span(lcb_t, lcb_VIEWHANDLE handle, lcbtrace_SPAN *span)
375
+ {
376
+ if (handle && handle->span) {
377
+ lcbtrace_span_set_parent(handle->span, span);
378
+ }
379
+ }
380
+
381
+ #endif
@@ -1,3 +1,20 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014-2018 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
1
18
  #include <libcouchbase/couchbase.h>
2
19
  #include <libcouchbase/views.h>
3
20
  #include <libcouchbase/pktfwd.h>
@@ -60,6 +77,10 @@ struct ViewRequest : lcb::jsparse::Parser::Actions {
60
77
  unsigned refcount;
61
78
  uint32_t cmdflags;
62
79
  lcb_error_t lasterr;
80
+ #ifdef LCB_TRACING
81
+ lcbtrace_SPAN *span;
82
+ #endif
83
+
63
84
  };
64
85
 
65
86
  }
@@ -3,7 +3,7 @@ IF (NOT (WIN32 AND CMAKE_COMPILER_IS_GNUCC))
3
3
  SET(gtest_force_shared_crt ON CACHE BOOL "" )
4
4
  SET(BUILD_SHARED_LIBS ON)
5
5
  ENDIF()
6
- ADD_SUBDIRECTORY(${CMAKE_SOURCE_DIR}/contrib/gtest-1.7.0 gtest)
6
+ ADD_SUBDIRECTORY(${PROJECT_SOURCE_DIR}/contrib/gtest-1.7.0 gtest)
7
7
  INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
8
8
 
9
9
  ADD_EXECUTABLE(check-all EXCLUDE_FROM_ALL
@@ -34,10 +34,10 @@ ENDIF()
34
34
  ADD_EXECUTABLE(nonio-tests EXCLUDE_FROM_ALL nonio_tests.cc ${T_BASIC_SRC})
35
35
 
36
36
  ADD_EXECUTABLE(mc-tests EXCLUDE_FROM_ALL nonio_tests.cc ${T_MC_SRC}
37
- $<TARGET_OBJECTS:mcreq> $<TARGET_OBJECTS:netbuf> $<TARGET_OBJECTS:vbucket>)
37
+ $<TARGET_OBJECTS:mcreq> $<TARGET_OBJECTS:mcreq-cxx> $<TARGET_OBJECTS:netbuf> $<TARGET_OBJECTS:vbucket-lcb>)
38
38
 
39
39
  ADD_EXECUTABLE(mc-malloc-tests EXCLUDE_FROM_ALL nonio_tests.cc ${T_MC_SRC}
40
- $<TARGET_OBJECTS:mcreq> $<TARGET_OBJECTS:netbuf-malloc> $<TARGET_OBJECTS:vbucket>)
40
+ $<TARGET_OBJECTS:mcreq> $<TARGET_OBJECTS:mcreq-cxx> $<TARGET_OBJECTS:netbuf-malloc> $<TARGET_OBJECTS:vbucket-lcb>)
41
41
 
42
42
  ADD_EXECUTABLE(netbuf-tests
43
43
  EXCLUDE_FROM_ALL nonio_tests.cc basic/t_netbuf.cc $<TARGET_OBJECTS:netbuf>)
@@ -75,9 +75,8 @@ ENDIF(NOT EXISTS ${PROJECT_SOURCE_DIR}/tests/CouchbaseMock.jar AND NOT LCB_NO_MO
75
75
  INCLUDE_DIRECTORIES(${gtest_SOURCE_DIR}/include ${gtest_SOURCE_DIR})
76
76
  TARGET_LINK_LIBRARIES(unit-tests couchbaseS gtest)
77
77
  TARGET_LINK_LIBRARIES(nonio-tests couchbaseS gtest)
78
- TARGET_LINK_LIBRARIES(mc-tests gtest ${LCB_SNAPPY_LINK})
79
- TARGET_LINK_LIBRARIES(mc-malloc-tests
80
- gtest ${LCB_SNAPPY_LINK})
78
+ TARGET_LINK_LIBRARIES(mc-tests couchbaseS gtest)
79
+ TARGET_LINK_LIBRARIES(mc-malloc-tests couchbaseS gtest)
81
80
  TARGET_LINK_LIBRARIES(netbuf-tests gtest)
82
81
  TARGET_LINK_LIBRARIES(rdb-tests gtest)
83
82
  TARGET_LINK_LIBRARIES(sock-tests couchbaseS gtest)
@@ -92,6 +91,7 @@ ENDIF()
92
91
  ADD_CUSTOM_TARGET(alltests DEPENDS check-all unit-tests nonio-tests
93
92
  rdb-tests sock-tests vbucket-tests mc-tests htparse-tests)
94
93
 
94
+
95
95
  ADD_TEST(NAME BUILD-TESTS COMMAND ${CMAKE_COMMAND} --build "${PROJECT_BINARY_DIR}" --target alltests)
96
96
 
97
97
  MACRO(DEFINE_MOCKTEST plugin test)
@@ -18,17 +18,35 @@
18
18
  #include <gtest/gtest.h>
19
19
 
20
20
  extern "C" {
21
- extern int lcb_base64_encode(const char *src, char *dst,
22
- size_t sz);
21
+ extern int lcb_base64_encode(const char *src, size_t nsrc, char *dst, size_t ndst);
22
+ extern int lcb_base64_decode(const char *src, size_t nsrc, char *dst, size_t ndst);
23
+
24
+ extern int lcb_base64_encode2(const char *src, size_t nsrc, char **dst, size_t *ndst);
25
+ extern int lcb_base64_decode2(const char *src, size_t nsrc, char **dst, size_t *ndst);
23
26
  }
24
27
 
25
28
  class Base64 : public ::testing::Test
26
29
  {
27
- protected:
28
- void validate(const char *src, const char *result) {
30
+ protected:
31
+ void validate(const char *src, const char *result)
32
+ {
29
33
  char dest[1024];
30
- ASSERT_NE(-1, lcb_base64_encode(src, dest, sizeof(dest)));
34
+ ASSERT_GE(lcb_base64_encode(src, strlen(src), dest, sizeof(dest)), 0);
31
35
  EXPECT_STREQ(result, dest);
36
+ memset(dest, 0, sizeof(dest));
37
+ ASSERT_GE(lcb_base64_decode(result, strlen(result), dest, sizeof(dest)), 0);
38
+ EXPECT_STREQ(src, dest);
39
+
40
+ char *tmp = NULL;
41
+ size_t ntmp = 0;
42
+ ASSERT_GE(lcb_base64_encode2(src, strlen(src), &tmp, &ntmp), 0);
43
+ EXPECT_STREQ(result, tmp);
44
+ free(tmp);
45
+ tmp = NULL;
46
+ ntmp = 0;
47
+ ASSERT_GE(lcb_base64_decode2(result, strlen(result), &tmp, &ntmp), 0);
48
+ EXPECT_STREQ(src, tmp);
49
+ free(tmp);
32
50
  }
33
51
  };
34
52
 
@@ -62,7 +80,6 @@ TEST_F(Base64, testWikipediaExample)
62
80
  validate("sure.", "c3VyZS4=");
63
81
  }
64
82
 
65
-
66
83
  TEST_F(Base64, testStuff)
67
84
  {
68
85
  // Dummy test data. It looks like the "base64" command line
@@ -79,3 +96,14 @@ TEST_F(Base64, testStuff)
79
96
  validate("blahblah:bla@@h", "YmxhaGJsYWg6YmxhQEBo");
80
97
  validate("blahblah:bla@@h\n", "YmxhaGJsYWg6YmxhQEBoCg==");
81
98
  }
99
+
100
+ TEST_F(Base64, testTooSmallOutputBuffer)
101
+ {
102
+ const char *plain = "foobar";
103
+ const char *base64 = "Zm9vYmFy";
104
+
105
+ char dest[2];
106
+
107
+ ASSERT_EQ(lcb_base64_encode(plain, strlen(plain), dest, sizeof(dest)), -1);
108
+ ASSERT_EQ(lcb_base64_decode(base64, strlen(base64), dest, sizeof(dest)), -1);
109
+ }