couchbase 3.7.0 → 3.8.1

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 (349) 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 -665
  6. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  7. data/ext/couchbase/CMakeLists.txt +26 -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/error_context/base_error_context.hxx +32 -0
  33. data/ext/couchbase/core/error_context/key_value.cxx +1 -0
  34. data/ext/couchbase/core/error_context/key_value.hxx +23 -0
  35. data/ext/couchbase/core/error_context/key_value_error_context.hxx +35 -0
  36. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +41 -0
  37. data/ext/couchbase/core/free_form_http_request.hxx +0 -2
  38. data/ext/couchbase/core/http_component.cxx +12 -48
  39. data/ext/couchbase/core/impl/analytics.cxx +3 -2
  40. data/ext/couchbase/core/impl/analytics.hxx +2 -1
  41. data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
  42. data/ext/couchbase/core/impl/binary_collection.cxx +239 -128
  43. data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
  44. data/ext/couchbase/core/impl/collection.cxx +914 -372
  45. data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
  46. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
  47. data/ext/couchbase/core/impl/error.cxx +49 -17
  48. data/ext/couchbase/core/impl/error.hxx +15 -10
  49. data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
  50. data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
  51. data/ext/couchbase/core/impl/get_replica.hxx +2 -0
  52. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +44 -0
  53. data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
  54. data/ext/couchbase/core/impl/node_id.cxx +110 -0
  55. data/ext/couchbase/core/impl/node_id.hxx +40 -0
  56. data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
  57. data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
  58. data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
  59. data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
  60. data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
  61. data/ext/couchbase/core/impl/query.cxx +6 -3
  62. data/ext/couchbase/core/impl/query.hxx +3 -1
  63. data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
  64. data/ext/couchbase/core/impl/scope.cxx +53 -11
  65. data/ext/couchbase/core/impl/search.cxx +8 -4
  66. data/ext/couchbase/core/impl/search.hxx +6 -2
  67. data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
  68. data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
  69. data/ext/couchbase/core/io/config_tracker.cxx +9 -9
  70. data/ext/couchbase/core/io/config_tracker.hxx +2 -1
  71. data/ext/couchbase/core/io/http_command.hxx +98 -49
  72. data/ext/couchbase/core/io/http_context.hxx +2 -0
  73. data/ext/couchbase/core/io/http_session.cxx +23 -10
  74. data/ext/couchbase/core/io/http_session.hxx +17 -9
  75. data/ext/couchbase/core/io/http_session_manager.hxx +245 -270
  76. data/ext/couchbase/core/io/http_traits.hxx +0 -7
  77. data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
  78. data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
  79. data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
  80. data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
  81. data/ext/couchbase/core/io/streams.cxx +3 -3
  82. data/ext/couchbase/core/io/streams.hxx +3 -2
  83. data/ext/couchbase/core/meta/features.hxx +15 -0
  84. data/ext/couchbase/core/meta/version.cxx +13 -0
  85. data/ext/couchbase/core/meta/version.hxx +3 -0
  86. data/ext/couchbase/core/metrics/constants.hxx +23 -0
  87. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
  88. data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
  89. data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
  90. data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
  91. data/ext/couchbase/core/operations/document_append.hxx +0 -4
  92. data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
  93. data/ext/couchbase/core/operations/document_exists.hxx +0 -7
  94. data/ext/couchbase/core/operations/document_get.hxx +0 -7
  95. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +89 -29
  96. data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
  97. data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
  98. data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
  99. data/ext/couchbase/core/operations/document_get_projected.cxx +3 -4
  100. data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
  101. data/ext/couchbase/core/operations/document_increment.hxx +0 -5
  102. data/ext/couchbase/core/operations/document_insert.hxx +0 -4
  103. data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
  104. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +50 -4
  105. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
  106. data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
  107. data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
  108. data/ext/couchbase/core/operations/document_query.cxx +12 -12
  109. data/ext/couchbase/core/operations/document_query.hxx +0 -4
  110. data/ext/couchbase/core/operations/document_remove.hxx +0 -4
  111. data/ext/couchbase/core/operations/document_replace.hxx +0 -4
  112. data/ext/couchbase/core/operations/document_search.hxx +0 -7
  113. data/ext/couchbase/core/operations/document_touch.hxx +0 -7
  114. data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
  115. data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
  116. data/ext/couchbase/core/operations/document_view.cxx +2 -0
  117. data/ext/couchbase/core/operations/document_view.hxx +10 -13
  118. data/ext/couchbase/core/operations/http_noop.hxx +2 -0
  119. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
  120. data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
  121. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
  122. data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
  123. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
  124. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
  125. data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
  126. data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
  127. data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
  128. data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
  129. data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
  130. data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
  131. data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
  132. data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
  133. data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
  134. data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
  135. data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
  136. data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
  137. data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
  138. data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
  139. data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
  140. data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
  141. data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
  142. data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
  143. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
  144. data/ext/couchbase/core/operations/management/collection_create.cxx +11 -11
  145. data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
  146. data/ext/couchbase/core/operations/management/collection_drop.cxx +11 -11
  147. data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
  148. data/ext/couchbase/core/operations/management/collection_update.cxx +11 -11
  149. data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
  150. data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
  151. data/ext/couchbase/core/operations/management/error_utils.cxx +13 -7
  152. data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
  153. data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
  154. data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
  155. data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
  156. data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
  157. data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
  158. data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
  159. data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
  160. data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
  161. data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
  162. data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
  163. data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
  164. data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
  165. data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
  166. data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
  167. data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
  168. data/ext/couchbase/core/operations/management/query_index_create.cxx +5 -4
  169. data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
  170. data/ext/couchbase/core/operations/management/query_index_drop.cxx +7 -6
  171. data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
  172. data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
  173. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
  174. data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
  175. data/ext/couchbase/core/operations/management/scope_create.cxx +12 -13
  176. data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
  177. data/ext/couchbase/core/operations/management/scope_drop.cxx +8 -9
  178. data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
  179. data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
  180. data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
  181. data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
  182. data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
  183. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
  184. data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
  185. data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
  186. data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
  187. data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
  188. data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
  189. data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
  190. data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
  191. data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
  192. data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
  193. data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
  194. data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
  195. data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
  196. data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
  197. data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
  198. data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
  199. data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
  200. data/ext/couchbase/core/operations.hxx +0 -1
  201. data/ext/couchbase/core/operations_fwd.hxx +8 -0
  202. data/ext/couchbase/core/origin.cxx +67 -12
  203. data/ext/couchbase/core/origin.hxx +13 -8
  204. data/ext/couchbase/core/orphan_reporter.cxx +164 -0
  205. data/ext/couchbase/core/orphan_reporter.hxx +65 -0
  206. data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
  207. data/ext/couchbase/core/sasl/client.cc +6 -0
  208. data/ext/couchbase/core/sasl/mechanism.cc +2 -1
  209. data/ext/couchbase/core/sasl/mechanism.h +2 -1
  210. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
  211. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
  212. data/ext/couchbase/core/tls_context_provider.cxx +44 -0
  213. data/ext/couchbase/core/tls_context_provider.hxx +44 -0
  214. data/ext/couchbase/core/topology/configuration.cxx +21 -0
  215. data/ext/couchbase/core/topology/configuration.hxx +28 -0
  216. data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
  217. data/ext/couchbase/core/tracing/constants.hxx +148 -68
  218. data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
  219. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
  220. data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
  221. data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
  222. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
  223. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
  224. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
  225. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
  226. data/ext/couchbase/core/transactions/transactions.cxx +1 -1
  227. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
  228. data/ext/couchbase/core/utils/byteswap.hxx +12 -0
  229. data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
  230. data/ext/couchbase/core/utils/connection_string.cxx +2 -0
  231. data/ext/couchbase/core/utils/contains_string.cxx +61 -0
  232. data/ext/couchbase/core/utils/contains_string.hxx +26 -0
  233. data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
  234. data/ext/couchbase/couchbase/cluster.hxx +47 -0
  235. data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
  236. data/ext/couchbase/couchbase/collection.hxx +133 -15
  237. data/ext/couchbase/couchbase/error.hxx +16 -0
  238. data/ext/couchbase/couchbase/error_codes.hxx +48 -48
  239. data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
  240. data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
  241. data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
  242. data/ext/couchbase/couchbase/network_options.hxx +19 -0
  243. data/ext/couchbase/couchbase/node_id.hxx +123 -0
  244. data/ext/couchbase/couchbase/node_id_for_options.hxx +61 -0
  245. data/ext/couchbase/couchbase/node_ids_options.hxx +62 -0
  246. data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
  247. data/ext/couchbase/couchbase/result.hxx +42 -0
  248. data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
  249. data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
  250. data/ext/couchbase.cxx +4 -0
  251. data/ext/extconf.rb +1 -0
  252. data/ext/rcb_analytics.cxx +157 -47
  253. data/ext/rcb_backend.cxx +118 -71
  254. data/ext/rcb_buckets.cxx +39 -16
  255. data/ext/rcb_collections.cxx +36 -12
  256. data/ext/rcb_crud.cxx +589 -294
  257. data/ext/rcb_hdr_histogram.cxx +219 -0
  258. data/ext/rcb_hdr_histogram.hxx +28 -0
  259. data/ext/rcb_logger.cxx +15 -17
  260. data/ext/rcb_multi.cxx +142 -59
  261. data/ext/rcb_observability.cxx +132 -0
  262. data/ext/rcb_observability.hxx +49 -0
  263. data/ext/rcb_query.cxx +77 -27
  264. data/ext/rcb_search.cxx +92 -31
  265. data/ext/rcb_users.cxx +69 -26
  266. data/ext/rcb_utils.cxx +91 -0
  267. data/ext/rcb_utils.hxx +141 -168
  268. data/ext/rcb_views.cxx +36 -12
  269. data/lib/active_support/cache/couchbase_store.rb +6 -6
  270. data/lib/couchbase/authenticator.rb +14 -0
  271. data/lib/couchbase/binary_collection.rb +37 -22
  272. data/lib/couchbase/bucket.rb +46 -31
  273. data/lib/couchbase/cluster.rb +146 -61
  274. data/lib/couchbase/collection.rb +257 -186
  275. data/lib/couchbase/datastructures/couchbase_list.rb +82 -50
  276. data/lib/couchbase/datastructures/couchbase_map.rb +87 -50
  277. data/lib/couchbase/datastructures/couchbase_queue.rb +65 -38
  278. data/lib/couchbase/datastructures/couchbase_set.rb +58 -41
  279. data/lib/couchbase/deprecations.rb +1 -1
  280. data/lib/couchbase/diagnostics.rb +8 -8
  281. data/lib/couchbase/errors.rb +7 -1
  282. data/lib/couchbase/json_transcoder.rb +1 -1
  283. data/lib/couchbase/management/analytics_index_manager.rb +90 -59
  284. data/lib/couchbase/management/bucket_manager.rb +73 -45
  285. data/lib/couchbase/management/collection_manager.rb +86 -43
  286. data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
  287. data/lib/couchbase/management/query_index_manager.rb +88 -36
  288. data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
  289. data/lib/couchbase/management/search_index_manager.rb +401 -178
  290. data/lib/couchbase/management/user_manager.rb +343 -174
  291. data/lib/couchbase/management/view_index_manager.rb +166 -73
  292. data/lib/couchbase/metrics/logging_meter.rb +108 -0
  293. data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
  294. data/lib/couchbase/metrics/meter.rb +27 -0
  295. data/lib/couchbase/metrics/noop_meter.rb +30 -0
  296. data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
  297. data/lib/couchbase/metrics/value_recorder.rb +25 -0
  298. data/lib/couchbase/options.rb +71 -5
  299. data/lib/couchbase/protostellar/client.rb +0 -2
  300. data/lib/couchbase/protostellar/cluster.rb +7 -0
  301. data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_pb.rb +54 -0
  302. data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_services_pb.rb +51 -0
  303. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +5 -24
  304. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +16 -0
  305. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +5 -24
  306. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +16 -0
  307. data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +5 -24
  308. data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +18 -0
  309. data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +2 -23
  310. data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +23 -0
  311. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +4 -25
  312. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +10 -0
  313. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +6 -25
  314. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +18 -0
  315. data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_pb.rb +46 -0
  316. data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_services_pb.rb +56 -0
  317. data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +3 -26
  318. data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +47 -0
  319. data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +4 -26
  320. data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +10 -0
  321. data/lib/couchbase/protostellar/generated/routing/v2/routing_pb.rb +26 -0
  322. data/lib/couchbase/protostellar/generated/routing/v2/routing_services_pb.rb +43 -0
  323. data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +5 -26
  324. data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +11 -0
  325. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +2 -23
  326. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +30 -0
  327. data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +2 -23
  328. data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +9 -0
  329. data/lib/couchbase/protostellar/request_generator/admin/collection.rb +4 -2
  330. data/lib/couchbase/protostellar/request_generator/admin/query.rb +2 -0
  331. data/lib/couchbase/protostellar/request_generator/kv.rb +1 -1
  332. data/lib/couchbase/protostellar/scope.rb +4 -0
  333. data/lib/couchbase/scope.rb +62 -48
  334. data/lib/couchbase/search_options.rb +18 -18
  335. data/lib/couchbase/tracing/noop_span.rb +29 -0
  336. data/lib/couchbase/tracing/noop_tracer.rb +29 -0
  337. data/lib/couchbase/tracing/request_span.rb +34 -0
  338. data/lib/couchbase/tracing/request_tracer.rb +28 -0
  339. data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
  340. data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
  341. data/lib/couchbase/utils/hdr_histogram.rb +55 -0
  342. data/lib/couchbase/utils/observability.rb +263 -0
  343. data/lib/couchbase/utils/observability_constants.rb +200 -0
  344. data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
  345. data/lib/couchbase/version.rb +1 -1
  346. data/lib/couchbase.rb +2 -2
  347. metadata +72 -8
  348. data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +0 -52
  349. data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +0 -30
@@ -18,6 +18,7 @@
18
18
  #include "core/cluster.hxx"
19
19
 
20
20
  #include "core/impl/error.hxx"
21
+ #include "core/impl/observability_recorder.hxx"
21
22
  #include "core/operations/management/collection_create.hxx"
22
23
  #include "core/operations/management/collection_drop.hxx"
23
24
  #include "core/operations/management/collection_update.hxx"
@@ -25,6 +26,8 @@
25
26
  #include "core/operations/management/scope_drop.hxx"
26
27
  #include "core/operations/management/scope_get_all.hxx"
27
28
  #include "core/topology/collections_manifest.hxx"
29
+ #include "core/tracing/constants.hxx"
30
+ #include "core/tracing/tracer_wrapper.hxx"
28
31
 
29
32
  #include <couchbase/collection_manager.hxx>
30
33
  #include <couchbase/create_collection_options.hxx>
@@ -93,15 +96,19 @@ public:
93
96
  const couchbase::drop_collection_options::built& options,
94
97
  couchbase::drop_collection_handler&& handler) const
95
98
  {
99
+ auto obs_rec =
100
+ create_observability_recorder(core::tracing::operation::mgr_collections_drop_collection,
101
+ scope_name,
102
+ collection_name,
103
+ options.parent_span);
104
+ core::operations::management::collection_drop_request request{
105
+ bucket_name_, std::move(scope_name), std::move(collection_name),
106
+ {}, options.timeout, obs_rec->operation_span(),
107
+ };
96
108
  return core_.execute(
97
- core::operations::management::collection_drop_request{
98
- bucket_name_,
99
- std::move(scope_name),
100
- std::move(collection_name),
101
- {},
102
- options.timeout,
103
- },
104
- [handler = std::move(handler)](const auto& resp) mutable {
109
+ std::move(request),
110
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
111
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
105
112
  return handler(core::impl::make_error(resp.ctx));
106
113
  });
107
114
  }
@@ -112,17 +119,20 @@ public:
112
119
  const couchbase::update_collection_options::built& options,
113
120
  couchbase::update_collection_handler&& handler) const
114
121
  {
122
+ auto obs_rec =
123
+ create_observability_recorder(core::tracing::operation::mgr_collections_update_collection,
124
+ scope_name,
125
+ collection_name,
126
+ options.parent_span);
127
+ core::operations::management::collection_update_request request{
128
+ bucket_name_, std::move(scope_name), std::move(collection_name),
129
+ settings.max_expiry, settings.history, {},
130
+ options.timeout, obs_rec->operation_span(),
131
+ };
115
132
  return core_.execute(
116
- core::operations::management::collection_update_request{
117
- bucket_name_,
118
- std::move(scope_name),
119
- std::move(collection_name),
120
- settings.max_expiry,
121
- settings.history,
122
- {},
123
- options.timeout,
124
- },
125
- [handler = std::move(handler)](const auto& resp) mutable {
133
+ std::move(request),
134
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
135
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
126
136
  return handler(core::impl::make_error(resp.ctx));
127
137
  });
128
138
  }
@@ -133,17 +143,20 @@ public:
133
143
  const couchbase::create_collection_options::built& options,
134
144
  couchbase::update_collection_handler&& handler) const
