couchbase 3.8.1 → 3.9.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 (475) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  3. data/ext/CMakeLists.txt +16 -1
  4. data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
  5. data/ext/cache/extconf_include.rb +6 -6
  6. data/ext/cache/mozilla-ca-bundle.crt +214 -155
  7. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  8. data/ext/couchbase/CMakeLists.txt +130 -21
  9. data/ext/couchbase/cmake/APKBUILD.in +25 -4
  10. data/ext/couchbase/cmake/Bundler.cmake +143 -34
  11. data/ext/couchbase/cmake/CPM.cmake +126 -12
  12. data/ext/couchbase/cmake/Cache.cmake +7 -1
  13. data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
  14. data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
  15. data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
  16. data/ext/couchbase/cmake/OpenSSL.cmake +10 -3
  17. data/ext/couchbase/cmake/Packaging.cmake +519 -65
  18. data/ext/couchbase/cmake/Protostellar.cmake +250 -0
  19. data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
  20. data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
  21. data/ext/couchbase/cmake/TestFramework.cmake +283 -0
  22. data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
  23. data/ext/couchbase/cmake/Testing.cmake +27 -9
  24. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
  25. data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
  26. data/ext/couchbase/cmake/build_config.hxx.in +2 -1
  27. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
  28. data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
  29. data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
  30. data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
  31. data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
  32. data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
  33. data/ext/couchbase/cmake/tarball_glob.txt +49 -0
  34. data/ext/couchbase/core/agent_group.cxx +0 -8
  35. data/ext/couchbase/core/agent_group.hxx +0 -4
  36. data/ext/couchbase/core/analytics_stream.cxx +314 -0
  37. data/ext/couchbase/core/analytics_stream.hxx +129 -0
  38. data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
  39. data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
  40. data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
  41. data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
  42. data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
  43. data/ext/couchbase/core/bucket.cxx +381 -87
  44. data/ext/couchbase/core/bucket.hxx +105 -25
  45. data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
  46. data/ext/couchbase/core/capella.hxx +91 -0
  47. data/ext/couchbase/core/cluster.cxx +1554 -398
  48. data/ext/couchbase/core/cluster.hxx +39 -8
  49. data/ext/couchbase/core/cluster_agent.cxx +0 -8
  50. data/ext/couchbase/core/cluster_agent.hxx +0 -4
  51. data/ext/couchbase/core/cluster_options.hxx +26 -3
  52. data/ext/couchbase/core/collections_component.cxx +39 -15
  53. data/ext/couchbase/core/config_profiles.cxx +1 -1
  54. data/ext/couchbase/core/crud_component.cxx +2 -2
  55. data/ext/couchbase/core/crud_options.hxx +34 -0
  56. data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
  57. data/ext/couchbase/core/document_id_redaction.hxx +81 -0
  58. data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
  59. data/ext/couchbase/core/error_context/key_value.cxx +25 -2
  60. data/ext/couchbase/core/error_context/key_value.hxx +60 -33
  61. data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
  62. data/ext/couchbase/core/error_context/search.hxx +5 -0
  63. data/ext/couchbase/core/error_context/search_json.hxx +3 -0
  64. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
  65. data/ext/couchbase/core/error_context/view.hxx +5 -0
  66. data/ext/couchbase/core/free_form_http_request.cxx +237 -4
  67. data/ext/couchbase/core/free_form_http_request.hxx +41 -8
  68. data/ext/couchbase/core/http_component.cxx +300 -284
  69. data/ext/couchbase/core/http_component.hxx +0 -4
  70. data/ext/couchbase/core/impl/analytics.cxx +38 -5
  71. data/ext/couchbase/core/impl/analytics.hxx +34 -0
  72. data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
  73. data/ext/couchbase/core/impl/collection.cxx +215 -202
  74. data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
  75. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
  76. data/ext/couchbase/core/impl/error.cxx +22 -2
  77. data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
  78. data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
  79. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
  80. data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
  81. data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
  82. data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
  83. data/ext/couchbase/core/impl/node_id.cxx +49 -13
  84. data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
  85. data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
  86. data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
  87. data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
  88. data/ext/couchbase/core/impl/public_cluster.cxx +325 -25
  89. data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
  90. data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
  91. data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
  92. data/ext/couchbase/core/impl/query.cxx +76 -7
  93. data/ext/couchbase/core/impl/query.hxx +36 -0
  94. data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
  95. data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
  96. data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
  97. data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
  98. data/ext/couchbase/core/impl/scope.cxx +70 -0
  99. data/ext/couchbase/core/impl/search.cxx +31 -1
  100. data/ext/couchbase/core/impl/transactions.cxx +130 -0
  101. data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
  102. data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
  103. data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
  104. data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
  105. data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +66 -0
  106. data/ext/couchbase/core/io/dns_client.cxx +122 -45
  107. data/ext/couchbase/core/io/dns_codec.hxx +21 -21
  108. data/ext/couchbase/core/io/dns_config.cxx +21 -6
  109. data/ext/couchbase/core/io/http_command.hxx +149 -121
  110. data/ext/couchbase/core/io/http_error.hxx +107 -0
  111. data/ext/couchbase/core/io/http_parser.cxx +4 -0
  112. data/ext/couchbase/core/io/http_session.cxx +606 -154
  113. data/ext/couchbase/core/io/http_session.hxx +147 -30
  114. data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
  115. data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
  116. data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
  117. data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
  118. data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
  119. data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
  120. data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
  121. data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
  122. data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
  123. data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
  124. data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
  125. data/ext/couchbase/core/io/mcbp_session.cxx +316 -317
  126. data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
  127. data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
  128. data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
  129. data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
  130. data/ext/couchbase/core/io/streams.cxx +275 -14
  131. data/ext/couchbase/core/io/streams.hxx +53 -0
  132. data/ext/couchbase/core/logger/logger.cxx +36 -0
  133. data/ext/couchbase/core/logger/logger.hxx +46 -6
  134. data/ext/couchbase/core/logger/redaction.hxx +503 -0
  135. data/ext/couchbase/core/management/eventing_status.hxx +10 -0
  136. data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
  137. data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
  138. data/ext/couchbase/core/mcbp/codec.cxx +27 -18
  139. data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
  140. data/ext/couchbase/core/mcbp/packet.hxx +2 -2
  141. data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
  142. data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
  143. data/ext/couchbase/core/meta/features.hxx +13 -0
  144. data/ext/couchbase/core/meta/version.cxx +6 -3
  145. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
  146. data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
  147. data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
  148. data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
  149. data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
  150. data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
  151. data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
  152. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
  153. data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
  154. data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
  155. data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
  156. data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
  157. data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
  158. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
  159. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
  160. data/ext/couchbase/core/operations/document_query.cxx +108 -221
  161. data/ext/couchbase/core/operations/document_query.hxx +18 -4
  162. data/ext/couchbase/core/operations/document_search.cxx +52 -8
  163. data/ext/couchbase/core/operations/document_search.hxx +3 -0
  164. data/ext/couchbase/core/operations/document_view.cxx +3 -3
  165. data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
  166. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
  167. data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
  168. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
  169. data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
  170. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
  171. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
  172. data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
  173. data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
  174. data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
  175. data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
  176. data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
  177. data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
  178. data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
  179. data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
  180. data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
  181. data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
  182. data/ext/couchbase/core/operations/management/bucket_create.cxx +37 -38
  183. data/ext/couchbase/core/operations/management/bucket_update.cxx +26 -28
  184. data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
  185. data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
  186. data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
  187. data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
  188. data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
  189. data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
  190. data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
  191. data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
  192. data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
  193. data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
  194. data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
  195. data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
  196. data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
  197. data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
  198. data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
  199. data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
  200. data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
  201. data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
  202. data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
  203. data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
  204. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
  205. data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
  206. data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
  207. data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
  208. data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
  209. data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
  210. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
  211. data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
  212. data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
  213. data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
  214. data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
  215. data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
  216. data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
  217. data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
  218. data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
  219. data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
  220. data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
  221. data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
  222. data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
  223. data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
  224. data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
  225. data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
  226. data/ext/couchbase/core/operations_fwd.hxx +3 -3
  227. data/ext/couchbase/core/origin.cxx +54 -26
  228. data/ext/couchbase/core/origin.hxx +12 -0
  229. data/ext/couchbase/core/orphan_reporter.cxx +2 -1
  230. data/ext/couchbase/core/platform/random.cc +7 -7
  231. data/ext/couchbase/core/protocol/client_request.cxx +2 -2
  232. data/ext/couchbase/core/protocol/client_request.hxx +38 -21
  233. data/ext/couchbase/core/protocol/client_response.cxx +11 -3
  234. data/ext/couchbase/core/protocol/client_response.hxx +27 -6
  235. data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
  236. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
  237. data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
  238. data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
  239. data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
  240. data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
  241. data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
  242. data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
  243. data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
  244. data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
  245. data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
  246. data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
  247. data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
  248. data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
  249. data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
  250. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
  251. data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
  252. data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
  253. data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
  254. data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
  255. data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
  256. data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
  257. data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
  258. data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
  259. data/ext/couchbase/core/protocol/datatype.hxx +118 -1
  260. data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
  261. data/ext/couchbase/core/protocol/magic.hxx +4 -0
  262. data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
  263. data/ext/couchbase/core/protocol/server_request.hxx +3 -1
  264. data/ext/couchbase/core/protocol/status.cxx +1 -1
  265. data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
  266. data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
  267. data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
  268. data/ext/couchbase/core/protostellar/component.cxx +2445 -0
  269. data/ext/couchbase/core/protostellar/component.hxx +391 -0
  270. data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
  271. data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
  272. data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
  273. data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
  274. data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
  275. data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
  276. data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
  277. data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
  278. data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
  279. data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
  280. data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
  281. data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
  282. data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
  283. data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
  284. data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
  285. data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
  286. data/ext/couchbase/core/query_stream.cxx +447 -0
  287. data/ext/couchbase/core/query_stream.hxx +141 -0
  288. data/ext/couchbase/core/query_stream_component.cxx +243 -0
  289. data/ext/couchbase/core/query_stream_component.hxx +68 -0
  290. data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
  291. data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
  292. data/ext/couchbase/core/response_handler.hxx +41 -4
  293. data/ext/couchbase/core/row_streamer.cxx +332 -46
  294. data/ext/couchbase/core/row_streamer.hxx +31 -1
  295. data/ext/couchbase/core/row_streamer_options.hxx +55 -0
  296. data/ext/couchbase/core/sasl/client.h +3 -0
  297. data/ext/couchbase/core/search_scoring.hxx +66 -0
  298. data/ext/couchbase/core/stream_error_details.hxx +69 -0
  299. data/ext/couchbase/core/timeout_defaults.hxx +0 -1
  300. data/ext/couchbase/core/topology/capabilities.hxx +6 -0
  301. data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
  302. data/ext/couchbase/core/topology/configuration.cxx +21 -6
  303. data/ext/couchbase/core/topology/configuration.hxx +29 -8
  304. data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
  305. data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
  306. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
  307. data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
  308. data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
  309. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +362 -241
  310. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +24 -3
  311. data/ext/couchbase/core/transactions/error_list.hxx +2 -2
  312. data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
  313. data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
  314. data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
  315. data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
  316. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
  317. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
  318. data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
  319. data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
  320. data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
  321. data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
  322. data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
  323. data/ext/couchbase/core/transactions/transactions.cxx +3 -55
  324. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +194 -66
  325. data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
  326. data/ext/couchbase/core/transactions/utils.cxx +10 -0
  327. data/ext/couchbase/core/transactions/waitable_op_list.hxx +15 -4
  328. data/ext/couchbase/core/transactions.hxx +9 -9
  329. data/ext/couchbase/core/utils/byteswap.hxx +166 -9
  330. data/ext/couchbase/core/utils/connection_string.cxx +50 -85
  331. data/ext/couchbase/core/utils/connection_string.hxx +15 -0
  332. data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
  333. data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
  334. data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
  335. data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
  336. data/ext/couchbase/core/utils/movable_function.hxx +301 -52
  337. data/ext/couchbase/core/utils/name_codec.hxx +154 -11
  338. data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
  339. data/ext/couchbase/core/utils/url_codec.cxx +12 -51
  340. data/ext/couchbase/core/websocket_codec.cxx +3 -29
  341. data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
  342. data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
  343. data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
  344. data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
  345. data/ext/couchbase/couchbase/bucket.hxx +57 -0
  346. data/ext/couchbase/couchbase/cluster.hxx +216 -5
  347. data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
  348. data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
  349. data/ext/couchbase/couchbase/collection.hxx +234 -14
  350. data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
  351. data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
  352. data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
  353. data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
  354. data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
  355. data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
  356. data/ext/couchbase/couchbase/error.hxx +32 -0
  357. data/ext/couchbase/couchbase/error_codes.hxx +32 -0
  358. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
  359. data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
  360. data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
  361. data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
  362. data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
  363. data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
  364. data/ext/couchbase/couchbase/get_result.hxx +1 -0
  365. data/ext/couchbase/couchbase/increment_options.hxx +1 -1
  366. data/ext/couchbase/couchbase/insert_options.hxx +1 -1
  367. data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
  368. data/ext/couchbase/couchbase/match_query.hxx +1 -1
  369. data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
  370. data/ext/couchbase/couchbase/network_options.hxx +1 -1
  371. data/ext/couchbase/couchbase/node_id.hxx +42 -14
  372. data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
  373. data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
  374. data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
  375. data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
  376. data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
  377. data/ext/couchbase/couchbase/query_options.hxx +23 -12
  378. data/ext/couchbase/couchbase/query_row.hxx +111 -0
  379. data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
  380. data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
  381. data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
  382. data/ext/couchbase/couchbase/replace_options.hxx +3 -3
  383. data/ext/couchbase/couchbase/result.hxx +14 -3
  384. data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
  385. data/ext/couchbase/couchbase/scope.hxx +85 -2
  386. data/ext/couchbase/couchbase/search_options.hxx +58 -8
  387. data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
  388. data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
  389. data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
  390. data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
  391. data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
  392. data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
  393. data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
  394. data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
  395. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
  396. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
  397. data/ext/couchbase/couchbase/transactions.hxx +27 -18
  398. data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
  399. data/ext/couchbase/couchbase/vector_query.hxx +1 -1
  400. data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
  401. data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
  402. data/ext/extconf.rb +15 -10
  403. data/ext/rcb_analytics.cxx +82 -102
  404. data/ext/rcb_backend.cxx +42 -36
  405. data/ext/rcb_backend.hxx +2 -0
  406. data/ext/rcb_buckets.cxx +47 -59
  407. data/ext/rcb_collections.cxx +42 -52
  408. data/ext/rcb_crud.cxx +345 -224
  409. data/ext/rcb_diagnostics.cxx +117 -27
  410. data/ext/rcb_exceptions.cxx +152 -99
  411. data/ext/rcb_exceptions.hxx +25 -0
  412. data/ext/rcb_extras.cxx +18 -19
  413. data/ext/rcb_hdr_histogram.cxx +19 -4
  414. data/ext/rcb_logger.cxx +202 -27
  415. data/ext/rcb_logger.hxx +12 -0
  416. data/ext/rcb_multi.cxx +40 -40
  417. data/ext/rcb_observability.cxx +7 -5
  418. data/ext/rcb_query.cxx +99 -142
  419. data/ext/rcb_range_scan.cxx +41 -35
  420. data/ext/rcb_search.cxx +98 -99
  421. data/ext/rcb_users.cxx +36 -56
  422. data/ext/rcb_utils.cxx +100 -37
  423. data/ext/rcb_utils.hxx +287 -33
  424. data/ext/rcb_version.cxx +1 -1
  425. data/ext/rcb_views.cxx +55 -51
  426. data/lib/active_support/cache/couchbase_store.rb +77 -12
  427. data/lib/couchbase/bucket.rb +20 -0
  428. data/lib/couchbase/cluster.rb +33 -14
  429. data/lib/couchbase/collection.rb +36 -1
  430. data/lib/couchbase/errors.rb +18 -0
  431. data/lib/couchbase/fork_hooks.rb +16 -7
  432. data/lib/couchbase/get_replica_strategy.rb +89 -0
  433. data/lib/couchbase/logger.rb +1 -1
  434. data/lib/couchbase/management/analytics_index_manager.rb +15 -15
  435. data/lib/couchbase/management/bucket_manager.rb +6 -6
  436. data/lib/couchbase/management/collection_manager.rb +6 -6
  437. data/lib/couchbase/management/query_index_manager.rb +7 -7
  438. data/lib/couchbase/management/search_index_manager.rb +13 -13
  439. data/lib/couchbase/management/user_manager.rb +10 -10
  440. data/lib/couchbase/management/view_index_manager.rb +5 -5
  441. data/lib/couchbase/options.rb +181 -44
  442. data/lib/couchbase/protostellar/bucket.rb +4 -0
  443. data/lib/couchbase/protostellar/cluster.rb +4 -0
  444. data/lib/couchbase/protostellar/collection.rb +4 -0
  445. data/lib/couchbase/protostellar/error_handling.rb +2 -1
  446. data/lib/couchbase/protostellar/request.rb +1 -0
  447. data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
  448. data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
  449. data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
  450. data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
  451. data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
  452. data/lib/couchbase/search_options.rb +95 -6
  453. data/lib/couchbase/version.rb +1 -1
  454. metadata +92 -33
  455. data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
  456. data/ext/couchbase/core/columnar/agent.hxx +0 -71
  457. data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
  458. data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
  459. data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
  460. data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
  461. data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
  462. data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
  463. data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
  464. data/ext/couchbase/core/columnar/error.hxx +0 -51
  465. data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
  466. data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
  467. data/ext/couchbase/core/columnar/management_component.cxx +0 -300
  468. data/ext/couchbase/core/columnar/management_component.hxx +0 -56
  469. data/ext/couchbase/core/columnar/query_component.cxx +0 -523
  470. data/ext/couchbase/core/columnar/query_component.hxx +0 -57
  471. data/ext/couchbase/core/columnar/query_options.hxx +0 -59
  472. data/ext/couchbase/core/columnar/query_result.cxx +0 -130
  473. data/ext/couchbase/core/columnar/query_result.hxx +0 -78
  474. data/ext/couchbase/core/io/config_tracker.cxx +0 -687
  475. data/ext/couchbase/core/io/config_tracker.hxx +0 -123
@@ -20,6 +20,8 @@
20
20
  #include "deprecation_utils.hxx"
21
21
  #include "diagnostics.hxx"
22
22
  #include "error.hxx"
23
+ #include "error_context/analytics.hxx"
24
+ #include "error_context/query.hxx"
23
25
  #include "operations_fwd.hxx"
24
26
  #include "origin.hxx"
25
27
  #include "topology/configuration.hxx"
@@ -40,6 +42,9 @@ namespace couchbase::core
40
42
  class crud_component;
41
43
  class cluster_impl;
42
44
  class cluster_label_listener;
45
+ class bucket;
46
+ class query_stream;
47
+ class analytics_stream;
43
48
 
44
49
  namespace tracing
45
50
  {
@@ -70,6 +75,7 @@ class cluster
70
75
  {
71
76
  public:
72
77
  explicit cluster(asio::io_context& ctx);
78
+ explicit cluster(std::shared_ptr<cluster_impl> impl);
73
79
 
74
80
  [[nodiscard]] auto io_context() const -> asio::io_context&;
75
81
 
@@ -77,9 +83,6 @@ public:
77
83
 
78
84
  void open(core::origin origin, utils::movable_function<void(std::error_code)>&& handler) const;
79
85
 
80
- void open_in_background(const couchbase::core::origin& origin,
81
- utils::movable_function<void(std::error_code)>&& handler) const;
82
-
83
86
  void close(utils::movable_function<void()>&& handler) const;
84
87
 
85
88
  void open_bucket(const std::string& bucket_name,
@@ -119,6 +122,23 @@ public:
119
122
  void execute(o::mutate_in_request request, mf<void(o::mutate_in_response)>&& handler) const;
120
123
  void execute(o::prepend_request request, mf<void(o::prepend_response)>&& handler) const;
121
124
  void execute(o::query_request request, mf<void(o::query_response)>&& handler) const;
125
+
126
+ /**
127
+ * Dispatches a N1QL query as a streaming request, resolving the handler with a query_stream
128
+ * handle once the response preamble (signature + upfront errors) has been parsed. Rows are then
129
+ * pulled lazily from the handle, so the full response body is never buffered.
130
+ */
131
+ void query_stream(o::query_request request,
132
+ mf<void(query_stream, error_context::query)>&& handler) const;
133
+
134
+ /**
135
+ * Dispatches an analytics query as a streaming request, resolving the handler with an
136
+ * analytics_stream handle once the response preamble (signature + upfront errors) has been
137
+ * parsed. Rows are then pulled lazily from the handle, so the full response body is never
138
+ * buffered.
139
+ */
140
+ void analytics_query_stream(o::analytics_request request,
141
+ mf<void(analytics_stream, error_context::analytics)>&& handler) const;
122
142
  void execute(o::remove_request request, mf<void(o::remove_response)>&& handler) const;
123
143
  void execute(o::replace_request request, mf<void(o::replace_response)>&& handler) const;
124
144
  void execute(o::search_request request, mf<void(o::search_response)>&& handler) const;
@@ -285,15 +305,15 @@ public:
285
305
  void execute(om::cluster_describe_request request,
286
306
  mf<void(om::cluster_describe_response)>&& handler) const;
287
307
 
288
- void execute(impl::get_replica_request request,
289
- mf<void(impl::get_replica_response)>&& handler) const;
308
+ void execute(operations::get_replica_request request,
309
+ mf<void(operations::get_replica_response)>&& handler) const;
290
310
  void execute(impl::lookup_in_replica_request request,
291
311
  mf<void(impl::lookup_in_replica_response)>&& handler) const;
292
312
  void execute(impl::observe_seqno_request request,
293
313
  mf<void(impl::observe_seqno_response)>&& handler) const;
294
314
 
295
315
  void execute(o::get_replica_request_with_cancellation request,
296
- mf<void(impl::get_replica_response)>&& handler) const;
316
+ mf<void(operations::get_replica_response)>&& handler) const;
297
317
  void execute(o::get_request_with_cancellation request, mf<void(o::get_response)>&& handler) const;
298
318
  void execute(o::lookup_in_request_with_cancellation request,
299
319
  mf<void(o::lookup_in_response)>&& handler) const;
@@ -339,10 +359,21 @@ public:
339
359
 
340
360
  [[nodiscard]] auto to_string() const -> std::string;
341
361
 
342
- [[nodiscard]] auto tracer() const -> const std::shared_ptr<tracing::tracer_wrapper>&;
343
- [[nodiscard]] auto meter() const -> const std::shared_ptr<metrics::meter_wrapper>&;
362
+ [[nodiscard]] auto tracer() const -> std::shared_ptr<tracing::tracer_wrapper>;
363
+ [[nodiscard]] auto meter() const -> std::shared_ptr<metrics::meter_wrapper>;
344
364
  [[nodiscard]] auto cluster_label_listener() const
345
365
  -> const std::shared_ptr<cluster_label_listener>&;
366
+ [[nodiscard]] auto find_bucket_by_name(const std::string& name) const -> std::shared_ptr<bucket>;
367
+ [[nodiscard]] auto is_protostellar() const -> bool;
368
+ // couchbase2 only: whether the gRPC channel is READY, asking an idle channel to connect.
369
+ // cluster_closed once the cluster is closed, feature_not_available for any other cluster.
370
+ [[nodiscard]] auto protostellar_channel_ready() const -> std::pair<std::error_code, bool>;
371
+ // Calls `hook` on the io_context during close(), before close()'s handler, if `owner` is still
372
+ // alive then. Returns false, without registering, once the cluster is stopped. open() also stops
373
+ // it without calling hooks when the origin has no nodes, the build has no couchbase2 support, or
374
+ // the couchbase2 channel cannot be built.
375
+ [[nodiscard]] auto add_close_hook(std::weak_ptr<void> owner,
376
+ utils::movable_function<void()>&& hook) const -> bool;
346
377
 
347
378
  private:
348
379
  std::shared_ptr<cluster_impl> impl_;
@@ -42,11 +42,7 @@ public:
42
42
 
43
43
  auto free_form_http_request(const http_request& request,
44
44
  free_form_http_request_callback&& callback)
45
- #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
46
- -> tl::expected<std::shared_ptr<pending_operation>, error_union>
47
- #else
48
45
  -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>
49
- #endif
50
46
  {
51
47
  return http_.do_http_request(request, std::move(callback));
52
48
  }
@@ -65,11 +61,7 @@ cluster_agent::cluster_agent(asio::io_context& io, cluster_agent_config config)
65
61
  auto
66
62
  cluster_agent::free_form_http_request(const couchbase::core::http_request& request,
67
63
  couchbase::core::free_form_http_request_callback&& callback)
68
- #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
69
- -> tl::expected<std::shared_ptr<pending_operation>, error_union>
70
- #else
71
64
  -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>
72
- #endif
73
65
  {
74
66
  return impl_->free_form_http_request(request, std::move(callback));
75
67
  }
@@ -40,11 +40,7 @@ public:
40
40
 
41
41
  auto free_form_http_request(const http_request& request,
42
42
  free_form_http_request_callback&& callback)
43
- #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
44
- -> tl::expected<std::shared_ptr<pending_operation>, error_union>;
45
- #else
46
43
  -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>;
47
- #endif
48
44
 
49
45
  private:
50
46
  std::shared_ptr<cluster_agent_impl> impl_;
@@ -17,16 +17,18 @@
17
17
 
18
18
  #pragma once
19
19
 
20
- #include "core/columnar/security_options.hxx"
21
20
  #include "core/io/dns_config.hxx"
22
21
  #include "core/io/ip_protocol.hxx"
23
22
  #include "core/metrics/logging_meter_options.hxx"
24
23
  #include "core/orphan_reporter.hxx"
24
+ #include "core/row_streamer_options.hxx"
25
25
  #include "core/tracing/threshold_logging_options.hxx"
26
26
  #include "service_type.hxx"
27
27
  #include "timeout_defaults.hxx"
28
28
  #include "tls_verify_mode.hxx"
29
29
 
30
+ #include "core/protostellar/compression_settings.hxx"
31
+
30
32
  #include <couchbase/metrics/meter.hxx>
31
33
  #include <couchbase/retry_strategy.hxx>
32
34
  #include <couchbase/tracing/request_tracer.hxx>
@@ -45,7 +47,6 @@ public:
45
47
  [[nodiscard]] std::chrono::milliseconds default_timeout_for(service_type type) const;
46
48
 
47
49
  std::chrono::milliseconds bootstrap_timeout = timeout_defaults::bootstrap_timeout;
48
- std::chrono::milliseconds dispatch_timeout = timeout_defaults::dispatch_timeout;
49
50
  std::chrono::milliseconds resolve_timeout = timeout_defaults::resolve_timeout;
50
51
  std::chrono::milliseconds connect_timeout = timeout_defaults::connect_timeout;
51
52
  std::chrono::milliseconds key_value_timeout = timeout_defaults::key_value_timeout;
@@ -71,6 +72,8 @@ public:
71
72
  bool enable_unordered_execution{ true };
72
73
  bool enable_clustermap_notification{ true };
73
74
  bool enable_compression{ true };
75
+ std::size_t compression_min_size{ 32 };
76
+ double compression_min_ratio{ 0.83 };
74
77
  bool enable_tracing{ true };
75
78
  bool enable_metrics{ true };
76
79
  bool enable_orphan_reporting{ true };
@@ -96,9 +99,13 @@ public:
96
99
  std::string server_group{};
97
100
  couchbase::transactions::transactions_config::built transactions{};
98
101
 
102
+ // Writes the whole cluster configuration to the log. It carries the same kinds of values that
103
+ // are annotated elsewhere in the log, but none of it is annotated here. A tag pair around
104
+ // multi-line JSON is not a shape the tooling handles, and hashing the blob would remove exactly
105
+ // what the dump exists to show. Enabling this together with log_redaction is warned about when
106
+ // the cluster opens.
99
107
  bool dump_configuration{ false };
100
108
  bool disable_mozilla_ca_certificates{ false };
101
- couchbase::core::columnar::security_options security_options{};
102
109
 
103
110
  bool enable_app_telemetry{ true };
104
111
  std::string app_telemetry_endpoint{};
@@ -114,6 +121,22 @@ public:
114
121
  bool preserve_bootstrap_nodes_order{ false };
115
122
  bool allow_enterprise_analytics{ false };
116
123
  bool enable_lazy_connections{ false };
124
+ bool log_redaction{ false };
125
+
126
+ // Tuning for the streaming query/analytics row engine. Internal-only for now (no public API);
127
+ // sensible static defaults apply unless a core caller overrides them. idle_timeout is derived
128
+ // per request from the operation timeout, so the value here is not used for it.
129
+ row_streamer_options streaming{};
117
130
  };
118
131
 
132
+ [[nodiscard]] inline auto
133
+ make_compression_settings(const cluster_options& options) -> protostellar::kv::compression_settings
134
+ {
135
+ protostellar::kv::compression_settings compression{};
136
+ compression.enabled = options.enable_compression;
137
+ compression.min_size = options.compression_min_size;
138
+ compression.min_ratio = options.compression_min_ratio;
139
+ return compression;
140
+ }
141
+
119
142
  } // namespace couchbase::core
