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
@@ -212,7 +212,7 @@ rdb_bigalloc_dump(rdb_BIGALLOC *alloc, FILE *fp)
212
212
  {
213
213
  static const char *indent = " ";
214
214
  fprintf(fp, "BIGALLOC @%p\n", (void *)alloc);
215
- fprintf(fp, "%sPooled Blocks: %lu\n", indent, LCB_CLIST_SIZE(&alloc->bufs));
215
+ fprintf(fp, "%sPooled Blocks: %lu\n", indent, (unsigned long int)LCB_CLIST_SIZE(&alloc->bufs));
216
216
  fprintf(fp, "%sMinAlloc: %u\n", indent, alloc->min_blk_alloc);
217
217
  fprintf(fp, "%sMaxAlloc: %u\n", indent, alloc->max_blk_alloc);
218
218
  fprintf(fp, "%sMaxBlocks: %u\n", indent, alloc->max_blk_count);
@@ -195,8 +195,8 @@ RetryQueue::schedule(hrtime_t now)
195
195
  diff = selected - now;
196
196
  }
197
197
 
198
- uint32_t us_interval = LCB_NS2US(diff);
199
- lcb_log(LOGARGS(this, TRACE), "Next tick in %u ms", (unsigned)us_interval/1000);
198
+ uint64_t us_interval = LCB_NS2US(diff);
199
+ lcb_log(LOGARGS(this, TRACE), "Next tick in %" PRIu64 " ms", us_interval/1000);
200
200
  lcbio_timer_rearm(timer, us_interval);
201
201
  }
202
202
 
@@ -349,6 +349,10 @@ RetryQueue::add(mc_EXPACKET *pkt, const lcb_error_t err,
349
349
 
350
350
  lcb_log(LOGARGS(this, DEBUG), "Adding PKT=%p to retry queue. Try count=%u", (void*)pkt, pkt->base.retries);
351
351
  schedule();
352
+
353
+ if (settings->metrics) {
354
+ settings->metrics->packets_retried++;
355
+ }
352
356
  }
353
357
 
354
358
  void
@@ -0,0 +1,68 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 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 "rnd.h"
19
+ #include "internal.h"
20
+
21
+ #if !defined(COMPILER_SUPPORTS_CXX11) || (defined(_MSC_VER) && _MSC_VER < 1600)
22
+ static volatile int rnd_initialized = 0;
23
+ LCB_INTERNAL_API
24
+ void lcb_rnd_global_init(void)
25
+ {
26
+ if (rnd_initialized) {
27
+ return;
28
+ }
29
+ rnd_initialized = 1;
30
+ if (lcb_getenv_boolean("LCB_NO_SRAND")) {
31
+ return;
32
+ }
33
+ srand(time(NULL));
34
+ }
35
+
36
+ LCB_INTERNAL_API
37
+ lcb_U32 lcb_next_rand32(void)
38
+ {
39
+ return (lcb_U32)rand();
40
+ }
41
+
42
+ LCB_INTERNAL_API
43
+ lcb_U64 lcb_next_rand64(void)
44
+ {
45
+ return (lcb_U64)rand();
46
+ }
47
+ #else
48
+
49
+ #include <random>
50
+
51
+ LCB_INTERNAL_API
52
+ lcb_U32 lcb_next_rand32(void)
53
+ {
54
+ static std::random_device rd;
55
+ static std::mt19937 gen(rd());
56
+ static std::uniform_int_distribution< lcb_U32 > dis;
57
+ return dis(gen);
58
+ }
59
+
60
+ LCB_INTERNAL_API
61
+ lcb_U64 lcb_next_rand64(void)
62
+ {
63
+ static std::random_device rd;
64
+ static std::mt19937 gen(rd());
65
+ static std::uniform_int_distribution< lcb_U64 > dis;
66
+ return dis(gen);
67
+ }
68
+ #endif
@@ -0,0 +1,39 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 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
+ #ifndef LIBCOUCHBASE_RND_H
19
+ #define LIBCOUCHBASE_RND_H 1
20
+
21
+ #include "config.h"
22
+ #include <libcouchbase/couchbase.h>
23
+
24
+ #ifdef __cplusplus
25
+ extern "C" {
26
+ #endif
27
+
28
+ LCB_INTERNAL_API lcb_U32 lcb_next_rand32(void);
29
+ LCB_INTERNAL_API lcb_U64 lcb_next_rand64(void);
30
+
31
+ #if !defined(COMPILER_SUPPORTS_CXX11) || (defined(_MSC_VER) && _MSC_VER < 1600)
32
+ LCB_INTERNAL_API void lcb_rnd_global_init(void);
33
+ #endif
34
+
35
+ #ifdef __cplusplus
36
+ }
37
+ #endif
38
+
39
+ #endif
@@ -46,6 +46,8 @@ void lcb_default_settings(lcb_settings *settings)
46
46
  settings->retry[LCB_RETRY_ON_MISSINGNODE] = 0;