135
145
  {
146
+ auto obs_rec =
147
+ create_observability_recorder(core::tracing::operation::mgr_collections_create_collection,
148
+ scope_name,
149
+ collection_name,
150
+ options.parent_span);
151
+ core::operations::management::collection_create_request request{
152
+ bucket_name_, std::move(scope_name), std::move(collection_name),
153
+ settings.max_expiry, settings.history, {},
154
+ options.timeout, obs_rec->operation_span(),
155
+ };
136
156
  return core_.execute(
137
- core::operations::management::collection_create_request{
138
- bucket_name_,
139
- std::move(scope_name),
140
- std::move(collection_name),
141
- settings.max_expiry,
142
- settings.history,
143
- {},
144
- options.timeout,
145
- },
146
- [handler = std::move(handler)](const auto& resp) mutable {
157
+ std::move(request),
158
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
159
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
147
160
  return handler(core::impl::make_error(resp.ctx));
148
161
  });
149
162
  }
@@ -151,13 +164,18 @@ public:
151
164
  void get_all_scopes(const get_all_scopes_options::built& options,
152
165
  get_all_scopes_handler&& handler) const
153
166
  {
167
+ auto obs_rec = create_observability_recorder(
168
+ core::tracing::operation::mgr_collections_get_all_scopes, {}, {}, options.parent_span);
169
+ core::operations::management::scope_get_all_request request{
170
+ bucket_name_,
171
+ {},
172
+ options.timeout,
173
+ obs_rec->operation_span(),
174
+ };
154
175
  return core_.execute(
155
- core::operations::management::scope_get_all_request{
156
- bucket_name_,
157
- {},
158
- options.timeout,
159
- },
160
- [handler = std::move(handler)](auto resp) mutable {
176
+ std::move(request),
177
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto resp) mutable {
178
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
161
179
  return handler(core::impl::make_error(resp.ctx), map_scope_specs(resp.manifest));
162
180
  });
163
181
  }
@@ -166,14 +184,15 @@ public:
166
184
  const couchbase::create_scope_options::built& options,
167
185
  couchbase::create_scope_handler&& handler) const
168
186
  {
187
+ auto obs_rec = create_observability_recorder(
188
+ core::tracing::operation::mgr_collections_create_scope, scope_name, {}, options.parent_span);
189
+ core::operations::management::scope_create_request request{
190
+ bucket_name_, std::move(scope_name), {}, options.timeout, obs_rec->operation_span(),
191
+ };
169
192
  return core_.execute(
170
- core::operations::management::scope_create_request{
171
- bucket_name_,
172
- std::move(scope_name),
173
- {},
174
- options.timeout,
175
- },
176
- [handler = std::move(handler)](const auto& resp) mutable {
193
+ std::move(request),
194
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
195
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
177
196
  return handler(core::impl::make_error(resp.ctx));
178
197
  });
179
198
  }
@@ -182,19 +201,40 @@ public:
182
201
  const couchbase::drop_scope_options::built& options,
183
202
  couchbase::drop_scope_handler&& handler) const
184
203
  {
185
- core_.execute(
186
- core::operations::management::scope_drop_request{
187
- bucket_name_,
188
- std::move(scope_name),
189
- {},
190
- options.timeout,
191
- },
192
- [handler = std::move(handler)](const auto& resp) mutable {
204
+ auto obs_rec = create_observability_recorder(
205
+ core::tracing::operation::mgr_collections_drop_scope, scope_name, {}, options.parent_span);
206
+ core::operations::management::scope_drop_request request{
207
+ bucket_name_, std::move(scope_name), {}, options.timeout, obs_rec->operation_span(),
208
+ };
209
+ return core_.execute(
210
+ std::move(request),
211
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
212
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
193
213
  return handler(core::impl::make_error(resp.ctx));
194
214
  });
195
215
  }
196
216
 
197
217
  private:
218
+ [[nodiscard]] auto create_observability_recorder(
219
+ const std::string& operation_name,
220
+ const std::optional<std::string>& scope_name,
221
+ const std::optional<std::string>& collection_name,
222
+ const std::shared_ptr<tracing::request_span>& parent_span) const
223
+ -> std::unique_ptr<core::impl::observability_recorder>
224
+ {
225
+ auto obs_rec = core::impl::observability_recorder::create(
226
+ operation_name, parent_span, core_.tracer(), core_.meter());
227
+ obs_rec->with_service(core::tracing::service::management);
228
+ obs_rec->with_bucket_name(bucket_name_);
229
+ if (scope_name.has_value()) {
230
+ obs_rec->with_scope_name(scope_name.value());
231
+ }
232
+ if (collection_name.has_value()) {
233
+ obs_rec->with_collection_name(collection_name.value());
234
+ }
235
+ return obs_rec;
236
+ }
237
+
198
238
  core::cluster core_;
199
239
  std::string bucket_name_;
200
240
  };
@@ -78,9 +78,9 @@ dns_srv_tracker::get_srv_nodes(
78
78
  self->address_,
79
79
  resp.ec.message());
