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
@@ -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
+ }