47
47
  settings->bc_http_urltype = LCB_DEFAULT_HTCONFIG_URLTYPE;
48
48
  settings->compressopts = LCB_DEFAULT_COMPRESSOPTS;
49
+ settings->compress_min_size = LCB_DEFAULT_COMPRESS_MIN_SIZE;
50
+ settings->compress_min_ratio = LCB_DEFAULT_COMPRESS_MIN_RATIO;
49
51
  settings->allocator_factory = rdb_bigalloc_new;
50
52
  settings->syncmode = LCB_ASYNCHRONOUS;
51
53
  settings->detailed_neterr = 0;
@@ -57,11 +59,26 @@ void lcb_default_settings(lcb_settings *settings)
57
59
  settings->tcp_nodelay = LCB_DEFAULT_TCP_NODELAY;
58
60
  settings->retry_nmv_interval = LCB_DEFAULT_RETRY_NMV_INTERVAL;
59
61
  settings->vb_noguess = LCB_DEFAULT_VB_NOGUESS;
62
+ settings->vb_noremap = LCB_DEFAULT_VB_NOREMAP;
60
63
  settings->select_bucket = LCB_DEFAULT_SELECT_BUCKET;
61
64
  settings->tcp_keepalive = LCB_DEFAULT_TCP_KEEPALIVE;
62
65
  settings->send_hello = 1;
63
66
  settings->config_poll_interval = LCB_DEFAULT_CONFIG_POLL_INTERVAL;
64
67
  settings->use_errmap = 1;
68
+ settings->use_collections = 0;
69
+ settings->log_redaction = 0;
70
+ settings->use_tracing = 0;
71
+ #ifdef LCB_TRACING
72
+ settings->tracer_orphaned_queue_flush_interval = LCBTRACE_DEFAULT_ORPHANED_QUEUE_FLUSH_INTERVAL;
73
+ settings->tracer_orphaned_queue_size = LCBTRACE_DEFAULT_ORPHANED_QUEUE_SIZE;
74
+ settings->tracer_threshold_queue_flush_interval = LCBTRACE_DEFAULT_THRESHOLD_QUEUE_FLUSH_INTERVAL;
75
+ settings->tracer_threshold_queue_size = LCBTRACE_DEFAULT_THRESHOLD_QUEUE_SIZE;
76
+ settings->tracer_threshold[LCBTRACE_THRESHOLD_KV] = LCBTRACE_DEFAULT_THRESHOLD_KV;
77
+ settings->tracer_threshold[LCBTRACE_THRESHOLD_N1QL] = LCBTRACE_DEFAULT_THRESHOLD_N1QL;
78
+ settings->tracer_threshold[LCBTRACE_THRESHOLD_VIEW] = LCBTRACE_DEFAULT_THRESHOLD_VIEW;
79
+ settings->tracer_threshold[LCBTRACE_THRESHOLD_FTS] = LCBTRACE_DEFAULT_THRESHOLD_FTS;
80
+ settings->tracer_threshold[LCBTRACE_THRESHOLD_ANALYTICS] = LCBTRACE_DEFAULT_THRESHOLD_ANALYTICS;
81
+ #endif
65
82
  }
66
83
 
67
84
  LCB_INTERNAL_API
@@ -86,6 +103,7 @@ lcb_settings_unref(lcb_settings *settings)
86
103
  free(settings->bucket);