80
80
  } else if (resp.targets.empty() && self->address_ != "localhost") {
81
- CB_LOG_WARNING("DNS SRV query returned 0 records for \"{}\", assuming "
82
- "that cluster is listening this address",
83
- self->address_);
81
+ CB_LOG_DEBUG("DNS SRV query returned 0 records for \"{}\", assuming "
82
+ "that cluster is listening this address",
83
+ self->address_);
84
84
  } else {
85
85
  nodes.reserve(resp.targets.size());
86
86
  for (const auto& address : resp.targets) {
@@ -136,7 +136,7 @@ dns_srv_tracker::report_bootstrap_error(const std::string& endpoint, std::error_
136
136
  {
137
137
  bool trigger_dns_srv_refresh = false;
138
138
 
139
- if (ec && ec != errc::common::request_canceled) {
139
+ if (ec && ec != errc::common::request_canceled && ec != errc::common::bucket_not_found) {
140
140
  const std::scoped_lock lock(known_endpoints_mutex_);
141
141
  known_endpoints_.erase(endpoint);
142
142
  if (known_endpoints_.empty()) {
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include "error.hxx"
19
19
 
20
+ #include "core/error.hxx"
20
21
  #include "core/error_context/analytics.hxx"
21
22
  #include "core/error_context/analytics_json.hxx"
22
23
  #include "core/error_context/http.hxx"
@@ -74,6 +75,17 @@ error::error(std::error_code ec,
74
75
  {
75
76
  }
76
77
 
78
+ error::error(std::error_code ec,
79
+ std::string message,
80
+ couchbase::error_context ctx,
81
+ couchbase::node_id node_id)
82
+ : ec_{ ec }
83
+ , message_{ std::move(message) }
84
+ , ctx_{ std::move(ctx) }
85
+ , node_id_{ std::move(node_id) }
86
+ {
87
+ }
88
+
77
89
  auto
78
90
  error::ec() const -> std::error_code
79
91
  {
@@ -102,6 +114,12 @@ error::cause() const -> std::optional<error>
102
114
  return *cause_;
103
115
  }
104
116
 
117
+ auto
118
+ error::node_id() const -> const couchbase::node_id&
119
+ {
120
+ return node_id_;
121
+ }
122
+
105
123
  error::operator bool() const
106
124
  {
107
125
  return ec_.value() != 0;
@@ -116,7 +134,7 @@ error::operator==(const couchbase::error& other) const -> bool
116
134
  namespace core::impl
117
135
  {
118
136
  auto
119
- make_error(const core::error_context::query& core_ctx) -> error
137
+ make_error(const core::error_context::query& core_ctx) -> couchbase::error
120
138
  {
121
139
  if (!core_ctx.ec) {
122
140
  return {};
@@ -125,7 +143,7 @@ make_error(const core::error_context::query& core_ctx) -> error
125
143
  }
126
144
 
127
145
  auto
128
- make_error(const query_error_context& core_ctx) -> error
146
+ make_error(const query_error_context& core_ctx) -> couchbase::error
129
147
  {
130
148
  if (!core_ctx.ec()) {
131
149
  return {};
@@ -134,7 +152,7 @@ make_error(const query_error_context& core_ctx) -> error
134
152
  }
135
153
 
136
154
  auto
137
- make_error(const core::error_context::search& core_ctx) -> error
155
+ make_error(const core::error_context::search& core_ctx) -> couchbase::error
138
156
  {
139
157
  if (!core_ctx.ec) {
140
158
  return {};
@@ -143,7 +161,7 @@ make_error(const core::error_context::search& core_ctx) -> error
143
161
  }
144
162
 
145
163
  auto
146
- make_error(const core::error_context::analytics& core_ctx) -> error
164
+ make_error(const core::error_context::analytics& core_ctx) -> couchbase::error
147
165
  {
148
166
  if (!core_ctx.ec) {
149
167
  return {};
@@ -152,7 +170,7 @@ make_error(const core::error_context::analytics& core_ctx) -> error
152
170
  }
153
171
 
154
172
  auto
155
- make_error(const core::error_context::http& core_ctx) -> error
173
+ make_error(const core::error_context::http& core_ctx) -> couchbase::error
156
174
  {
157
175
  if (!core_ctx.ec) {
158
176
  return {};
@@ -161,33 +179,41 @@ make_error(const core::error_context::http& core_ctx) -> error
161
179
  }
162
180
 
163
181
  auto
164
- make_error(const couchbase::core::key_value_error_context& core_ctx) -> error
182
+ make_error(const couchbase::core::key_value_error_context& core_ctx) -> couchbase::error
165
183
  {
184
+ // Always preserve the node_id so that callers on both success and error
185
+ // paths can identify which node handled the request.
166
186
  if (!core_ctx.ec()) {
167
- return {};
187
+ return { {}, {}, {}, core_ctx.last_dispatched_to_node_id() };
168
188
  }
169
- return { core_ctx.ec(), {}, internal_error_context::build_error_context(core_ctx) };
189
+ return { core_ctx.ec(),
190
+ {},
191
+ internal_error_context::build_error_context(core_ctx),
192
+ core_ctx.last_dispatched_to_node_id() };
170
193
  }
171
194
 
172
195
  auto
173
- make_error(const couchbase::core::subdocument_error_context& core_ctx) -> error
196
+ make_error(const couchbase::core::subdocument_error_context& core_ctx) -> couchbase::error
174
197
  {
175
198
  if (!core_ctx.ec()) {
176
- return {};
199
+ return { {}, {}, {}, core_ctx.last_dispatched_to_node_id() };
177
200
  }
178
- return { core_ctx.ec(), {}, internal_error_context::build_error_context(core_ctx) };
201
+ return { core_ctx.ec(),
202
+ {},
203
+ internal_error_context::build_error_context(core_ctx),
204
+ core_ctx.last_dispatched_to_node_id() };
179
205
  }
180
206
 
181
207
  auto
182
- make_error(const couchbase::core::transaction_error_context& ctx) -> error
208
+ make_error(const couchbase::core::transaction_error_context& ctx) -> couchbase::error
183
209
  {
184
210
  return { ctx.ec(), {}, {}, { ctx.cause() } };
185
211
  }
186
212
 
187
213
  auto
188
- make_error(const core::transactions::op_exception& exc) -> error
214
+ make_error(const core::transactions::op_exception& exc) -> couchbase::error
189
215
  {
190
- std::optional<error> cause;
216
+ std::optional<couchbase::error> cause;
191
217
  if (std::holds_alternative<key_value_error_context>(exc.ctx().cause())) {
192
218
  cause = make_error(std::get<key_value_error_context>(exc.ctx().cause()));
193
219
  }
@@ -196,7 +222,7 @@ make_error(const core::transactions::op_exception& exc) -> error
196
222
  }
197
223
 
198
224
  if (cause.has_value()) {
199
- return error{
225
+ return couchbase::error{
200
226
  transaction_op_errc_from_external_exception(exc.cause()),
201
227
  exc.what(),
202
228
  {},
@@ -204,7 +230,7 @@ make_error(const core::transactions::op_exception& exc) -> error
204
230
  };
205
231
  }
206
232
 
207
- return error{
233
+ return couchbase::error{
208
234
  transaction_op_errc_from_external_exception(exc.cause()),
209
235
  exc.what(),
210
236
  {},
@@ -218,7 +244,13 @@ make_error(const couchbase::core::transactions::transaction_operation_failed& co
218
244
  return { couchbase::errc::transaction_op::transaction_op_failed,
219
245
  core_tof.what(),
220
246
  internal_error_context::build_error_context(tao::json::empty_object, core_tof),
221
- error(transaction_op_errc_from_external_exception(core_tof.cause())) };
247
+ couchbase::error(transaction_op_errc_from_external_exception(core_tof.cause())) };
248
+ }
249
+
250
+ auto
251
+ make_error(const core::error& err) -> couchbase::error
252
+ {
253
+ return { err.ec, err.message };
222
254
  }
223
255
  } // namespace core::impl
224
256
  } // namespace couchbase
@@ -17,6 +17,7 @@
17
17
 
18
18
  #pragma once
19
19
 
20
+ #include "core/error.hxx"
20
21
  #include "core/error_context/key_value_error_context.hxx"
21
22
  #include "core/error_context/query_error_context.hxx"
22
23
  #include "core/error_context/subdocument_error_context.hxx"
@@ -33,32 +34,36 @@
33
34
  namespace couchbase::core::impl
34
35
  {
35
36
  auto
36
- make_error(const core::error_context::query& core_ctx) -> error;
37
+ make_error(const core::error_context::query& core_ctx) -> couchbase::error;
37
38
 
38
39
  auto
39
- make_error(const core::error_context::search& core_ctx) -> error;
40
+ make_error(const core::error_context::search& core_ctx) -> couchbase::error;
40
41
 
41
42
  auto
42
- make_error(const core::error_context::analytics& core_ctx) -> error;
43
+ make_error(const core::error_context::analytics& core_ctx) -> couchbase::error;
43
44
 
44
45
  auto
45
- make_error(const core::error_context::http& core_ctx) -> error;
46
+ make_error(const core::error_context::http& core_ctx) -> couchbase::error;
46
47
 
47
48
  auto
48
- make_error(const couchbase::core::key_value_error_context& core_ctx) -> error;
49
+ make_error(const couchbase::core::key_value_error_context& core_ctx) -> couchbase::error;
49
50
 
50
51
  auto
51
- make_error(const couchbase::core::subdocument_error_context& core_ctx) -> error;
52
+ make_error(const couchbase::core::subdocument_error_context& core_ctx) -> couchbase::error;
52
53
 
53
54
  auto
54
- make_error(const couchbase::core::query_error_context& core_ctx) -> error;
55
+ make_error(const couchbase::core::query_error_context& core_ctx) -> couchbase::error;
55
56
 
56
57
  auto
57
- make_error(const couchbase::core::transaction_error_context& core_ctx) -> error;
58
+ make_error(const couchbase::core::transaction_error_context& core_ctx) -> couchbase::error;
58
59
 
59
60
  auto
60
- make_error(const couchbase::core::transactions::op_exception& exc) -> error;
61
+ make_error(const couchbase::core::transactions::op_exception& exc) -> couchbase::error;
61
62
 
62
63
  auto
63
- make_error(const couchbase::core::transactions::transaction_operation_failed& core_tof) -> error;
64
+ make_error(const couchbase::core::transactions::transaction_operation_failed& core_tof)
65
+ -> couchbase::error;
66
+
67
+ auto
68
+ make_error(const core::error& err) -> couchbase::error;
64
69
  } // namespace couchbase::core::impl
@@ -70,7 +70,7 @@ private:
70
70
  };
71
71
 
72
72
  using movable_get_all_replicas_handler =
73
- utils::movable_function<void(error, get_all_replicas_result)>;
73
+ utils::movable_function<void(couchbase::error, get_all_replicas_result)>;
74
74
 
75
75
  void
76
76
  initiate_get_all_replicas_operation(std::shared_ptr<cluster> core,
@@ -65,7 +65,8 @@ private:
65
65
  std::optional<std::chrono::milliseconds> timeout_{};
66
66
  };
67
67
 
68
- using movable_get_any_replica_handler = utils::movable_function<void(error, get_replica_result)>;
68
+ using movable_get_any_replica_handler =
69
+ utils::movable_function<void(couchbase::error, get_replica_result)>;
69
70
 
70
71
  void
71
72
  initiate_get_any_replica_operation(std::shared_ptr<cluster> core,
@@ -23,6 +23,7 @@
23
23
  #include "core/io/retry_context.hxx"
24
24
  #include "core/protocol/client_request.hxx"
25
25
  #include "core/protocol/cmd_get_replica.hxx"
26
+ #include "core/public_fwd.hxx"
26
27
  #include "core/timeout_defaults.hxx"
27
28
 
28
29
  namespace couchbase::core::impl
@@ -48,6 +49,7 @@ struct get_replica_request {
48
49
  std::uint16_t partition{};
49
50
  std::uint32_t opaque{};
50
51
  io::retry_context<true> retries{};
52
+ std::shared_ptr<couchbase::tracing::request_span> parent_span{ nullptr };
51
53
 
52
54
  [[nodiscard]] auto encode_to(encoded_request_type& encoded,
53
55
  core::mcbp_context&& context) const -> std::error_code;
@@ -0,0 +1,44 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2026-Present 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
+ #pragma once
19
+
20
+ #include <couchbase/error.hxx>
21
+
22
+ #include <utility>
23
+
24
+ namespace couchbase::core::impl
25
+ {
26
+ /**
27
+ * Forwards (err, result) to the caller's handler, propagating the node_id
28
+ * carried by the error (which make_error populates for KV contexts) onto
29
+ * the result. Using a plain function template avoids the extra std::function
30
+ * allocation a type-erasing wrapper would introduce for the sole purpose of
31
+ * setting node_id - that extra allocation was the source of the 18
32
+ * "Potential memory leak" reports clang-static-analyzer flagged against the
33
+ * previous wrap_with_node_id helper. The handler is taken by forwarding
34
+ * reference and perfect-forwarded to the invocation so that callers moving
35
+ * an rvalue handler consume it without an intermediate copy.
36
+ */
37
+ template<typename Handler, typename Result>
38
+ void
39
+ invoke_with_node_id(Handler&& handler, couchbase::error err, Result result)
40
+ {
41
+ result.node_id(err.node_id());
42
+ std::forward<Handler>(handler)(std::move(err), std::move(result));
43
+ }
44
+ } // namespace couchbase::core::impl
@@ -18,6 +18,7 @@
18
18
  #pragma once
19
19
 
20
20
  #include "core/error_context/key_value.hxx"
21
+ #include "core/error_context/subdocument_error_context.hxx"
21
22
  #include "core/impl/subdoc/command.hxx"
22
23
  #include "core/io/mcbp_context.hxx"
23
24
  #include "core/io/retry_context.hxx"
@@ -26,7 +27,6 @@
26
27
  #include "core/public_fwd.hxx"
27
28
  #include "core/timeout_defaults.hxx"
28
29
 
29
- #include "core/error_context/subdocument_error_context.hxx"
30
30
  #include <couchbase/lookup_in_result.hxx>
31
31
 
32
32
  namespace couchbase::core::impl
@@ -0,0 +1,110 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2024-Present 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 "node_id.hxx"
19
+
20
+ #include "core/utils/crc32.hxx"
21
+
22
+ #include <spdlog/fmt/bundled/core.h>
23
+
24
+ #include <cstdint>
25
+ #include <string>
26
+
27
+ namespace couchbase
28
+ {
29
+
30
+ namespace
31
+ {
32
+ /**
33
+ * Produces a stable, opaque hex string from hostname + KV port.
34
+ *
35
+ * Uses CRC32 (already in-tree for vBucket mapping) rather than a
36
+ * cryptographic hash — collision resistance across a handful of cluster
37
+ * nodes is more than sufficient, and this avoids pulling in OpenSSL headers.
38
+ */
39
+ auto
40
+ derive_fallback_id(const std::string& hostname, std::uint16_t port) -> std::string
41
+ {
42
+ auto input = fmt::format("{}:{}", hostname, port);
43
+ auto crc = core::utils::hash_crc32(input.data(), input.size());
44
+ return fmt::format("{:08x}", crc);
45
+ }
46
+ } // namespace
47
+
48
+ node_id::node_id(std::string node_uuid, std::string hostname, std::uint16_t port)
49
+ : node_uuid_{ std::move(node_uuid) }
50
+ , hostname_{ std::move(hostname) }
51
+ , port_{ port }
52
+ , id_{ node_uuid_.empty() ? derive_fallback_id(hostname_, port_) : node_uuid_ }
53
+ {
54
+ }
55
+
56
+ auto
57
+ node_id::id() const -> const std::string&
58
+ {
59
+ return id_;
60
+ }
61
+
62
+ auto
63
+ node_id::node_uuid() const -> const std::string&
64
+ {
65
+ return node_uuid_;
66
+ }
67
+
68
+ auto
69
+ node_id::hostname() const -> const std::string&
70
+ {
71
+ return hostname_;
72
+ }
73
+
74
+ auto
75
+ node_id::port() const -> std::uint16_t
76
+ {
77
+ return port_;
78
+ }
79
+
80
+ node_id::
81
+ operator bool() const
82
+ {
83
+ return !id_.empty();
84
+ }
85
+
86
+ auto
87
+ node_id::operator==(const node_id& other) const -> bool
88
+ {
89
+ return id_ == other.id_;
90
+ }
91
+
92
+ auto
93
+ node_id::operator!=(const node_id& other) const -> bool
94
+ {
95
+ return !(*this == other);
96
+ }
97
+
98
+ auto
99
+ node_id::operator<(const node_id& other) const -> bool
100
+ {
101
+ return id_ < other.id_;
102
+ }
103
+
104
+ auto
105
+ internal_node_id::build(std::string node_uuid, std::string hostname, std::uint16_t port) -> node_id
106
+ {
107
+ return { std::move(node_uuid), std::move(hostname), port };
108
+ }
109
+
110
+ } // namespace couchbase