libcouchbase 1.2.8 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }