couchbase 3.7.0 → 3.8.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 (286) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/ext/CMakeLists.txt +4 -1
  4. data/ext/cache/extconf_include.rb +4 -3
  5. data/ext/cache/mozilla-ca-bundle.crt +66 -93
  6. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  7. data/ext/couchbase/CMakeLists.txt +24 -11
  8. data/ext/couchbase/cmake/APKBUILD.in +17 -1
  9. data/ext/couchbase/cmake/Bundler.cmake +9 -1
  10. data/ext/couchbase/cmake/Cache.cmake +48 -19
  11. data/ext/couchbase/cmake/CompilerOptions.cmake +3 -1
  12. data/ext/couchbase/cmake/OpenSSL.cmake +10 -2
  13. data/ext/couchbase/cmake/Packaging.cmake +48 -8
  14. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +43 -1
  15. data/ext/couchbase/cmake/build_config.hxx.in +2 -0
  16. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +18 -0
  17. data/ext/couchbase/cmake/tarball_glob.txt +10 -0
  18. data/ext/couchbase/core/app_telemetry_meter.cxx +1 -0
  19. data/ext/couchbase/core/app_telemetry_reporter.cxx +45 -43
  20. data/ext/couchbase/core/app_telemetry_reporter.hxx +4 -3
  21. data/ext/couchbase/core/bucket.cxx +128 -13
  22. data/ext/couchbase/core/bucket.hxx +12 -2
  23. data/ext/couchbase/core/cluster.cxx +304 -152
  24. data/ext/couchbase/core/cluster.hxx +32 -0
  25. data/ext/couchbase/core/cluster_credentials.cxx +25 -0
  26. data/ext/couchbase/core/cluster_credentials.hxx +5 -0
  27. data/ext/couchbase/core/cluster_label_listener.cxx +72 -0
  28. data/ext/couchbase/core/cluster_label_listener.hxx +46 -0
  29. data/ext/couchbase/core/cluster_options.hxx +4 -0
  30. data/ext/couchbase/core/deprecation_utils.hxx +26 -0
  31. data/ext/couchbase/core/error.hxx +27 -0
  32. data/ext/couchbase/core/free_form_http_request.hxx +0 -2
  33. data/ext/couchbase/core/http_component.cxx +12 -48
  34. data/ext/couchbase/core/impl/analytics.cxx +3 -2
  35. data/ext/couchbase/core/impl/analytics.hxx +2 -1
  36. data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
  37. data/ext/couchbase/core/impl/binary_collection.cxx +134 -58
  38. data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
  39. data/ext/couchbase/core/impl/collection.cxx +560 -245
  40. data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
  41. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
  42. data/ext/couchbase/core/impl/error.cxx +20 -13
  43. data/ext/couchbase/core/impl/error.hxx +15 -10
  44. data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
  45. data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
  46. data/ext/couchbase/core/impl/get_replica.hxx +2 -0
  47. data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
  48. data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
  49. data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
  50. data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
  51. data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
  52. data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
  53. data/ext/couchbase/core/impl/query.cxx +6 -3
  54. data/ext/couchbase/core/impl/query.hxx +3 -1
  55. data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
  56. data/ext/couchbase/core/impl/scope.cxx +53 -11
  57. data/ext/couchbase/core/impl/search.cxx +8 -4
  58. data/ext/couchbase/core/impl/search.hxx +6 -2
  59. data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
  60. data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
  61. data/ext/couchbase/core/io/config_tracker.cxx +9 -9
  62. data/ext/couchbase/core/io/config_tracker.hxx +2 -1
  63. data/ext/couchbase/core/io/http_command.hxx +98 -49
  64. data/ext/couchbase/core/io/http_context.hxx +2 -0
  65. data/ext/couchbase/core/io/http_session.cxx +23 -10
  66. data/ext/couchbase/core/io/http_session.hxx +17 -9
  67. data/ext/couchbase/core/io/http_session_manager.hxx +163 -228
  68. data/ext/couchbase/core/io/http_traits.hxx +0 -7
  69. data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
  70. data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
  71. data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
  72. data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
  73. data/ext/couchbase/core/io/streams.cxx +3 -3
  74. data/ext/couchbase/core/io/streams.hxx +3 -2
  75. data/ext/couchbase/core/meta/features.hxx +15 -0
  76. data/ext/couchbase/core/meta/version.cxx +13 -0
  77. data/ext/couchbase/core/meta/version.hxx +3 -0
  78. data/ext/couchbase/core/metrics/constants.hxx +23 -0
  79. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
  80. data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
  81. data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
  82. data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
  83. data/ext/couchbase/core/operations/document_append.hxx +0 -4
  84. data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
  85. data/ext/couchbase/core/operations/document_exists.hxx +0 -7
  86. data/ext/couchbase/core/operations/document_get.hxx +0 -7
  87. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +77 -27
  88. data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
  89. data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
  90. data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
  91. data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
  92. data/ext/couchbase/core/operations/document_increment.hxx +0 -5
  93. data/ext/couchbase/core/operations/document_insert.hxx +0 -4
  94. data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
  95. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +46 -4
  96. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
  97. data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
  98. data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
  99. data/ext/couchbase/core/operations/document_query.hxx +0 -4
  100. data/ext/couchbase/core/operations/document_remove.hxx +0 -4
  101. data/ext/couchbase/core/operations/document_replace.hxx +0 -4
  102. data/ext/couchbase/core/operations/document_search.hxx +0 -7
  103. data/ext/couchbase/core/operations/document_touch.hxx +0 -7
  104. data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
  105. data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
  106. data/ext/couchbase/core/operations/document_view.cxx +2 -0
  107. data/ext/couchbase/core/operations/document_view.hxx +10 -13
  108. data/ext/couchbase/core/operations/http_noop.hxx +2 -0
  109. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
  110. data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
  111. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
  112. data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
  113. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
  114. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
  115. data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
  116. data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
  117. data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
  118. data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
  119. data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
  120. data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
  121. data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
  122. data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
  123. data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
  124. data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
  125. data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
  126. data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
  127. data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
  128. data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
  129. data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
  130. data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
  131. data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
  132. data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
  133. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
  134. data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
  135. data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
  136. data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
  137. data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
  138. data/ext/couchbase/core/operations/management/error_utils.cxx +4 -1
  139. data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
  140. data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
  141. data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
  142. data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
  143. data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
  144. data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
  145. data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
  146. data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
  147. data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
  148. data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
  149. data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
  150. data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
  151. data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
  152. data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
  153. data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
  154. data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
  155. data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
  156. data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
  157. data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
  158. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
  159. data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
  160. data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
  161. data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
  162. data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
  163. data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
  164. data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
  165. data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
  166. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
  167. data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
  168. data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
  169. data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
  170. data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
  171. data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
  172. data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
  173. data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
  174. data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
  175. data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
  176. data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
  177. data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
  178. data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
  179. data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
  180. data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
  181. data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
  182. data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
  183. data/ext/couchbase/core/operations.hxx +0 -1
  184. data/ext/couchbase/core/operations_fwd.hxx +8 -0
  185. data/ext/couchbase/core/origin.cxx +67 -12
  186. data/ext/couchbase/core/origin.hxx +13 -8
  187. data/ext/couchbase/core/orphan_reporter.cxx +164 -0
  188. data/ext/couchbase/core/orphan_reporter.hxx +65 -0
  189. data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
  190. data/ext/couchbase/core/sasl/client.cc +6 -0
  191. data/ext/couchbase/core/sasl/mechanism.cc +2 -1
  192. data/ext/couchbase/core/sasl/mechanism.h +2 -1
  193. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
  194. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
  195. data/ext/couchbase/core/tls_context_provider.cxx +44 -0
  196. data/ext/couchbase/core/tls_context_provider.hxx +44 -0
  197. data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
  198. data/ext/couchbase/core/tracing/constants.hxx +148 -68
  199. data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
  200. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
  201. data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
  202. data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
  203. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
  204. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
  205. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
  206. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
  207. data/ext/couchbase/core/transactions/transactions.cxx +1 -1
  208. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
  209. data/ext/couchbase/core/utils/byteswap.hxx +12 -0
  210. data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
  211. data/ext/couchbase/core/utils/connection_string.cxx +2 -0
  212. data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
  213. data/ext/couchbase/couchbase/cluster.hxx +47 -0
  214. data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
  215. data/ext/couchbase/couchbase/collection.hxx +60 -15
  216. data/ext/couchbase/couchbase/error_codes.hxx +48 -48
  217. data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
  218. data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
  219. data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
  220. data/ext/couchbase/couchbase/network_options.hxx +19 -0
  221. data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
  222. data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
  223. data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
  224. data/ext/couchbase.cxx +4 -0
  225. data/ext/extconf.rb +1 -0
  226. data/ext/rcb_analytics.cxx +157 -47
  227. data/ext/rcb_backend.cxx +118 -71
  228. data/ext/rcb_buckets.cxx +39 -16
  229. data/ext/rcb_collections.cxx +36 -12
  230. data/ext/rcb_crud.cxx +587 -294
  231. data/ext/rcb_hdr_histogram.cxx +219 -0
  232. data/ext/rcb_hdr_histogram.hxx +28 -0
  233. data/ext/rcb_multi.cxx +142 -59
  234. data/ext/rcb_observability.cxx +132 -0
  235. data/ext/rcb_observability.hxx +49 -0
  236. data/ext/rcb_query.cxx +77 -27
  237. data/ext/rcb_search.cxx +92 -31
  238. data/ext/rcb_users.cxx +69 -26
  239. data/ext/rcb_utils.cxx +91 -0
  240. data/ext/rcb_utils.hxx +141 -168
  241. data/ext/rcb_views.cxx +36 -12
  242. data/lib/active_support/cache/couchbase_store.rb +6 -6
  243. data/lib/couchbase/authenticator.rb +14 -0
  244. data/lib/couchbase/binary_collection.rb +37 -22
  245. data/lib/couchbase/bucket.rb +46 -31
  246. data/lib/couchbase/cluster.rb +146 -61
  247. data/lib/couchbase/collection.rb +257 -186
  248. data/lib/couchbase/datastructures/couchbase_list.rb +81 -50
  249. data/lib/couchbase/datastructures/couchbase_map.rb +86 -50
  250. data/lib/couchbase/datastructures/couchbase_queue.rb +64 -38
  251. data/lib/couchbase/datastructures/couchbase_set.rb +57 -41
  252. data/lib/couchbase/deprecations.rb +1 -1
  253. data/lib/couchbase/diagnostics.rb +8 -8
  254. data/lib/couchbase/errors.rb +6 -0
  255. data/lib/couchbase/management/analytics_index_manager.rb +90 -59
  256. data/lib/couchbase/management/bucket_manager.rb +73 -45
  257. data/lib/couchbase/management/collection_manager.rb +86 -43
  258. data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
  259. data/lib/couchbase/management/query_index_manager.rb +88 -36
  260. data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
  261. data/lib/couchbase/management/search_index_manager.rb +401 -178
  262. data/lib/couchbase/management/user_manager.rb +343 -174
  263. data/lib/couchbase/management/view_index_manager.rb +166 -73
  264. data/lib/couchbase/metrics/logging_meter.rb +108 -0
  265. data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
  266. data/lib/couchbase/metrics/meter.rb +27 -0
  267. data/lib/couchbase/metrics/noop_meter.rb +30 -0
  268. data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
  269. data/lib/couchbase/metrics/value_recorder.rb +25 -0
  270. data/lib/couchbase/options.rb +69 -3
  271. data/lib/couchbase/protostellar/cluster.rb +3 -0
  272. data/lib/couchbase/scope.rb +62 -48
  273. data/lib/couchbase/search_options.rb +18 -18
  274. data/lib/couchbase/tracing/noop_span.rb +29 -0
  275. data/lib/couchbase/tracing/noop_tracer.rb +29 -0
  276. data/lib/couchbase/tracing/request_span.rb +34 -0
  277. data/lib/couchbase/tracing/request_tracer.rb +28 -0
  278. data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
  279. data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
  280. data/lib/couchbase/utils/hdr_histogram.rb +55 -0
  281. data/lib/couchbase/utils/observability.rb +257 -0
  282. data/lib/couchbase/utils/observability_constants.rb +200 -0
  283. data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
  284. data/lib/couchbase/version.rb +1 -1
  285. data/lib/couchbase.rb +2 -2
  286. metadata +58 -6
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include "collection_id_cache_entry.hxx"
21
21
  #include "core/app_telemetry_meter.hxx"