@@ -21,6 +21,7 @@
21
21
  #include "collections_component_unit_test_api.hxx"
22
22
  #include "core/collections_options.hxx"
23
23
  #include "core/logger/logger.hxx"
24
+ #include "core/logger/redaction.hxx"
24
25
  #include "core/mcbp/big_endian.hxx"
25
26
  #include "core/pending_operation.hxx"
26
27
  #include "core/protocol/client_opcode.hxx"
@@ -311,6 +312,20 @@ public:
311
312
  auto dispatch(std::shared_ptr<mcbp::queue_request> request)
312
313
  -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>
313
314
  {
315
+ // Give the KV response path a way to invalidate the cached collection id and re-resolve it
316
+ // when the server reports unknown_collection (e.g. after a drop/recreate assigns a new id).
317
+ // Capture weak pointers to both the manager and the request: storing a shared_ptr to the
318
+ // request inside a std::function held ON that same request would form a self-referential cycle
319
+ // and leak it. GetCollectionID resolution requests do not pass through here, so they never get
320
+ // the hook and cannot recurse.
321
+ request->on_unknown_collection_ = [weak_mgr = weak_from_this(),
322
+ weak_req =
323
+ std::weak_ptr<mcbp::queue_request>(request)]() -> bool {
324
+ auto mgr = weak_mgr.lock();
325
+ auto req = weak_req.lock();
326
+ return (mgr && req) ? mgr->handle_collection_unknown(req) : false;
327
+ };
328
+
314
329
  if ((request->collection_id_ > 0) // collection id present
315
330
  || (request->collection_name_.empty() && request->scope_name_.empty()) // no collection
316
331
  || (request->collection_name_ == collection::default_name &&
@@ -350,8 +365,9 @@ collection_id_cache_entry_impl::dispatch(std::shared_ptr<mcbp::queue_request> re
350
365
  */
351
366
  switch (const std::scoped_lock lock(mutex_); id_) {
352
367
  case unknown_collection_id:
353
- CB_LOG_DEBUG(
354
- "collection {}.{} unknown. refreshing id", req->scope_name_, req->collection_id_);
368
+ CB_LOG_DEBUG("collection {}.{} unknown. refreshing id",
369
+ logger::metadata(req->scope_name_),
370
+ logger::metadata(req->collection_name_));
355
371
  id_ = pending_collection_id;
356
372
 
357
373
  if (auto ec = refresh_collection_id(req); ec) {
@@ -362,8 +378,8 @@ collection_id_cache_entry_impl::dispatch(std::shared_ptr<mcbp::queue_request> re
362
378
 
363
379
  case pending_collection_id:
364
380
  CB_LOG_DEBUG("collection {}.{} pending. queueing request OP={}",
365
- req->scope_name_,
366
- req->collection_id_,
381
+ logger::metadata(req->scope_name_),
382
+ logger::metadata(req->collection_name_),
367
383
  req->command_);
368
384
  return queue_->push(req, max_queue_size_);
369
385
 
@@ -373,8 +389,8 @@ collection_id_cache_entry_impl::dispatch(std::shared_ptr<mcbp::queue_request> re
373
389
 
374
390
  if (auto ec = assign_collection_id(req); ec) {
375
391
  CB_LOG_DEBUG("failed to set collection ID \"{}.{}\" on request (OP={}): {}",
376
- req->scope_name_,
377
- req->collection_name_,
392
+ logger::metadata(req->scope_name_),
393
+ logger::metadata(req->collection_name_),
378
394
  req->command_,
379
395
  ec.message());
380
396
  return ec;
@@ -391,7 +407,9 @@ collection_id_cache_entry_impl::refresh_collection_id(
391
407
  return ec;
392
408
  }
393
409
 
394
- CB_LOG_DEBUG("refreshing collection ID for \"{}.{}\"", req->scope_name_, req->collection_name_);
410
+ CB_LOG_DEBUG("refreshing collection ID for \"{}.{}\"",
411
+ logger::metadata(req->scope_name_),
412
+ logger::metadata(req->collection_name_));
395
413
  auto op = manager_.lock()->get_collection_id(
396
414
  req->scope_name_,
397
415
  req->collection_name_,
@@ -405,8 +423,8 @@ collection_id_cache_entry_impl::refresh_collection_id(
405
423
  // queued within the cache. Either the collection will eventually come online or this
406
424
  // request will time out.
407
425
  CB_LOG_DEBUG("collection \"{}.{}\" not found, attempting retry",
408
- req->scope_name_,
409
- req->collection_name_);
426
+ logger::metadata(req->scope_name_),
427
+ logger::metadata(req->collection_name_));
410
428
  self->set_id(unknown_collection_id);
411
429
  if (self->queue_->remove(req)) {
412
430
  if (self->manager_.lock()->handle_collection_unknown(req)) {
@@ -416,13 +434,13 @@ collection_id_cache_entry_impl::refresh_collection_id(
416
434
  CB_LOG_DEBUG("request no longer existed in op queue, possibly cancelled?, opaque={}, "
417
435
  "collection_name=\"{}\"",
418
436
  req->opaque_,
419
- req->collection_name_);
437
+ logger::metadata(req->collection_name_));
420
438
  }
421
439
  } else {
422
440
  CB_LOG_DEBUG("collection id refresh failed: {}, opaque={}, collection_name=\"{}\"",
423
441
  ec.message(),
424
442
  req->opaque_,
425
- req->collection_name_);
443
+ logger::metadata(req->collection_name_));
426
444
  }
427
445
  // There was an error getting this collection ID so lets remove the cache from the manager
428
446
  // and try to callback on all the queued requests.
@@ -437,16 +455,16 @@ collection_id_cache_entry_impl::refresh_collection_id(
437
455
  // We successfully got the cid, the GetCollectionID itself will have handled setting the ID on
438
456
  // this cache, so lets reset the op queue and requeue all of our requests.
439
457
  CB_LOG_DEBUG("collection \"{}.{}\" refresh succeeded cid={}, re-queuing requests",
440
- req->scope_name_,
441
- req->collection_name_,
458
+ logger::metadata(req->scope_name_),
459
+ logger::metadata(req->collection_name_),
442
460
  res.collection_id);
443
461
  auto queue = self->swap_queue();
444
462
  queue->close();
445
463
  return queue->drain([self](const auto& r) {
446
464
  if (auto ec = self->assign_collection_id(r); ec) {
447
465
  CB_LOG_DEBUG("failed to set collection ID \"{}.{}\" on request (OP={}): {}",
448
- r->scope_name_,
449
- r->collection_name_,
466
+ logger::metadata(r->scope_name_),
467
+ logger::metadata(r->collection_name_),
450
468
  r->command_,
451
469
  ec.message());
452
470
  return;
@@ -461,6 +479,12 @@ collection_id_cache_entry_impl::refresh_collection_id(
461
479
  if (op) {
462
480
  return {};
463
481
  }
482
+ // The request was queued above so that the resolution could re-dispatch it. No
483
+ // resolution was started, so nothing will ever drain that queue: take the
484
+ // request back out and let the caller complete it with this error. Leaving it
485
+ // queued strands it behind the cache entry, and its callback holds the agent
486
+ // and the cluster graph behind it.
487
+ static_cast<void>(queue_->remove(req));
464
488
  return op.error();
465
489
  }
466
490
 
@@ -64,7 +64,7 @@ config_profiles::config_profiles() noexcept
64
64
  void
65
65
  config_profiles::apply(std::string_view profile_name, couchbase::core::cluster_options& opts)
66
66
  {
67
- const std::lock_guard<std::mutex> lock(mut_);
67
+ const std::scoped_lock<std::mutex> lock(mut_);
68
68
  auto it = profiles_.find(profile_name);
69
69
  if (it != profiles_.end()) {
70
70
  it->second->apply(opts);
@@ -203,12 +203,12 @@ parse_range_scan_documents(gsl::span<std::byte> data,
203
203
  }
204
204
  body.value = { remaining.begin(),
205
205
  remaining.begin() + static_cast<std::ptrdiff_t>(value_length) };
206
- if ((body.datatype & static_cast<std::byte>(protocol::datatype::snappy)) != std::byte{ 0 }) {
206
+ if (protocol::has_flag(body.datatype, protocol::datatype::snappy)) {
207
207
  std::string uncompressed;
208
208
  if (snappy::Uncompress(
209
209
  reinterpret_cast<const char*>(body.value.data()), body.value.size(), &uncompressed)) {
210
210
  body.value = core::utils::to_binary(uncompressed);
211
- body.datatype &= ~static_cast<std::byte>(protocol::datatype::snappy);
211
+ protocol::clear_flag(body.datatype, protocol::datatype::snappy);
212
212
  }
213
213
  }
214
214
  data = gsl::make_span(remaining.data() + value_length, remaining.size() - value_length);
@@ -21,9 +21,11 @@
21
21
  #include <couchbase/cas.hxx>
22
22
  #include <couchbase/durability_level.hxx>
23
23
  #include <couchbase/mutation_token.hxx>
24
+ #include <couchbase/retry_reason.hxx>
24
25
 
25
26
  #include <chrono>
26
27
  #include <optional>
28
+ #include <set>
27
29
  #include <string>
28
30
  #include <system_error>
29
31
  #include <vector>
@@ -65,6 +67,8 @@ public:
65
67
 
66
68
  struct {
67
69
  std::optional<resource_unit_result> resource_units{};
70
+ std::size_t retry_attempts{ 0 };
71
+ std::set<retry_reason> retry_reasons{};
68
72
  } internal{};
69
73
  };
70
74
 
@@ -97,6 +101,8 @@ public:
97
101
 
98
102
  struct {
99
103
  std::optional<resource_unit_result> resource_units{};
104
+ std::size_t retry_attempts{ 0 };
105
+ std::set<retry_reason> retry_reasons{};
100
106
  } internal{};
101
107
  };
102
108
 
@@ -130,6 +136,8 @@ public:
130
136
 
131
137
  struct {
132
138
  std::optional<resource_unit_result> resource_units{};
139
+ std::size_t retry_attempts{ 0 };
140
+ std::set<retry_reason> retry_reasons{};
133
141
  } internal{};
134
142
  };
135
143
 
@@ -163,6 +171,8 @@ public:
163
171
 
164
172
  struct {
165
173
  std::optional<resource_unit_result> resource_units{};
174
+ std::size_t retry_attempts{ 0 };
175
+ std::set<retry_reason> retry_reasons{};
166
176
  } internal{};
167
177
  };
168
178
 
@@ -194,6 +204,8 @@ public:
194
204
 
195
205
  struct {
196
206
  std::optional<resource_unit_result> resource_units{};
207
+ std::size_t retry_attempts{ 0 };
208
+ std::set<retry_reason> retry_reasons{};
197
209
  } internal{};
198
210
  };
199
211
 
@@ -224,6 +236,8 @@ public:
224
236
 
225
237
  struct {
226
238
  std::optional<resource_unit_result> resource_units{};
239
+ std::size_t retry_attempts{ 0 };
240
+ std::set<retry_reason> retry_reasons{};
227
241
  } internal{};
228
242
  };
229
243
 
@@ -259,6 +273,8 @@ public:
259
273
 
260
274
  struct {
261
275
  std::optional<resource_unit_result> resource_units{};
276
+ std::size_t retry_attempts{ 0 };
277
+ std::set<retry_reason> retry_reasons{};
262
278
  } internal{};
263
279
  };
264
280
 
@@ -295,6 +311,8 @@ public:
295
311
 
296
312
  struct {
297
313
  std::optional<resource_unit_result> resource_units{};
314
+ std::size_t retry_attempts{ 0 };
315
+ std::set<retry_reason> retry_reasons{};
298
316
  } internal{};
299
317
  };
300
318
 
@@ -332,6 +350,8 @@ public:
332
350
 
333
351
  struct {
334
352
  std::optional<resource_unit_result> resource_units{};
353
+ std::size_t retry_attempts{ 0 };
354
+ std::set<retry_reason> retry_reasons{};
335
355
  } internal{};
336
356
  };
337
357
 
@@ -364,6 +384,8 @@ public:
364
384
 
365
385
  struct {
366
386
  std::optional<resource_unit_result> resource_units{};
387
+ std::size_t retry_attempts{ 0 };
388
+ std::set<retry_reason> retry_reasons{};
367
389
  } internal{};
368
390
  };
369
391
 
@@ -397,6 +419,8 @@ public:
397
419
 
398
420
  struct {
399
421
  std::optional<resource_unit_result> resource_units{};
422
+ std::size_t retry_attempts{ 0 };
423
+ std::set<retry_reason> retry_reasons{};
400
424
  } internal{};
401
425
  };
402
426
 
@@ -432,6 +456,8 @@ public:
432
456
 
433
457
  struct {
434
458
  std::optional<resource_unit_result> resource_units{};
459
+ std::size_t retry_attempts{ 0 };
460
+ std::set<retry_reason> retry_reasons{};
435
461
  } internal{};
436
462
  };
437
463
 
@@ -462,6 +488,8 @@ public:
462
488
 
463
489
  struct {
464
490
  std::optional<resource_unit_result> resource_units{};
491
+ std::size_t retry_attempts{ 0 };
492
+ std::set<retry_reason> retry_reasons{};
465
493
  } internal{};
466
494
  };
467
495
 
@@ -497,6 +525,8 @@ public:
497
525
 
498
526
  struct {
499
527
  std::optional<resource_unit_result> resource_units{};
528
+ std::size_t retry_attempts{ 0 };
529
+ std::set<retry_reason> retry_reasons{};
500
530
  } internal{};
501
531
  };
502
532
 
@@ -535,6 +565,8 @@ public:
535
565
 
536
566
  struct {
537
567
  std::optional<resource_unit_result> resource_units{};
568
+ std::size_t retry_attempts{ 0 };
569
+ std::set<retry_reason> retry_reasons{};
538
570
  } internal{};
539
571
  };
540
572
 
@@ -573,6 +605,8 @@ public:
573
605
 
574
606
  struct {
575
607
  std::optional<resource_unit_result> resource_units{};
608
+ std::size_t retry_attempts{ 0 };
609
+ std::set<retry_reason> retry_reasons{};
576
610
  } internal{};
577
611
  };