87
104
  free(settings->sasl_mech_force);
88
105
  free(settings->certpath);
106
+ free(settings->keypath);
89
107
  free(settings->client_string);
90
108
 
91
109
  lcbauth_unref(settings->auth);
@@ -94,6 +112,15 @@ lcb_settings_unref(lcb_settings *settings)
94
112
  if (settings->ssl_ctx) {
95
113
  lcbio_ssl_free(settings->ssl_ctx);
96
114
  }
115
+ if (settings->metrics) {
116
+ lcb_metrics_destroy(settings->metrics);
117
+ }
118
+ #ifdef LCB_TRACING
119
+ if (settings->tracer) {
120
+ lcbtrace_destroy(settings->tracer);
121
+ settings->tracer = NULL;
122
+ }
123
+ #endif
97
124
  if (settings->dtorcb) {
98
125
  settings->dtorcb(settings->dtorarg);
99
126
  }
@@ -32,7 +32,7 @@
32
32
  #define LCB_S2NS(s) (((hrtime_t)s) * 1000000000)
33
33
 
34
34
  /** Convert nanoseconds to microseconds */
35
- #define LCB_NS2US(s) (lcb_uint32_t) ((s) / 1000)
35
+ #define LCB_NS2US(s) ((s) / 1000)
36
36
 
37
37
  #define LCB_MS2US(s) ((s) * 1000)
38
38
 
@@ -80,11 +80,17 @@
80
80
  #define LCB_DEFAULT_NETRETRY LCB_RETRY_CMDS_ALL
81
81
  #define LCB_DEFAULT_NMVRETRY LCB_RETRY_CMDS_ALL
82
82
  #define LCB_DEFAULT_HTCONFIG_URLTYPE LCB_HTCONFIG_URLTYPE_TRYALL
83
- #define LCB_DEFAULT_COMPRESSOPTS LCB_COMPRESS_NONE
83
+ #define LCB_DEFAULT_COMPRESSOPTS LCB_COMPRESS_INOUT
84
+
85
+ /* in bytes */
86
+ #define LCB_DEFAULT_COMPRESS_MIN_SIZE 32
87
+ /* compressed_bytes / original_bytes */
88
+ #define LCB_DEFAULT_COMPRESS_MIN_RATIO 0.83
84
89
 
85
90
  #define LCB_DEFAULT_NVM_RETRY_IMM 1
86
91
  #define LCB_DEFAULT_RETRY_NMV_INTERVAL LCB_MS2US(100)
87
92
  #define LCB_DEFAULT_VB_NOGUESS 1
93
+ #define LCB_DEFAULT_VB_NOREMAP 0
88
94
  #define LCB_DEFAULT_TCP_NODELAY 1
89
95
  #define LCB_DEFAULT_SELECT_BUCKET 1
90
96
  #define LCB_DEFAULT_TCP_KEEPALIVE 1
@@ -93,10 +99,25 @@
93
99
  /* 50 ms */
94
100
  #define LCB_CONFIG_POLL_INTERVAL_FLOOR LCB_MS2US(50)
95
101
 
102
+ #define LCBTRACE_DEFAULT_ORPHANED_QUEUE_FLUSH_INTERVAL LCB_MS2US(1000)
103
+ #define LCBTRACE_DEFAULT_ORPHANED_QUEUE_SIZE 128
104
+ #define LCBTRACE_DEFAULT_THRESHOLD_QUEUE_FLUSH_INTERVAL LCB_MS2US(3000)
105
+ #define LCBTRACE_DEFAULT_THRESHOLD_QUEUE_SIZE 128
106
+ #define LCBTRACE_DEFAULT_THRESHOLD_KV LCB_MS2US(500)
107
+ #define LCBTRACE_DEFAULT_THRESHOLD_N1QL LCB_MS2US(1000)
108
+ #define LCBTRACE_DEFAULT_THRESHOLD_VIEW LCB_MS2US(1000)
109
+ #define LCBTRACE_DEFAULT_THRESHOLD_FTS LCB_MS2US(1000)
110
+ #define LCBTRACE_DEFAULT_THRESHOLD_ANALYTICS LCB_MS2US(1000)
111
+
96
112
  #include "config.h"