22
+ #include "core/cluster_options.hxx"
22
23
  #include "core/config_listener.hxx"
23
24
  #include "core/document_id.hxx"
24
25
  #include "core/error_context/key_value_error_map_info.hxx"
@@ -85,20 +86,22 @@ public:
85
86
  couchbase::core::origin origin,
86
87
  std::shared_ptr<tracing::tracer_wrapper> tracer,
87
88
  std::shared_ptr<metrics::meter_wrapper> meter,
89
+ std::shared_ptr<orphan_reporter> orphan_reporter,
88
90
  std::shared_ptr<core::app_telemetry_meter> app_telemetry,
89
91
  std::vector<protocol::hello_feature> known_features,
90
92
  std::shared_ptr<impl::bootstrap_state_listener> state_listener,
91
93
  asio::io_context& ctx,
92
- asio::ssl::context& tls)
94
+ tls_context_provider& tls)
93
95
  : client_id_{ std::move(client_id) }
94
96
  , name_{ std::move(name) }
95
97
  , log_prefix_{ fmt::format("[{}/{}]", client_id_, name_) }
96
- , origin_{ std::move(origin) }
97
98
  , tracer_{ std::move(tracer) }
98
99
  , meter_{ std::move(meter) }
100
+ , orphan_reporter_{ std::move(orphan_reporter) }
99
101
  , app_telemetry_meter_{ std::move(app_telemetry) }