578
612
 
@@ -21,13 +21,28 @@
21
21
  #include <memory>
22
22
  #include <stdexcept>
23
23
 
24
- namespace internal
25
- {
26
-
24
+ // Platform headers stay at global scope: included inside a namespace, the standard library headers
25
+ // they reach are declared inside it, and std resolves to that namespace's std.
27
26
  #ifdef _MSC_VER
28
27
  #include <windows.h>
29
28
 
30
29
  #include <bcrypt.h>
30
+ #elif defined(__APPLE__)
31
+ #include <CommonCrypto/CommonCryptor.h>
32
+ #include <CommonCrypto/CommonDigest.h>
33
+ #include <CommonCrypto/CommonHMAC.h>
34
+ #include <CommonCrypto/CommonKeyDerivation.h>
35
+ #else
36
+ #include "include_ssl/evp.h"
37
+ #include "include_ssl/hmac.h"
38
+ #include "include_ssl/md5.h"
39
+ #include "include_ssl/sha.h"
40
+ #endif
41
+
42
+ namespace internal
43
+ {
44
+
45
+ #ifdef _MSC_VER
31
46
 
32
47
  struct HeapAllocDeleter {
33
48
  void operator()(PBYTE bytes)
@@ -335,11 +350,6 @@ decrypt(const couchbase::core::crypto::Cipher /* cipher */,
335
350
 
336
351
  #elif defined(__APPLE__)
337
352
 
338
- #include <CommonCrypto/CommonCryptor.h>
339
- #include <CommonCrypto/CommonDigest.h>
340
- #include <CommonCrypto/CommonHMAC.h>
341
- #include <CommonCrypto/CommonKeyDerivation.h>
342
-
343
353
  auto
344
354
  HMAC_SHA1(std::string_view key, std::string_view data) -> std::string
345
355
  {
@@ -589,11 +599,6 @@ decrypt(const couchbase::core::crypto::Cipher cipher,
589
599
 
590
600
  #else
591
601
 
592
- #include "include_ssl/evp.h"
593
- #include "include_ssl/hmac.h"
594
- #include "include_ssl/md5.h"
595
- #include "include_ssl/sha.h"
596
-
597
602
  // OpenSSL
598
603
 
599
604
  auto
@@ -0,0 +1,81 @@
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
+ /*
19
+ * The logging formatter for a document id, kept out of document_id_fmt.hxx so that the plain
20
+ * formatter stays free of the logger. That header is included by transaction internals, a subdoc
21
+ * test and the FIT performer, none of which log a document id; only the handful of files that pass
22
+ * one to a CB_LOG_* statement include this.
23
+ */
24
+
25
+ #pragma once
26
+
27
+ #include "document_id_fmt.hxx"
28
+ #include "logger/redaction.hxx"
29
+
30
+ #include <spdlog/fmt/bundled/core.h>
31
+
32
+ namespace couchbase::core::logger
33
+ {
34
+ struct redacted_document_id {
35
+ const document_id& value;
36
+ };
37
+
38
+ /**
39
+ * Tag a document id for logging. It renders as bucket/scope.collection/key, and those parts do not
40
+ * share a redaction category: the names are metadata and only the key is user data. Wrapping the
41
+ * rendered form as a whole would put a bucket name inside a <ud> span, and the span would hash to
42
+ * something that matches no other log line.
43
+ *
44
+ * The plain formatter in document_id_fmt.hxx is left alone on purpose, since it is also used
45
+ * outside logging.
46
+ */
47
+ inline auto
48
+ document(const document_id& value) -> redacted_document_id
49
+ {
50
+ return { value };
51
+ }
52
+ } // namespace couchbase::core::logger
53
+
54
+ template<>
55
+ struct fmt::formatter<couchbase::core::logger::redacted_document_id> {
56
+ template<typename ParseContext>
57
+ constexpr auto parse(ParseContext& ctx)
58
+ {
59
+ return ctx.begin();
60
+ }
61
+
62
+ template<typename FormatContext>
63
+ auto format(const couchbase::core::logger::redacted_document_id& redacted,
64
+ FormatContext& ctx) const
65
+ {
66
+ namespace logger = couchbase::core::logger;
67
+ const auto& id = redacted.value;
68
+ // An id built without a collection carries an empty collection path, and renders with an empty
69
+ // middle component. Keep that shape rather than joining an empty scope and collection.
70
+ if (id.collection_path().empty()) {
71
+ return format_to(
72
+ ctx.out(), "{}//{}", logger::metadata(id.bucket()), logger::user_data(id.key()));
73
+ }
74
+ return format_to(ctx.out(),
75
+ "{}/{}.{}/{}",
76
+ logger::metadata(id.bucket()),
77
+ logger::metadata(id.scope()),
78
+ logger::metadata(id.collection()),
79
+ logger::user_data(id.key()));
80
+ }
81
+ };
@@ -66,12 +66,13 @@ public:
66
66
  std::optional<std::string> last_dispatched_from,
67
67
  std::size_t retry_attempts,
68
68
  std::set<retry_reason> retry_reasons)
69
- : operation_id_{ std::move(operation_id) }
70
- , ec_{ ec }
71
- , last_dispatched_to_{ std::move(last_dispatched_to) }
72
- , last_dispatched_from_{ std::move(last_dispatched_from) }
73
- , retry_attempts_{ retry_attempts }
74
- , retry_reasons_{ std::move(retry_reasons) }
69
+ : base_error_context{ std::move(operation_id),
70
+ ec,
71
+ std::move(last_dispatched_to),
72
+ std::move(last_dispatched_from),
73
+ retry_attempts,
74
+ std::move(retry_reasons),
75
+ couchbase::node_id{} }
75
76
  {
76
77
  }
77
78