97
113
  #include <libcouchbase/couchbase.h>
114
+ #include <libcouchbase/metrics.h>
98
115
  #include "errmap.h"
99
116
 
117
+ #ifdef LCB_TRACING
118
+ #include <libcouchbase/tracing.h>
119
+ #endif
120
+
100
121
  #ifdef __cplusplus
101
122
  extern "C" {
102
123
  #endif
@@ -104,6 +125,7 @@ extern "C" {
104
125
  struct lcb_logprocs_st;
105
126
  struct lcbio_SSLCTX;
106
127
  struct rdb_ALLOCATOR;
128
+ struct lcb_METRICS_st;
107
129
 
108
130
  /**
109
131
  * Stateless setting structure.
@@ -111,7 +133,8 @@ struct rdb_ALLOCATOR;
111
133
  * which are intended to be passed around to other objects.
112
134
  */
113
135
  typedef struct lcb_settings_st {
114
- lcb_U16 iid;
136
+ /* TODO: [SDK3] change to uint64_t as per RFC. logging API exposes it as unsigned int currently */
137
+ lcb_U32 iid;
115
138
  lcb_U8 compressopts;
116
139
  lcb_U8 syncmode;
117
140
  lcb_U32 read_chunk_size;
@@ -164,6 +187,11 @@ typedef struct lcb_settings_st {
164
187
  unsigned select_bucket : 1;
165
188
  unsigned tcp_keepalive : 1;
166
189
  unsigned send_hello : 1;
190
+ unsigned use_collections : 1;
191
+ unsigned log_redaction : 1;
192
+ unsigned use_tracing : 1;
193
+ /** Do not use remap vbuckets (do not use fast forward map, or any other heuristics) */
194
+ unsigned vb_noremap : 1;
167
195
 
168
196
  short max_redir;
169
197
  unsigned refcount;
@@ -173,7 +201,9 @@ typedef struct lcb_settings_st {
173
201
 
174
202
  char *bucket;
175
203
  char *sasl_mech_force;
204
+ char *truststorepath;
176
205
  char *certpath;
206
+ char *keypath;
177
207
  lcb_AUTHENTICATOR *auth;
178
208
  struct rdb_ALLOCATOR* (*allocator_factory)(void);
179
209
  struct lcbio_SSLCTX *ssl_ctx;
@@ -183,6 +213,17 @@ typedef struct lcb_settings_st {
183
213
  char *client_string;
184
214
  lcb_pERRMAP errmap;
185
215
  lcb_U32 retry_nmv_interval;
216
+ struct lcb_METRICS_st *metrics;
217
+ #ifdef LCB_TRACING
218
+ lcbtrace_TRACER *tracer;
219
+ lcb_U32 tracer_orphaned_queue_flush_interval;
220
+ lcb_U32 tracer_orphaned_queue_size;
221
+ lcb_U32 tracer_threshold_queue_flush_interval;
222
+ lcb_U32 tracer_threshold_queue_size;
223
+ lcb_U32 tracer_threshold[LCBTRACE_THRESHOLD__MAX];
224
+ #endif
225
+ lcb_U32 compress_min_size;
226
+ float compress_min_ratio;
186
227
  } lcb_settings;
187
228
 
188
229
  LCB_INTERNAL_API
@@ -199,6 +240,29 @@ lcb_settings_unref(lcb_settings *);
199
240
  #define lcb_settings_ref(settings) ((void)(settings)->refcount++)
200
241
  #define lcb_settings_ref2(settings) ((settings)->refcount++, settings)
201
242
 
243
+ /**
244
+ * Metric functionality. Defined in metrics.h, but retains a global-like
245
+ * setting similar to lcb_settings
246
+ */
247
+ void
248
+ lcb_metrics_dumpio(const lcb_IOMETRICS *metrics, FILE *fp);
249
+
250
+ void
251
+ lcb_metrics_dumpserver(const lcb_SERVERMETRICS *metrics, FILE *fp);
252
+
253
+ lcb_METRICS *
254
+ lcb_metrics_new(void);
255
+
256
+ void
257
+ lcb_metrics_destroy(lcb_METRICS *metrics);
258
+
259
+ lcb_SERVERMETRICS *
260
+ lcb_metrics_getserver(lcb_METRICS *metrics,
261
+ const char *host, const char *port, int create);
262
+
263
+ void
264
+ lcb_metrics_reset_pipeline_gauges(lcb_SERVERMETRICS *metrics);
265
+
202
266
  #ifdef __cplusplus
203
267
  }
204
268
  #endif
@@ -1,13 +1,3 @@
1
- IF(APPLE)
2
- IF(NOT OpenSSL_DIR)
3
- EXECUTE_PROCESS(COMMAND brew --prefix openssl
4
- OUTPUT_VARIABLE OPENSSL_ROOT_DIR
5
- OUTPUT_STRIP_TRAILING_WHITESPACE)
6
- MESSAGE(STATUS "Found OpenSSL Prefix: ${OPENSSL_ROOT_DIR}")
7
- ENDIF()
8
- ENDIF()
9
-
10
- FIND_PACKAGE(OpenSSL)
11
1
  IF(OPENSSL_FOUND AND (NOT LCB_NO_SSL))
12
2
  INCLUDE_DIRECTORIES(${OPENSSL_INCLUDE_DIR})
13
3
  ADD_DEFINITIONS(${OPENSSL_DEFINITIONS})
@@ -15,9 +5,7 @@ IF(OPENSSL_FOUND AND (NOT LCB_NO_SSL))
15
5
  SET(lcb_ssl_libs ${OPENSSL_LIBRARIES} PARENT_SCOPE)
16
6
  SET(lcb_ssl_objs $<TARGET_OBJECTS:lcbssl> PARENT_SCOPE)
17
7
  LCB_UTIL(lcbssl)
18
- MESSAGE(STATUS "SSL Found")
19
8
  ELSE()
20
9
  SET(LCB_NO_SSL ON PARENT_SCOPE)
21
10
  SET(lcb_ssl_libs "" PARENT_SCOPE)
22
- MESSAGE(STATUS "SSL Not Found")
23
11
  ENDIF()
@@ -255,9 +255,10 @@ struct lcbio_SSLCTX {
255
255
  SSL_CTX *ctx;
256
256
  };
257
257
 
258
- lcbio_pSSLCTX
259
- lcbio_ssl_new(const char *cafile, int noverify, lcb_error_t *errp,
260
- lcb_settings *settings)
258
+ #define LOGARGS_S(settings, lvl) settings, "SSL", lvl, __FILE__, __LINE__
259
+
260
+ lcbio_pSSLCTX lcbio_ssl_new(const char *tsfile, const char *cafile, const char *keyfile, int noverify,
261
+ lcb_error_t *errp, lcb_settings *settings)
261
262
  {
262
263
  lcb_error_t err_s;
263
264
  lcbio_pSSLCTX ret;
@@ -281,10 +282,28 @@ lcbio_ssl_new(const char *cafile, int noverify, lcb_error_t *errp,
281
282
  // SSL_CTX_set_cipher_list(ret->ctx, "!NULL");
282
283
 
283
284
  if (cafile) {
284
- if (!SSL_CTX_load_verify_locations(ret->ctx, cafile, NULL)) {
285
+ lcb_log(LOGARGS_S(settings, LCB_LOG_DEBUG), "Load verify locations from \"%s\"", tsfile ? tsfile : keyfile);
286
+ if (!SSL_CTX_load_verify_locations(ret->ctx, tsfile ? tsfile : cafile, NULL)) {
285
287
  *errp = LCB_SSL_ERROR;
286
288
  goto GT_ERR;
287
289
  }
290
+ if (keyfile) {
291
+ lcb_log(LOGARGS_S(settings, LCB_LOG_DEBUG), "Authenticate with key \"%s\", cert \"%s\"", keyfile, cafile);
292
+ if (!SSL_CTX_use_certificate_file(ret->ctx, cafile, SSL_FILETYPE_PEM)) {
293
+ *errp = LCB_SSL_ERROR;
294
+ goto GT_ERR;
295
+ }
296
+ if (!SSL_CTX_use_PrivateKey_file(ret->ctx, keyfile, SSL_FILETYPE_PEM)) {
297
+ lcb_log(LOGARGS_S(settings, LCB_LOG_ERROR), "Unable to load private key \"%s\"", keyfile);
298
+ *errp = LCB_SSL_ERROR;
299
+ goto GT_ERR;
300
+ }
301
+ if (!SSL_CTX_check_private_key(ret->ctx)) {
302
+ lcb_log(LOGARGS_S(settings, LCB_LOG_ERROR), "Unable to verify private key \"%s\"", keyfile);
303
+ *errp = LCB_SSL_ERROR;
304
+ goto GT_ERR;
305
+ }
306
+ }
288
307
  }
289
308
 
290
309
  if (noverify) {
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include "strcodecs.h"
19
19
  #include <string.h>
20
+ #include <stdlib.h>
20
21
 
21
22
  /*
22
23
  * Function to base64 encode a text string as described in RFC 4648
@@ -37,19 +38,19 @@ static const lcb_uint8_t code[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrs
37
38
  * @param num the number of characters from s to encode
38
39
  * @return 0 upon success, -1 otherwise.
39
40
  */
40
- static int encode_rest(const lcb_uint8_t *s, lcb_uint8_t *d, lcb_size_t num)
41
+ static int encode_rest(const lcb_uint8_t *s, lcb_uint8_t *d, lcb_SIZE num)
41
42
  {
42
43
  lcb_uint32_t val = 0;
43
44
 
44
45
  switch (num) {
45
- case 2:
46
- val = (lcb_uint32_t)((*s << 16) | (*(s + 1) << 8));
47
- break;
48
- case 1:
49
- val = (lcb_uint32_t)((*s << 16));
50
- break;
51
- default:
52
- return -1;
46
+ case 2:
47
+ val = (lcb_uint32_t)((*s << 16) | (*(s + 1) << 8));
48
+ break;
49
+ case 1:
50
+ val = (lcb_uint32_t)((*s << 16));
51
+ break;
52
+ default:
53
+ return -1;
53
54
  }
54
55
 
55
56
  d[3] = '=';
@@ -75,7 +76,7 @@ static int encode_rest(const lcb_uint8_t *s, lcb_uint8_t *d, lcb_size_t num)
75
76
  static int encode_triplet(const lcb_uint8_t *s, lcb_uint8_t *d)
76
77
  {
77
78
  lcb_uint32_t val = (lcb_uint32_t)((*s << 16) | (*(s + 1) << 8) | (*(s + 2)));
78
- d[3] = code[val & 63] ;
79
+ d[3] = code[val & 63];
79
80
  d[2] = code[(val >> 6) & 63];
80
81
  d[1] = code[(val >> 12) & 63];
81
82
  d[0] = code[(val >> 18) & 63];
@@ -90,16 +91,15 @@ static int encode_triplet(const lcb_uint8_t *s, lcb_uint8_t *d)
90
91
  * @param sz size of destination buffer
91
92
  * @return 0 if success, -1 if the destination buffer isn't big enough
92
93
  */
93
- int lcb_base64_encode(const char *src, char *dst, lcb_size_t sz)
94
+ int lcb_base64_encode(const char *src, lcb_SIZE len, char *dst, lcb_SIZE sz)
94
95
  {
95
- lcb_size_t len = strlen(src);
96
- lcb_size_t triplets = len / 3;
97
- lcb_size_t rest = len % 3;
98
- lcb_size_t ii;
96
+ lcb_SIZE triplets = len / 3;
97
+ lcb_SIZE rest = len % 3;
98
+ lcb_SIZE ii;
99
99
  const lcb_uint8_t *in = (const lcb_uint8_t *)src;
100
100
  lcb_uint8_t *out = (lcb_uint8_t *)dst;
101
101
 
102
- if (sz < (lcb_size_t)((triplets + 1) * 4)) {
102
+ if (sz < (lcb_SIZE)((triplets + 1) * 4)) {
103
103
  return -1;
104
104
  }
105
105
 
@@ -121,3 +121,128 @@ int lcb_base64_encode(const char *src, char *dst, lcb_size_t sz)
121
121
 
122
122
  return 0;
123
123
  }
124
+
125
+ int lcb_base64_encode2(const char *src, lcb_SIZE nsrc, char **dst, lcb_SIZE *ndst)
126
+ {
127
+ lcb_SIZE len = (nsrc / 3 + 1) * 4 + 1;
128
+ char *ptr = calloc(len, sizeof(char));
129
+ int rc = lcb_base64_encode(src, nsrc, ptr, len);
130
+ if (rc == 0) {
131
+ *ndst = strlen(ptr);
132
+ *dst = ptr;
133
+ } else {
134
+ free(ptr);
135
+ }
136
+ return rc;
137
+ }
138
+
139
+ static int code2val(char c)
140
+ {
141
+ if (c >= 'A' && c <= 'Z') {
142
+ return c - 'A';
143
+ }
144
+ if (c >= 'a' && c <= 'z') {
145
+ return c - 'a' + 26;
146
+ }
147
+ if (c >= '0' && c <= '9') {
148
+ return c - '0' + 52;
149
+ }
150
+ if (c == '+') {
151
+ return 62;
152
+ }
153
+ if (c == '/') {
154
+ return 63;
155
+ }
156
+ return -1;
157
+ }
158
+
159
+ lcb_SSIZE lcb_base64_decode(const char *src, lcb_SIZE nsrc, char *dst, lcb_SIZE ndst)
160
+ {
161
+ lcb_SIZE offset = 0;
162
+ lcb_SSIZE idx = 0;
163
+
164
+ if (nsrc == 0) {
165
+ *dst = '\0';
166
+ return 0;
167
+ }
168
+
169
+ while (offset < nsrc) {
170
+ int val, ins;
171
+ lcb_U32 value;
172
+
173
+ if (isspace((int)*src)) {
174
+ ++offset;
175
+ ++src;
176
+ continue;
177
+ }
178
+
179
+ // We need at least 4 bytes
180
+ if ((offset + 4) > nsrc) {
181
+ return -1;
182
+ }
183
+
184
+ val = code2val(src[0]);
185
+ if (val < 0) {
186
+ return -1;
187
+ }
188
+ value = val << 18;
189
+ val = code2val(src[1]);
190
+ if (val < 0) {
191
+ return -1;
192
+ }
193
+ value |= val << 12;
194
+
195
+ ins = 3; /* number of characters to insert */
196
+ if (src[2] == '=') {
197
+ ins = 1;
198
+ } else {
199
+ value |= code2val(src[2]) << 6;
200
+ if (src[3] == '=') {
201
+ ins = 2;
202
+ } else {
203
+ value |= code2val(src[3]);
204
+ }
205
+ }
206
+
207
+ if ((lcb_SIZE)idx >= ndst) {
208
+ return -1;
209
+ }
210
+ dst[idx++] = (char)(value >> 16);
211
+ if (ins > 1) {
212
+ if ((lcb_SIZE)idx >= ndst) {
213
+ return -1;
214
+ }
215
+ dst[idx++] = (char)(value >> 8);
216
+ if (ins > 2) {
217
+ if ((lcb_SIZE)idx >= ndst) {
218
+ return -1;
219
+ }
220
+ dst[idx++] = (char)(value);
221
+ }
222
+ }
223
+
224
+ src += 4;
225
+ offset += 4;
226
+ }
227
+ dst[idx + 1] = '\0';
228
+
229
+ return idx;
230
+ }
231
+
232
+ lcb_SSIZE lcb_base64_decode2(const char *src, lcb_SIZE nsrc, char **dst, lcb_SIZE *ndst)
233
+ {
234
+ // To reduce the number of reallocations, start by reserving an
235
+ // output buffer of 75% of the input size (and add 3 to avoid dealing
236
+ // with zero)
237
+ lcb_SIZE len = nsrc * 3 / 4 + 3;
238
+ char *ptr = calloc(len, sizeof(char));
239
+
240
+ lcb_SSIZE rc = lcb_base64_decode(src, nsrc, ptr, len);
241
+ if (rc < 0) {
242
+ free(ptr);
243
+ } else {
244
+ *ndst = rc;
245
+ *dst = ptr;
246
+ }
247
+ return rc;
248
+ }