100
102
  , known_features_{ std::move(known_features) }
101
103
  , state_listener_{ std::move(state_listener) }
104
+ , origin_{ std::move(origin) }
102
105
  , codec_{ { known_features_.begin(), known_features_.end() } }
103
106
  , ctx_{ ctx }
104
107
  , tls_{ tls }
@@ -117,11 +120,13 @@ public:
117
120
  std::optional<key_value_error_map_info> error_info)
118
121
  {
119
122
  // TODO(SA): copy from mcbp_command, subject to refactor later
123
+ #ifdef COUCHBASE_CXX_CLIENT_CREATE_OPERATION_SPAN_IN_CORE
120
124
  metrics::metric_attributes attrs{
121
125
  service_type::key_value, fmt::format("{}", req->command_), ec, name_, req->scope_name_,
122
126
  req->collection_name_,
123
127
  };
124
128
  meter_->record_value(std::move(attrs), req->dispatched_time_);
129
+ #endif
125
130
 
126
131
  if (ec == asio::error::operation_aborted) {
127
132
  // TODO(SA): fix tracing
@@ -317,11 +322,11 @@ public:
317
322
  {
318
323
  if (req->key_.empty()) {
319
324
  if (auto server = server_by_vbucket(req->vbucket_, req->replica_index_); server) {
320
- return find_session_by_index(server.value());
325
+ return find_or_connect_session_by_index(server.value());
321
326
  }
322
327
  } else if (auto [partition, server] = map_id(req->key_, req->replica_index_); server) {
323
328
  req->vbucket_ = partition;
324
- return find_session_by_index(server.value());
329
+ return find_or_connect_session_by_index(server.value());
325
330
  }
326
331
  return std::nullopt;
327
332
  }
@@ -365,6 +370,53 @@ public:
365
370
  return { 0, std::nullopt };
366
371
  }
367
372
 
373
+ void connect_session(std::size_t index)
374
+ {
375
+ const std::scoped_lock lock(config_mutex_, sessions_mutex_);
376
+ if (!config_) {
377
+ return;
378
+ }
379
+
380
+ const auto& node = config_->nodes[index];
381
+
382
+ const auto& hostname = node.hostname_for(origin_.options().network);
383
+ auto port = node.port_or(
384
+ origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
385
+ if (port == 0) {
386
+ return;
387
+ }
388
+
389
+ const couchbase::core::origin origin(origin_.credentials(), hostname, port, origin_.options());
390
+ io::mcbp_session session =
391
+ origin_.options().enable_tls
392
+ ? io::mcbp_session(
393
+ client_id_, node.node_uuid, ctx_, tls_, origin, state_listener_, name_, known_features_)
394
+ : io::mcbp_session(
395
+ client_id_, node.node_uuid, ctx_, origin, state_listener_, name_, known_features_);
396
+ CB_LOG_DEBUG(R"({} rev={}, connect idx={}, session="{}", address="{}:{}")",
397
+ log_prefix_,
398
+ config_->rev_str(),
399
+ node.index,
400
+ session.id(),
401
+ hostname,
402
+ port);
403
+ session.bootstrap(
404
+ [self = shared_from_this(), session](std::error_code err,
405
+ topology::configuration cfg) mutable -> void {
406
+ if (err) {
407
+ return self->remove_session(session.id());
408
+ }
409
+ self->update_config(std::move(cfg));
410
+ session.on_configuration_update(self);
411
+ session.on_stop([id = session.id(), self]() -> void {
412
+ self->remove_session(id);
413
+ });
414
+ self->drain_deferred_queue({});
415
+ },
416
+ true);
417
+ sessions_.insert_or_assign(index, std::move(session));
418
+ }
419
+
368
420
  void restart_sessions()
369
421
  {
370
422
  const std::scoped_lock lock(config_mutex_, sessions_mutex_);
@@ -594,9 +646,9 @@ public:
594
646
  {
595
647
  const std::scoped_lock lock(sessions_mutex_);
596
648
  if (sessions_.empty()) {
597
- CB_LOG_WARNING(R"({} unable to find connected session (sessions_ is empty), retry in {})",
598
- log_prefix_,
599
- heartbeat_interval_);
649
+ CB_LOG_DEBUG(R"({} unable to find connected session (sessions_ is empty), retry in {})",
650
+ log_prefix_,
651
+ heartbeat_interval_);
600
652
  return;
601
653
  }
602
654
 
@@ -616,9 +668,9 @@ public:
616
668
  req.opaque(session->next_opaque());
617
669
  session->write_and_flush(req.data());
618
670
  } else {
619
- CB_LOG_WARNING(R"({} unable to find connected session with GCCCP support, retry in {})",
620
- log_prefix_,
621
- heartbeat_interval_);
671
+ CB_LOG_DEBUG(R"({} unable to find connected session with GCCCP support, retry in {})",
672
+ log_prefix_,
673
+ heartbeat_interval_);
622
674
  }
623
675
  }
624
676
 
@@ -698,6 +750,11 @@ public:
698
750
  }
699
751
  }
700
752
 
753
+ void update_credentials(cluster_credentials credentials)
754
+ {
755
+ origin_.update_credentials(std::move(credentials));
756
+ }
757
+
701
758
  void update_config(topology::configuration config) override
702
759
  {
703
760
  std::vector<topology::configuration::node> added{};
@@ -810,6 +867,10 @@ public:
810
867
  continue;
811
868
  }
812
869
 
870
+ if (origin_.options().enable_lazy_connections) {
871
+ ++next_index;
872
+ continue;
873
+ }
813
874
  const couchbase::core::origin origin(
814
875
  origin_.credentials(), hostname, port, origin_.options());
815
876
  io::mcbp_session session =
@@ -883,6 +944,16 @@ public:
883
944
  return {};
884
945
  }
885
946
 
947
+ [[nodiscard]] auto find_or_connect_session_by_index(std::size_t index)
948
+ -> std::optional<io::mcbp_session>
949
+ {
950
+ if (auto session = find_session_by_index(index); session) {
951
+ return session;
952
+ }
953
+ connect_session(index);
954
+ return {};
955
+ }
956
+
886
957
  [[nodiscard]] auto next_session_index() -> std::size_t
887
958
  {
888
959
  const std::scoped_lock lock(sessions_mutex_);
@@ -929,6 +1000,11 @@ public:
929
1000
  return meter_;
930
1001
  }
931
1002
 
1003
+ [[nodiscard]] auto orphan_reporter() const -> std::shared_ptr<core::orphan_reporter>
1004
+ {
1005
+ return orphan_reporter_;
1006
+ }
1007
+
932
1008
  [[nodiscard]] auto app_telemetry_meter() const -> std::shared_ptr<core::app_telemetry_meter>
933
1009
  {
934
1010
  return app_telemetry_meter_;
@@ -977,20 +1053,33 @@ public:
977
1053
  return {};
978
1054
  }
979
1055
 
1056
+ void for_each_session(utils::movable_function<void(io::mcbp_session&)> handler)
1057
+ {
1058
+ std::map<size_t, io::mcbp_session> sessions;
1059
+ {
1060
+ const std::scoped_lock lock(sessions_mutex_);
1061
+ sessions = sessions_;
1062
+ }
1063
+ for (auto& [index, session] : sessions) {
1064
+ handler(session);
1065
+ }
1066
+ }
1067
+
980
1068
  private:
981
1069
  const std::string client_id_;
982
1070
  const std::string name_;
983
1071
  const std::string log_prefix_;
984
- const origin origin_;
985
1072
  const std::shared_ptr<tracing::tracer_wrapper> tracer_;
986
1073
  const std::shared_ptr<metrics::meter_wrapper> meter_;
1074
+ const std::shared_ptr<core::orphan_reporter> orphan_reporter_;
987
1075
  const std::shared_ptr<core::app_telemetry_meter> app_telemetry_meter_;
988
1076
  const std::vector<protocol::hello_feature> known_features_;
989
1077
  const std::shared_ptr<impl::bootstrap_state_listener> state_listener_;
1078
+ origin origin_;
990
1079
  mcbp::codec codec_;
991
1080
 
992
1081
  asio::io_context& ctx_;
993
- asio::ssl::context& tls_;
1082
+ tls_context_provider& tls_;
994
1083
 
995
1084
  asio::steady_timer heartbeat_timer_;
996
1085
  std::chrono::milliseconds heartbeat_interval_;
@@ -1015,9 +1104,10 @@ private:
1015
1104
 
1016
1105
  bucket::bucket(std::string client_id,
1017
1106
  asio::io_context& ctx,
1018
- asio::ssl::context& tls,
1107
+ tls_context_provider& tls,
1019
1108
  std::shared_ptr<tracing::tracer_wrapper> tracer,
1020
1109
  std::shared_ptr<metrics::meter_wrapper> meter,
1110
+ std::shared_ptr<core::orphan_reporter> orphan_reporter,
1021
1111
  std::shared_ptr<core::app_telemetry_meter> app_telemetry_meter,
1022
1112
  std::string name,
1023
1113
  couchbase::core::origin origin,
@@ -1030,6 +1120,7 @@ bucket::bucket(std::string client_id,
1030
1120
  std::move(origin),
1031
1121
  std::move(tracer),
1032
1122
  std::move(meter),
1123
+ std::move(orphan_reporter),
1033
1124
  std::move(app_telemetry_meter),
1034
1125
  std::move(known_features),
1035
1126
  std::move(state_listener),
@@ -1068,6 +1159,12 @@ bucket::update_config(topology::configuration config)
1068
1159
  return impl_->update_config(std::move(config));
1069
1160
  }
1070
1161
 
1162
+ void
1163
+ bucket::update_credentials(cluster_credentials credentials)
1164
+ {
1165
+ return impl_->update_credentials(std::move(credentials));
1166
+ }
1167
+
1071
1168
  auto
1072
1169
  bucket::name() const -> const std::string&
1073
1170
  {
@@ -1098,6 +1195,12 @@ bucket::meter() const -> std::shared_ptr<metrics::meter_wrapper>
1098
1195
  return impl_->meter();
1099
1196
  }
1100
1197
 
1198
+ auto
1199
+ bucket::orphan_reporter() const -> std::shared_ptr<core::orphan_reporter>
1200
+ {
1201
+ return impl_->orphan_reporter();
1202
+ }
1203
+
1101
1204
  auto
1102
1205
  bucket::app_telemetry_meter() const -> std::shared_ptr<core::app_telemetry_meter>
1103
1206
  {
@@ -1148,6 +1251,12 @@ bucket::defer_command(utils::movable_function<void(std::error_code)> command)
1148
1251
  impl_->defer_command(std::move(command));
1149
1252
  }
1150
1253
 
1254
+ void
1255
+ bucket::for_each_session(utils::movable_function<void(io::mcbp_session&)> handler)
1256
+ {
1257
+ impl_->for_each_session(std::move(handler));
1258
+ }
1259
+
1151
1260
  auto
1152
1261
  bucket::default_timeout() const -> std::chrono::milliseconds
1153
1262
  {
@@ -1190,4 +1299,10 @@ bucket::direct_re_queue(const std::shared_ptr<mcbp::queue_request>& req, bool is
1190
1299
  {
1191
1300
  return impl_->direct_re_queue(req, is_retry);
1192
1301
  }
1302
+
1303
+ void
1304
+ bucket::connect_session(std::size_t index)
1305
+ {
1306
+ return impl_->connect_session(index);
1307
+ }
1193
1308
  } // namespace couchbase::core
@@ -20,6 +20,7 @@
20
20
  #include "config_listener.hxx"
21
21
  #include "io/mcbp_command.hxx"
22
22
  #include "operations.hxx"
23
+ #include "tls_context_provider.hxx"
23
24
 
24
25
  #include <asio/bind_executor.hpp>
25
26
  #include <asio/io_context.hpp>
@@ -67,10 +68,11 @@ class bucket
67
68
  public:
68
69
  bucket(std::string client_id,
69
70
  asio::io_context& ctx,
70
- asio::ssl::context& tls,
71
+ tls_context_provider& tls,
71
72
  std::shared_ptr<tracing::tracer_wrapper> tracer,
72
73
  std::shared_ptr<metrics::meter_wrapper> meter,
73
- std::shared_ptr<core::app_telemetry_meter> app_telemetry_meter,
74
+ std::shared_ptr<orphan_reporter> orphan_reporter,
75
+ std::shared_ptr<app_telemetry_meter> app_telemetry_meter,
74
76
  std::string name,
75
77
  couchbase::core::origin origin,
76
78
  std::vector<protocol::hello_feature> known_features,
@@ -104,6 +106,8 @@ public:
104
106
  });
105
107
  }
106
108
 
109
+ void connect_session(std::size_t index);
110
+
107
111
  template<typename Request>
108
112
  void map_and_send(std::shared_ptr<operations::mcbp_command<bucket, Request>> cmd)
109
113
  {
@@ -141,6 +145,9 @@ public:
141
145
  session.has_value() ? session->bootstrap_address() : "",
142
146
  session.has_value() && session->has_config(),
143
147
  config_rev());
148
+ if (!session) {
149
+ connect_session(index);
150
+ }
144
151
  return defer_command([self = shared_from_this(), cmd](std::error_code ec) {
145
152
  if (ec == errc::common::request_canceled) {
146
153
  return cmd->cancel(retry_reason::do_not_retry);
@@ -194,6 +201,7 @@ public:
194
201
 
195
202
  void fetch_config();
196
203
  void update_config(topology::configuration config) override;
204
+ void update_credentials(cluster_credentials credentials);
197
205
  void bootstrap(utils::movable_function<void(std::error_code, topology::configuration)>&& handler);
198
206
  void with_configuration(
199
207
  utils::movable_function<void(std::error_code, std::shared_ptr<topology::configuration>)>&&
@@ -205,11 +213,13 @@ public:
205
213
  void ping(const std::shared_ptr<diag::ping_collector>& collector,
206
214
  std::optional<std::chrono::milliseconds> timeout);
207
215
  void defer_command(utils::movable_function<void(std::error_code)> command);
216
+ void for_each_session(utils::movable_function<void(io::mcbp_session&)> handler);
208
217
 
209
218
  [[nodiscard]] auto name() const -> const std::string&;
210
219
  [[nodiscard]] auto log_prefix() const -> const std::string&;
211
220
  [[nodiscard]] auto tracer() const -> std::shared_ptr<tracing::tracer_wrapper>;
212
221
  [[nodiscard]] auto meter() const -> std::shared_ptr<metrics::meter_wrapper>;
222
+ [[nodiscard]] auto orphan_reporter() const -> std::shared_ptr<orphan_reporter>;
213
223
  [[nodiscard]] auto app_telemetry_meter() const -> std::shared_ptr<app_telemetry_meter>;
214
224
  [[nodiscard]] auto default_retry_strategy() const -> std::shared_ptr<couchbase::retry_strategy>;
215
225
  [[nodiscard]] auto is_closed() const -> bool;