couchbase 4.3.1 → 4.4.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 (1091) hide show
  1. package/deps/couchbase-cxx-client/CMakeLists.txt +16 -9
  2. package/deps/couchbase-cxx-client/README.md +39 -44
  3. package/deps/couchbase-cxx-client/cmake/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +3 -4
  4. package/deps/couchbase-cxx-client/cmake/CompilerWarnings.cmake +2 -1
  5. package/deps/couchbase-cxx-client/cmake/Packaging.cmake +41 -0
  6. package/deps/couchbase-cxx-client/cmake/Sanitizers.cmake +1 -0
  7. package/deps/couchbase-cxx-client/cmake/VersionInfo.cmake +5 -5
  8. package/deps/couchbase-cxx-client/cmake/build_version.hxx.in +1 -0
  9. package/deps/couchbase-cxx-client/cmake/couchbase-cxx-client.pc.in +10 -0
  10. package/deps/couchbase-cxx-client/cmake/test_boringssl.cxx +1 -1
  11. package/deps/couchbase-cxx-client/cmake/test_openssl.cxx +1 -1
  12. package/deps/couchbase-cxx-client/core/agent.cxx +353 -304
  13. package/deps/couchbase-cxx-client/core/agent.hxx +94 -76
  14. package/deps/couchbase-cxx-client/core/agent_config.cxx +9 -8
  15. package/deps/couchbase-cxx-client/core/agent_config.hxx +7 -7
  16. package/deps/couchbase-cxx-client/core/agent_group.cxx +132 -120
  17. package/deps/couchbase-cxx-client/core/agent_group.hxx +26 -22
  18. package/deps/couchbase-cxx-client/core/agent_group_config.cxx +8 -7
  19. package/deps/couchbase-cxx-client/core/agent_group_config.hxx +6 -6
  20. package/deps/couchbase-cxx-client/core/agent_unit_test_api.hxx +6 -6
  21. package/deps/couchbase-cxx-client/core/analytics_query_options.cxx +21 -21
  22. package/deps/couchbase-cxx-client/core/analytics_query_options.hxx +19 -18
  23. package/deps/couchbase-cxx-client/core/analytics_scan_consistency.hxx +2 -2
  24. package/deps/couchbase-cxx-client/core/bucket.cxx +848 -776
  25. package/deps/couchbase-cxx-client/core/bucket.hxx +151 -139
  26. package/deps/couchbase-cxx-client/core/capella_ca.hxx +20 -19
  27. package/deps/couchbase-cxx-client/core/cluster.cxx +1240 -927
  28. package/deps/couchbase-cxx-client/core/cluster.hxx +254 -167
  29. package/deps/couchbase-cxx-client/core/cluster_agent.cxx +7 -7
  30. package/deps/couchbase-cxx-client/core/cluster_agent.hxx +4 -4
  31. package/deps/couchbase-cxx-client/core/cluster_agent_config.cxx +8 -7
  32. package/deps/couchbase-cxx-client/core/cluster_agent_config.hxx +6 -6
  33. package/deps/couchbase-cxx-client/core/cluster_options.cxx +17 -17
  34. package/deps/couchbase-cxx-client/core/cluster_options.hxx +50 -47
  35. package/deps/couchbase-cxx-client/core/cluster_state.hxx +3 -3
  36. package/deps/couchbase-cxx-client/core/collection_id_cache_entry.hxx +5 -4
  37. package/deps/couchbase-cxx-client/core/collections_component.cxx +372 -329
  38. package/deps/couchbase-cxx-client/core/collections_component.hxx +17 -13
  39. package/deps/couchbase-cxx-client/core/collections_component_unit_test_api.hxx +6 -6
  40. package/deps/couchbase-cxx-client/core/collections_options.hxx +29 -27
  41. package/deps/couchbase-cxx-client/core/config_listener.hxx +3 -3
  42. package/deps/couchbase-cxx-client/core/config_profile.hxx +3 -3
  43. package/deps/couchbase-cxx-client/core/config_profiles.cxx +31 -31
  44. package/deps/couchbase-cxx-client/core/config_profiles.hxx +19 -19
  45. package/deps/couchbase-cxx-client/core/core_sdk_shim.cxx +2 -1
  46. package/deps/couchbase-cxx-client/core/core_sdk_shim.hxx +2 -2
  47. package/deps/couchbase-cxx-client/core/crud_component.cxx +310 -276
  48. package/deps/couchbase-cxx-client/core/crud_component.hxx +21 -15
  49. package/deps/couchbase-cxx-client/core/crud_options.hxx +361 -354
  50. package/deps/couchbase-cxx-client/core/crypto/cbcrypto.cc +732 -627
  51. package/deps/couchbase-cxx-client/core/crypto/cbcrypto.h +12 -3
  52. package/deps/couchbase-cxx-client/core/design_document_namespace.hxx +2 -2
  53. package/deps/couchbase-cxx-client/core/design_document_namespace_fmt.hxx +18 -18
  54. package/deps/couchbase-cxx-client/core/diagnostics.hxx +44 -44
  55. package/deps/couchbase-cxx-client/core/diagnostics_fmt.hxx +76 -76
  56. package/deps/couchbase-cxx-client/core/diagnostics_json.hxx +61 -60
  57. package/deps/couchbase-cxx-client/core/diagntostics_options.hxx +14 -14
  58. package/deps/couchbase-cxx-client/core/dispatcher.cxx +4 -3
  59. package/deps/couchbase-cxx-client/core/dispatcher.hxx +8 -7
  60. package/deps/couchbase-cxx-client/core/document_id.cxx +37 -34
  61. package/deps/couchbase-cxx-client/core/document_id.hxx +87 -86
  62. package/deps/couchbase-cxx-client/core/document_id_fmt.hxx +10 -10
  63. package/deps/couchbase-cxx-client/core/durability_options.hxx +50 -49
  64. package/deps/couchbase-cxx-client/core/error_context/analytics.hxx +18 -18
  65. package/deps/couchbase-cxx-client/core/error_context/analytics_json.hxx +115 -0
  66. package/deps/couchbase-cxx-client/core/error_context/base_error_context.hxx +184 -0
  67. package/deps/couchbase-cxx-client/core/error_context/http.hxx +14 -14
  68. package/deps/couchbase-cxx-client/core/error_context/http_json.hxx +90 -0
  69. package/deps/couchbase-cxx-client/core/error_context/internal_tof_metadata_json.hxx +36 -0
  70. package/deps/couchbase-cxx-client/core/error_context/key_value.cxx +27 -27
  71. package/deps/couchbase-cxx-client/core/error_context/key_value.hxx +41 -38
  72. package/deps/couchbase-cxx-client/core/error_context/key_value_error_context.hxx +235 -0
  73. package/deps/couchbase-cxx-client/core/error_context/key_value_error_map_attribute.hxx +142 -0
  74. package/deps/couchbase-cxx-client/core/error_context/key_value_error_map_info.hxx +139 -0
  75. package/deps/couchbase-cxx-client/core/error_context/key_value_extended_error_info.hxx +86 -0
  76. package/deps/couchbase-cxx-client/core/error_context/key_value_json.hxx +83 -0
  77. package/deps/couchbase-cxx-client/core/error_context/key_value_status_code.hxx +109 -0
  78. package/deps/couchbase-cxx-client/core/error_context/query.hxx +18 -18
  79. package/deps/couchbase-cxx-client/core/error_context/query_error_context.hxx +150 -0
  80. package/deps/couchbase-cxx-client/core/error_context/query_json.hxx +114 -0
  81. package/deps/couchbase-cxx-client/core/error_context/query_public_json.hxx +84 -0
  82. package/deps/couchbase-cxx-client/core/error_context/search.hxx +17 -17
  83. package/deps/couchbase-cxx-client/core/error_context/search_json.hxx +101 -0
  84. package/deps/couchbase-cxx-client/core/error_context/subdocument_error_context.hxx +147 -0
  85. package/deps/couchbase-cxx-client/core/error_context/subdocument_json.hxx +48 -0
  86. package/deps/couchbase-cxx-client/{couchbase → core/error_context}/transaction_error_context.hxx +22 -22
  87. package/deps/couchbase-cxx-client/core/error_context/transaction_op_error_context.hxx +79 -0
  88. package/deps/couchbase-cxx-client/core/error_context/view.hxx +17 -17
  89. package/deps/couchbase-cxx-client/core/fmt/key_value_error_map_attribute.hxx +100 -0
  90. package/deps/couchbase-cxx-client/{couchbase → core}/fmt/key_value_extended_error_info.hxx +20 -20
  91. package/deps/couchbase-cxx-client/core/fmt/key_value_status_code.hxx +269 -0
  92. package/deps/couchbase-cxx-client/core/free_form_http_request.cxx +26 -26
  93. package/deps/couchbase-cxx-client/core/free_form_http_request.hxx +34 -33
  94. package/deps/couchbase-cxx-client/core/impl/analytics.cxx +111 -131
  95. package/deps/couchbase-cxx-client/core/impl/analytics.hxx +5 -7
  96. package/deps/couchbase-cxx-client/core/impl/analytics_error_category.cxx +29 -28
  97. package/deps/couchbase-cxx-client/core/impl/analytics_index_manager.cxx +615 -516
  98. package/deps/couchbase-cxx-client/core/impl/best_effort_retry_strategy.cxx +53 -50
  99. package/deps/couchbase-cxx-client/core/impl/binary_collection.cxx +346 -285
  100. package/deps/couchbase-cxx-client/core/impl/boolean_field_query.cxx +10 -10
  101. package/deps/couchbase-cxx-client/core/impl/boolean_query.cxx +27 -27
  102. package/deps/couchbase-cxx-client/core/impl/bootstrap_state_listener.hxx +6 -6
  103. package/deps/couchbase-cxx-client/core/impl/bucket.cxx +39 -34
  104. package/deps/couchbase-cxx-client/core/impl/bucket_manager.cxx +354 -313
  105. package/deps/couchbase-cxx-client/core/impl/cluster.cxx +430 -325
  106. package/deps/couchbase-cxx-client/core/impl/collection.cxx +1033 -1187
  107. package/deps/couchbase-cxx-client/core/impl/collection_manager.cxx +201 -170
  108. package/deps/couchbase-cxx-client/core/impl/common_error_category.cxx +58 -55
  109. package/deps/couchbase-cxx-client/core/impl/configuration_profiles_registry.cxx +46 -32
  110. package/deps/couchbase-cxx-client/core/impl/conjunction_query.cxx +17 -17
  111. package/deps/couchbase-cxx-client/core/impl/date_range.cxx +24 -20
  112. package/deps/couchbase-cxx-client/core/impl/date_range_facet.cxx +22 -22
  113. package/deps/couchbase-cxx-client/core/impl/date_range_facet_result.cxx +6 -6
  114. package/deps/couchbase-cxx-client/core/impl/date_range_query.cxx +50 -48
  115. package/deps/couchbase-cxx-client/core/impl/diagnostics.cxx +211 -198
  116. package/deps/couchbase-cxx-client/core/impl/diagnostics.hxx +7 -6
  117. package/deps/couchbase-cxx-client/core/impl/disjunction_query.cxx +18 -17
  118. package/deps/couchbase-cxx-client/core/impl/dns_srv_tracker.cxx +92 -75
  119. package/deps/couchbase-cxx-client/core/impl/dns_srv_tracker.hxx +24 -20
  120. package/deps/couchbase-cxx-client/core/impl/doc_id_query.cxx +9 -9
  121. package/deps/couchbase-cxx-client/core/impl/encoded_search_facet.hxx +2 -2
  122. package/deps/couchbase-cxx-client/core/impl/encoded_search_query.hxx +2 -2
  123. package/deps/couchbase-cxx-client/core/impl/encoded_search_sort.hxx +2 -2
  124. package/deps/couchbase-cxx-client/core/impl/error.cxx +171 -0
  125. package/deps/couchbase-cxx-client/core/impl/error.hxx +64 -0
  126. package/deps/couchbase-cxx-client/core/impl/error_context.cxx +56 -0
  127. package/deps/couchbase-cxx-client/core/impl/expiry.cxx +66 -53
  128. package/deps/couchbase-cxx-client/core/impl/fail_fast_retry_strategy.cxx +5 -4
  129. package/deps/couchbase-cxx-client/core/impl/field_level_encryption_error_category.cxx +30 -28
  130. package/deps/couchbase-cxx-client/core/impl/geo_bounding_box_query.cxx +17 -17
  131. package/deps/couchbase-cxx-client/core/impl/geo_distance_query.cxx +14 -14
  132. package/deps/couchbase-cxx-client/core/impl/geo_polygon_query.cxx +17 -17
  133. package/deps/couchbase-cxx-client/core/impl/get_all_replicas.hxx +26 -22
  134. package/deps/couchbase-cxx-client/core/impl/get_any_replica.hxx +25 -23
  135. package/deps/couchbase-cxx-client/core/impl/get_replica.cxx +18 -15
  136. package/deps/couchbase-cxx-client/core/impl/get_replica.hxx +23 -18
  137. package/deps/couchbase-cxx-client/core/impl/internal_date_range_facet_result.cxx +16 -14
  138. package/deps/couchbase-cxx-client/core/impl/internal_date_range_facet_result.hxx +16 -15
  139. package/deps/couchbase-cxx-client/core/impl/internal_error_context.cxx +79 -0
  140. package/deps/couchbase-cxx-client/core/impl/internal_error_context.hxx +52 -0
  141. package/deps/couchbase-cxx-client/core/impl/internal_numeric_range_facet_result.cxx +18 -15
  142. package/deps/couchbase-cxx-client/core/impl/internal_numeric_range_facet_result.hxx +16 -15
  143. package/deps/couchbase-cxx-client/core/impl/internal_scan_result.hxx +7 -7
  144. package/deps/couchbase-cxx-client/core/impl/internal_search_error_context.cxx +25 -22
  145. package/deps/couchbase-cxx-client/core/impl/internal_search_error_context.hxx +32 -31
  146. package/deps/couchbase-cxx-client/core/impl/internal_search_meta_data.cxx +15 -13
  147. package/deps/couchbase-cxx-client/core/impl/internal_search_meta_data.hxx +10 -9
  148. package/deps/couchbase-cxx-client/core/impl/internal_search_result.cxx +30 -22
  149. package/deps/couchbase-cxx-client/core/impl/internal_search_result.hxx +10 -9
  150. package/deps/couchbase-cxx-client/core/impl/internal_search_row.cxx +10 -10
  151. package/deps/couchbase-cxx-client/core/impl/internal_search_row.hxx +16 -16
  152. package/deps/couchbase-cxx-client/core/impl/internal_search_row_location.hxx +2 -2
  153. package/deps/couchbase-cxx-client/core/impl/internal_search_row_locations.cxx +68 -65
  154. package/deps/couchbase-cxx-client/core/impl/internal_search_row_locations.hxx +16 -13
  155. package/deps/couchbase-cxx-client/core/impl/internal_term_facet_result.cxx +16 -14
  156. package/deps/couchbase-cxx-client/core/impl/internal_term_facet_result.hxx +15 -15
  157. package/deps/couchbase-cxx-client/core/impl/key_value_error_category.cxx +73 -72
  158. package/deps/couchbase-cxx-client/core/impl/key_value_error_context.cxx +65 -65
  159. package/deps/couchbase-cxx-client/core/impl/logger.cxx +91 -0
  160. package/deps/couchbase-cxx-client/core/impl/lookup_in_all_replicas.hxx +32 -29
  161. package/deps/couchbase-cxx-client/core/impl/lookup_in_any_replica.hxx +33 -29
  162. package/deps/couchbase-cxx-client/core/impl/lookup_in_replica.cxx +75 -68
  163. package/deps/couchbase-cxx-client/core/impl/lookup_in_replica.hxx +30 -26
  164. package/deps/couchbase-cxx-client/core/impl/management_error_category.cxx +41 -40
  165. package/deps/couchbase-cxx-client/core/impl/match_all_query.cxx +6 -6
  166. package/deps/couchbase-cxx-client/core/impl/match_none_query.cxx +6 -6
  167. package/deps/couchbase-cxx-client/core/impl/match_phrase_query.cxx +13 -13
  168. package/deps/couchbase-cxx-client/core/impl/match_query.cxx +28 -28
  169. package/deps/couchbase-cxx-client/core/impl/network_error_category.cxx +39 -38
  170. package/deps/couchbase-cxx-client/core/impl/numeric_range.cxx +6 -6
  171. package/deps/couchbase-cxx-client/core/impl/numeric_range_facet.cxx +22 -22
  172. package/deps/couchbase-cxx-client/core/impl/numeric_range_facet_result.cxx +6 -6
  173. package/deps/couchbase-cxx-client/core/impl/numeric_range_query.cxx +22 -22
  174. package/deps/couchbase-cxx-client/core/impl/observe_poll.cxx +294 -277
  175. package/deps/couchbase-cxx-client/core/impl/observe_poll.hxx +1 -1
  176. package/deps/couchbase-cxx-client/core/impl/observe_seqno.cxx +21 -18
  177. package/deps/couchbase-cxx-client/core/impl/observe_seqno.hxx +31 -26
  178. package/deps/couchbase-cxx-client/core/impl/phrase_query.cxx +10 -10
  179. package/deps/couchbase-cxx-client/core/impl/prefix_query.cxx +10 -10
  180. package/deps/couchbase-cxx-client/core/impl/query.cxx +163 -154
  181. package/deps/couchbase-cxx-client/core/impl/query.hxx +6 -7
  182. package/deps/couchbase-cxx-client/core/impl/query_error_category.cxx +22 -21
  183. package/deps/couchbase-cxx-client/core/impl/query_error_context.cxx +45 -45
  184. package/deps/couchbase-cxx-client/core/impl/query_index_manager.cxx +488 -408
  185. package/deps/couchbase-cxx-client/core/impl/query_string_query.cxx +7 -7
  186. package/deps/couchbase-cxx-client/core/impl/regexp_query.cxx +10 -10
  187. package/deps/couchbase-cxx-client/core/impl/replica_utils.cxx +66 -0
  188. package/deps/couchbase-cxx-client/core/impl/replica_utils.hxx +48 -0
  189. package/deps/couchbase-cxx-client/core/impl/retry_action.cxx +3 -3
  190. package/deps/couchbase-cxx-client/core/impl/retry_reason.cxx +129 -56
  191. package/deps/couchbase-cxx-client/core/impl/retry_reason.hxx +28 -0
  192. package/deps/couchbase-cxx-client/core/impl/scan_result.cxx +53 -49
  193. package/deps/couchbase-cxx-client/core/impl/scope.cxx +103 -94
  194. package/deps/couchbase-cxx-client/core/impl/search.cxx +139 -130
  195. package/deps/couchbase-cxx-client/core/impl/search.hxx +4 -4
  196. package/deps/couchbase-cxx-client/core/impl/search_error_category.cxx +18 -17
  197. package/deps/couchbase-cxx-client/core/impl/search_index_manager.cxx +492 -390
  198. package/deps/couchbase-cxx-client/core/impl/search_meta_data.cxx +3 -3
  199. package/deps/couchbase-cxx-client/core/impl/search_request.cxx +78 -78
  200. package/deps/couchbase-cxx-client/core/impl/search_result.cxx +5 -5
  201. package/deps/couchbase-cxx-client/core/impl/search_row.cxx +7 -7
  202. package/deps/couchbase-cxx-client/core/impl/search_row_location.cxx +9 -8
  203. package/deps/couchbase-cxx-client/core/impl/search_row_locations.cxx +8 -7
  204. package/deps/couchbase-cxx-client/core/impl/search_sort_field.cxx +53 -53
  205. package/deps/couchbase-cxx-client/core/impl/search_sort_geo_distance.cxx +49 -48
  206. package/deps/couchbase-cxx-client/core/impl/search_sort_id.cxx +10 -10
  207. package/deps/couchbase-cxx-client/core/impl/search_sort_score.cxx +10 -10
  208. package/deps/couchbase-cxx-client/core/impl/streaming_json_lexer_error_category.cxx +70 -68
  209. package/deps/couchbase-cxx-client/core/impl/subdoc/array_add_unique.cxx +6 -6
  210. package/deps/couchbase-cxx-client/core/impl/subdoc/array_append.cxx +6 -6
  211. package/deps/couchbase-cxx-client/core/impl/subdoc/array_insert.cxx +6 -6
  212. package/deps/couchbase-cxx-client/core/impl/subdoc/array_prepend.cxx +6 -6
  213. package/deps/couchbase-cxx-client/core/impl/subdoc/command.hxx +5 -5
  214. package/deps/couchbase-cxx-client/core/impl/subdoc/command_bundle.hxx +11 -11
  215. package/deps/couchbase-cxx-client/core/impl/subdoc/count.cxx +6 -6
  216. package/deps/couchbase-cxx-client/core/impl/subdoc/counter.cxx +6 -6
  217. package/deps/couchbase-cxx-client/core/impl/subdoc/exists.cxx +6 -6
  218. package/deps/couchbase-cxx-client/core/impl/subdoc/get.cxx +6 -6
  219. package/deps/couchbase-cxx-client/core/impl/subdoc/insert.cxx +6 -6
  220. package/deps/couchbase-cxx-client/core/impl/subdoc/join_values.cxx +25 -25
  221. package/deps/couchbase-cxx-client/core/impl/subdoc/lookup_in_macro.cxx +61 -60
  222. package/deps/couchbase-cxx-client/core/impl/subdoc/lookup_in_specs.cxx +9 -9
  223. package/deps/couchbase-cxx-client/core/impl/subdoc/mutate_in_macro.cxx +48 -39
  224. package/deps/couchbase-cxx-client/core/impl/subdoc/mutate_in_specs.cxx +9 -9
  225. package/deps/couchbase-cxx-client/core/impl/subdoc/opcode.hxx +16 -16
  226. package/deps/couchbase-cxx-client/core/impl/subdoc/path_flags.hxx +40 -17
  227. package/deps/couchbase-cxx-client/core/impl/subdoc/remove.cxx +6 -6
  228. package/deps/couchbase-cxx-client/core/impl/subdoc/replace.cxx +6 -6
  229. package/deps/couchbase-cxx-client/core/impl/subdoc/upsert.cxx +6 -6
  230. package/deps/couchbase-cxx-client/core/impl/term_facet.cxx +8 -8
  231. package/deps/couchbase-cxx-client/core/impl/term_facet_result.cxx +6 -6
  232. package/deps/couchbase-cxx-client/core/impl/term_query.cxx +25 -25
  233. package/deps/couchbase-cxx-client/core/impl/term_range_query.cxx +22 -22
  234. package/deps/couchbase-cxx-client/core/impl/transaction_error_category.cxx +21 -20
  235. package/deps/couchbase-cxx-client/core/impl/transaction_get_result.cxx +41 -30
  236. package/deps/couchbase-cxx-client/core/impl/transaction_op_error_category.cxx +55 -56
  237. package/deps/couchbase-cxx-client/core/impl/vector_query.cxx +15 -10
  238. package/deps/couchbase-cxx-client/core/impl/vector_search.cxx +9 -9
  239. package/deps/couchbase-cxx-client/core/impl/view_error_category.cxx +17 -16
  240. package/deps/couchbase-cxx-client/core/impl/wildcard_query.cxx +10 -10
  241. package/deps/couchbase-cxx-client/core/impl/with_legacy_durability.hxx +30 -29
  242. package/deps/couchbase-cxx-client/core/io/dns_client.cxx +257 -232
  243. package/deps/couchbase-cxx-client/core/io/dns_client.hxx +19 -18
  244. package/deps/couchbase-cxx-client/core/io/dns_codec.hxx +156 -154
  245. package/deps/couchbase-cxx-client/core/io/dns_config.cxx +114 -109
  246. package/deps/couchbase-cxx-client/core/io/dns_config.hxx +15 -13
  247. package/deps/couchbase-cxx-client/core/io/dns_message.hxx +365 -342
  248. package/deps/couchbase-cxx-client/core/io/http_command.hxx +155 -134
  249. package/deps/couchbase-cxx-client/core/io/http_context.hxx +5 -5
  250. package/deps/couchbase-cxx-client/core/io/http_message.hxx +75 -71
  251. package/deps/couchbase-cxx-client/core/io/http_parser.cxx +70 -67
  252. package/deps/couchbase-cxx-client/core/io/http_parser.hxx +18 -18
  253. package/deps/couchbase-cxx-client/core/io/http_session.hxx +620 -520
  254. package/deps/couchbase-cxx-client/core/io/http_session_manager.hxx +406 -315
  255. package/deps/couchbase-cxx-client/core/io/http_traits.hxx +7 -0
  256. package/deps/couchbase-cxx-client/core/io/ip_protocol.hxx +3 -3
  257. package/deps/couchbase-cxx-client/core/io/mcbp_command.hxx +298 -278
  258. package/deps/couchbase-cxx-client/core/io/mcbp_context.hxx +7 -6
  259. package/deps/couchbase-cxx-client/core/io/mcbp_message.cxx +8 -8
  260. package/deps/couchbase-cxx-client/core/io/mcbp_message.hxx +19 -19
  261. package/deps/couchbase-cxx-client/core/io/mcbp_parser.cxx +60 -51
  262. package/deps/couchbase-cxx-client/core/io/mcbp_parser.hxx +21 -17
  263. package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +1769 -1616
  264. package/deps/couchbase-cxx-client/core/io/mcbp_session.hxx +63 -57
  265. package/deps/couchbase-cxx-client/core/io/query_cache.hxx +34 -34
  266. package/deps/couchbase-cxx-client/core/io/retry_context.hxx +45 -45
  267. package/deps/couchbase-cxx-client/core/io/retry_orchestrator.hxx +52 -42
  268. package/deps/couchbase-cxx-client/core/io/streams.hxx +210 -193
  269. package/deps/couchbase-cxx-client/core/json_string.hxx +47 -47
  270. package/deps/couchbase-cxx-client/core/key_value_config.cxx +8 -8
  271. package/deps/couchbase-cxx-client/core/key_value_config.hxx +12 -11
  272. package/deps/couchbase-cxx-client/core/logger/configuration.hxx +35 -35
  273. package/deps/couchbase-cxx-client/core/logger/custom_rotating_file_sink.cxx +73 -72
  274. package/deps/couchbase-cxx-client/core/logger/custom_rotating_file_sink.hxx +20 -18
  275. package/deps/couchbase-cxx-client/core/logger/level.hxx +9 -1
  276. package/deps/couchbase-cxx-client/core/logger/logger.cxx +279 -252
  277. package/deps/couchbase-cxx-client/core/logger/logger.hxx +110 -58
  278. package/deps/couchbase-cxx-client/core/management/analytics_dataset.hxx +4 -4
  279. package/deps/couchbase-cxx-client/core/management/analytics_index.hxx +4 -4
  280. package/deps/couchbase-cxx-client/core/management/analytics_link_azure_blob_external.cxx +35 -33
  281. package/deps/couchbase-cxx-client/core/management/analytics_link_azure_blob_external.hxx +36 -35
  282. package/deps/couchbase-cxx-client/core/management/analytics_link_azure_blob_external_json.hxx +24 -20
  283. package/deps/couchbase-cxx-client/core/management/analytics_link_couchbase_remote.cxx +66 -65
  284. package/deps/couchbase-cxx-client/core/management/analytics_link_couchbase_remote.hxx +77 -70
  285. package/deps/couchbase-cxx-client/core/management/analytics_link_couchbase_remote_json.hxx +38 -32
  286. package/deps/couchbase-cxx-client/core/management/analytics_link_s3_external.cxx +26 -25
  287. package/deps/couchbase-cxx-client/core/management/analytics_link_s3_external.hxx +30 -30
  288. package/deps/couchbase-cxx-client/core/management/analytics_link_s3_external_json.hxx +18 -16
  289. package/deps/couchbase-cxx-client/core/management/bucket_settings.hxx +109 -91
  290. package/deps/couchbase-cxx-client/core/management/bucket_settings_json.hxx +112 -94
  291. package/deps/couchbase-cxx-client/core/management/design_document.hxx +9 -9
  292. package/deps/couchbase-cxx-client/core/management/eventing_function.hxx +124 -121
  293. package/deps/couchbase-cxx-client/core/management/eventing_function_json.hxx +228 -184
  294. package/deps/couchbase-cxx-client/core/management/eventing_status.hxx +41 -41
  295. package/deps/couchbase-cxx-client/core/management/eventing_status_json.hxx +53 -45
  296. package/deps/couchbase-cxx-client/core/management/rbac.hxx +33 -28
  297. package/deps/couchbase-cxx-client/core/management/rbac_fmt.hxx +21 -21
  298. package/deps/couchbase-cxx-client/core/management/rbac_json.hxx +132 -125
  299. package/deps/couchbase-cxx-client/core/management/search_index.cxx +79 -0
  300. package/deps/couchbase-cxx-client/core/management/search_index.hxx +11 -10
  301. package/deps/couchbase-cxx-client/core/management/search_index_json.hxx +27 -26
  302. package/deps/couchbase-cxx-client/core/mcbp/barrier_frame.hxx +4 -3
  303. package/deps/couchbase-cxx-client/core/mcbp/big_endian.cxx +22 -22
  304. package/deps/couchbase-cxx-client/core/mcbp/buffer_writer.cxx +22 -19
  305. package/deps/couchbase-cxx-client/core/mcbp/buffer_writer.hxx +9 -9
  306. package/deps/couchbase-cxx-client/core/mcbp/codec.cxx +419 -397
  307. package/deps/couchbase-cxx-client/core/mcbp/codec.hxx +14 -12
  308. package/deps/couchbase-cxx-client/core/mcbp/command_code.cxx +48 -48
  309. package/deps/couchbase-cxx-client/core/mcbp/completion_token.hxx +33 -33
  310. package/deps/couchbase-cxx-client/core/mcbp/datatype.hxx +3 -3
  311. package/deps/couchbase-cxx-client/core/mcbp/durability_level.hxx +8 -7
  312. package/deps/couchbase-cxx-client/core/mcbp/durability_level_frame.hxx +3 -2
  313. package/deps/couchbase-cxx-client/core/mcbp/durability_timeout_frame.hxx +4 -3
  314. package/deps/couchbase-cxx-client/core/mcbp/open_tracing_frame.hxx +3 -2
  315. package/deps/couchbase-cxx-client/core/mcbp/operation_consumer.cxx +3 -3
  316. package/deps/couchbase-cxx-client/core/mcbp/operation_consumer.hxx +9 -9
  317. package/deps/couchbase-cxx-client/core/mcbp/operation_queue.cxx +76 -70
  318. package/deps/couchbase-cxx-client/core/mcbp/operation_queue.hxx +18 -17
  319. package/deps/couchbase-cxx-client/core/mcbp/packet.cxx +65 -51
  320. package/deps/couchbase-cxx-client/core/mcbp/packet.hxx +25 -25
  321. package/deps/couchbase-cxx-client/core/mcbp/preserve_expiry_frame.hxx +4 -2
  322. package/deps/couchbase-cxx-client/core/mcbp/queue_callback.hxx +3 -2
  323. package/deps/couchbase-cxx-client/core/mcbp/queue_request.cxx +65 -62
  324. package/deps/couchbase-cxx-client/core/mcbp/queue_request.hxx +54 -52
  325. package/deps/couchbase-cxx-client/core/mcbp/queue_request_connection_info.hxx +3 -3
  326. package/deps/couchbase-cxx-client/core/mcbp/queue_response.hxx +7 -7
  327. package/deps/couchbase-cxx-client/core/mcbp/read_units_frame.hxx +3 -2
  328. package/deps/couchbase-cxx-client/core/mcbp/server_duration.cxx +7 -7
  329. package/deps/couchbase-cxx-client/core/mcbp/server_duration_frame.hxx +3 -2
  330. package/deps/couchbase-cxx-client/core/mcbp/stream_id_frame.hxx +3 -2
  331. package/deps/couchbase-cxx-client/core/mcbp/unsupported_frame.hxx +4 -3
  332. package/deps/couchbase-cxx-client/core/mcbp/user_impersonation_frame.hxx +1 -1
  333. package/deps/couchbase-cxx-client/core/mcbp/write_units_frame.hxx +3 -2
  334. package/deps/couchbase-cxx-client/core/meta/features.hxx +58 -0
  335. package/deps/couchbase-cxx-client/core/meta/version.cxx +255 -204
  336. package/deps/couchbase-cxx-client/core/meta/version.hxx +31 -20
  337. package/deps/couchbase-cxx-client/core/metrics/logging_meter.cxx +160 -154
  338. package/deps/couchbase-cxx-client/core/metrics/logging_meter.hxx +16 -15
  339. package/deps/couchbase-cxx-client/core/metrics/logging_meter_options.hxx +1 -1
  340. package/deps/couchbase-cxx-client/core/metrics/noop_meter.hxx +14 -13
  341. package/deps/couchbase-cxx-client/core/mozilla_ca_bundle.hxx +2 -2
  342. package/deps/couchbase-cxx-client/core/n1ql_query_options.cxx +31 -31
  343. package/deps/couchbase-cxx-client/core/n1ql_query_options.hxx +22 -21
  344. package/deps/couchbase-cxx-client/core/operation_map.hxx +3 -3
  345. package/deps/couchbase-cxx-client/core/operations/document_analytics.cxx +187 -176
  346. package/deps/couchbase-cxx-client/core/operations/document_analytics.hxx +79 -71
  347. package/deps/couchbase-cxx-client/core/operations/document_append.cxx +18 -15
  348. package/deps/couchbase-cxx-client/core/operations/document_append.hxx +18 -16
  349. package/deps/couchbase-cxx-client/core/operations/document_decrement.cxx +26 -23
  350. package/deps/couchbase-cxx-client/core/operations/document_decrement.hxx +24 -20
  351. package/deps/couchbase-cxx-client/core/operations/document_exists.cxx +23 -21
  352. package/deps/couchbase-cxx-client/core/operations/document_exists.hxx +25 -23
  353. package/deps/couchbase-cxx-client/core/operations/document_get.cxx +17 -15
  354. package/deps/couchbase-cxx-client/core/operations/document_get.hxx +17 -15
  355. package/deps/couchbase-cxx-client/core/operations/document_get_all_replicas.hxx +121 -92
  356. package/deps/couchbase-cxx-client/core/operations/document_get_and_lock.cxx +19 -16
  357. package/deps/couchbase-cxx-client/core/operations/document_get_and_lock.hxx +21 -17
  358. package/deps/couchbase-cxx-client/core/operations/document_get_and_touch.cxx +19 -16
  359. package/deps/couchbase-cxx-client/core/operations/document_get_and_touch.hxx +22 -18
  360. package/deps/couchbase-cxx-client/core/operations/document_get_any_replica.hxx +111 -82
  361. package/deps/couchbase-cxx-client/core/operations/document_get_projected.cxx +193 -184
  362. package/deps/couchbase-cxx-client/core/operations/document_get_projected.hxx +25 -21
  363. package/deps/couchbase-cxx-client/core/operations/document_increment.cxx +26 -23
  364. package/deps/couchbase-cxx-client/core/operations/document_increment.hxx +24 -20
  365. package/deps/couchbase-cxx-client/core/operations/document_insert.cxx +23 -20
  366. package/deps/couchbase-cxx-client/core/operations/document_insert.hxx +20 -18
  367. package/deps/couchbase-cxx-client/core/operations/document_lookup_in.cxx +80 -67
  368. package/deps/couchbase-cxx-client/core/operations/document_lookup_in.hxx +31 -27
  369. package/deps/couchbase-cxx-client/core/operations/document_lookup_in_all_replicas.hxx +187 -149
  370. package/deps/couchbase-cxx-client/core/operations/document_lookup_in_any_replica.hxx +190 -145
  371. package/deps/couchbase-cxx-client/core/operations/document_mutate_in.cxx +98 -80
  372. package/deps/couchbase-cxx-client/core/operations/document_mutate_in.hxx +38 -33
  373. package/deps/couchbase-cxx-client/core/operations/document_prepend.cxx +18 -15
  374. package/deps/couchbase-cxx-client/core/operations/document_prepend.hxx +18 -16
  375. package/deps/couchbase-cxx-client/core/operations/document_query.cxx +367 -356
  376. package/deps/couchbase-cxx-client/core/operations/document_query.hxx +83 -79
  377. package/deps/couchbase-cxx-client/core/operations/document_remove.cxx +18 -15
  378. package/deps/couchbase-cxx-client/core/operations/document_remove.hxx +18 -16
  379. package/deps/couchbase-cxx-client/core/operations/document_replace.cxx +27 -24
  380. package/deps/couchbase-cxx-client/core/operations/document_replace.hxx +22 -20
  381. package/deps/couchbase-cxx-client/core/operations/document_search.cxx +322 -308
  382. package/deps/couchbase-cxx-client/core/operations/document_search.hxx +125 -121
  383. package/deps/couchbase-cxx-client/core/operations/document_touch.cxx +16 -14
  384. package/deps/couchbase-cxx-client/core/operations/document_touch.hxx +19 -17
  385. package/deps/couchbase-cxx-client/core/operations/document_unlock.cxx +16 -14
  386. package/deps/couchbase-cxx-client/core/operations/document_unlock.hxx +19 -17
  387. package/deps/couchbase-cxx-client/core/operations/document_upsert.cxx +26 -23
  388. package/deps/couchbase-cxx-client/core/operations/document_upsert.hxx +21 -19
  389. package/deps/couchbase-cxx-client/core/operations/document_view.cxx +169 -159
  390. package/deps/couchbase-cxx-client/core/operations/document_view.hxx +68 -65
  391. package/deps/couchbase-cxx-client/core/operations/http_noop.cxx +38 -35
  392. package/deps/couchbase-cxx-client/core/operations/http_noop.hxx +12 -10
  393. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_create.cxx +58 -56
  394. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_create.hxx +20 -17
  395. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_drop.cxx +49 -44
  396. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_drop.hxx +18 -15
  397. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_get_all.cxx +46 -43
  398. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_get_all.hxx +16 -13
  399. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_create.cxx +48 -43
  400. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_create.hxx +17 -14
  401. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_drop.cxx +48 -43
  402. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_drop.hxx +17 -14
  403. package/deps/couchbase-cxx-client/core/operations/management/analytics_get_pending_mutations.cxx +38 -35
  404. package/deps/couchbase-cxx-client/core/operations/management/analytics_get_pending_mutations.hxx +16 -14
  405. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_create.cxx +68 -66
  406. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_create.hxx +20 -17
  407. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_drop.cxx +56 -51
  408. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_drop.hxx +19 -16
  409. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_get_all.cxx +44 -42
  410. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_get_all.hxx +16 -13
  411. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_connect.cxx +49 -43
  412. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_connect.hxx +23 -20
  413. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_create.cxx +52 -51
  414. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_create.hxx +33 -30
  415. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_disconnect.cxx +46 -42
  416. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_disconnect.hxx +22 -19
  417. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_drop.cxx +70 -67
  418. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_drop.hxx +22 -19
  419. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_get_all.cxx +92 -85
  420. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_get_all.hxx +27 -24
  421. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_replace.cxx +52 -51
  422. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_replace.hxx +33 -30
  423. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_utils.hxx +6 -4
  424. package/deps/couchbase-cxx-client/core/operations/management/analytics_problem.hxx +2 -2
  425. package/deps/couchbase-cxx-client/core/operations/management/bucket_create.cxx +158 -149
  426. package/deps/couchbase-cxx-client/core/operations/management/bucket_create.hxx +14 -12
  427. package/deps/couchbase-cxx-client/core/operations/management/bucket_describe.cxx +118 -42
  428. package/deps/couchbase-cxx-client/core/operations/management/bucket_describe.hxx +47 -22
  429. package/deps/couchbase-cxx-client/core/operations/management/bucket_drop.cxx +19 -18
  430. package/deps/couchbase-cxx-client/core/operations/management/bucket_drop.hxx +13 -11
  431. package/deps/couchbase-cxx-client/core/operations/management/bucket_flush.cxx +25 -24
  432. package/deps/couchbase-cxx-client/core/operations/management/bucket_flush.hxx +13 -11
  433. package/deps/couchbase-cxx-client/core/operations/management/bucket_get.cxx +24 -22
  434. package/deps/couchbase-cxx-client/core/operations/management/bucket_get.hxx +14 -12
  435. package/deps/couchbase-cxx-client/core/operations/management/bucket_get_all.cxx +25 -23
  436. package/deps/couchbase-cxx-client/core/operations/management/bucket_get_all.hxx +13 -11
  437. package/deps/couchbase-cxx-client/core/operations/management/bucket_update.cxx +112 -107
  438. package/deps/couchbase-cxx-client/core/operations/management/bucket_update.hxx +15 -13
  439. package/deps/couchbase-cxx-client/core/operations/management/change_password.cxx +22 -20
  440. package/deps/couchbase-cxx-client/core/operations/management/change_password.hxx +13 -11
  441. package/deps/couchbase-cxx-client/core/operations/management/cluster_describe.cxx +52 -50
  442. package/deps/couchbase-cxx-client/core/operations/management/cluster_describe.hxx +31 -29
  443. package/deps/couchbase-cxx-client/core/operations/management/cluster_developer_preview_enable.cxx +14 -12
  444. package/deps/couchbase-cxx-client/core/operations/management/cluster_developer_preview_enable.hxx +13 -11
  445. package/deps/couchbase-cxx-client/core/operations/management/collection_create.cxx +48 -46
  446. package/deps/couchbase-cxx-client/core/operations/management/collection_create.hxx +19 -16
  447. package/deps/couchbase-cxx-client/core/operations/management/collection_drop.cxx +37 -35
  448. package/deps/couchbase-cxx-client/core/operations/management/collection_drop.hxx +16 -14
  449. package/deps/couchbase-cxx-client/core/operations/management/collection_update.cxx +49 -47
  450. package/deps/couchbase-cxx-client/core/operations/management/collection_update.hxx +19 -16
  451. package/deps/couchbase-cxx-client/core/operations/management/collections_manifest_get.cxx +11 -9
  452. package/deps/couchbase-cxx-client/core/operations/management/collections_manifest_get.hxx +17 -13
  453. package/deps/couchbase-cxx-client/core/operations/management/error_utils.cxx +210 -198
  454. package/deps/couchbase-cxx-client/core/operations/management/error_utils.hxx +3 -1
  455. package/deps/couchbase-cxx-client/core/operations/management/eventing_deploy_function.cxx +30 -28
  456. package/deps/couchbase-cxx-client/core/operations/management/eventing_deploy_function.hxx +17 -14
  457. package/deps/couchbase-cxx-client/core/operations/management/eventing_drop_function.cxx +31 -29
  458. package/deps/couchbase-cxx-client/core/operations/management/eventing_drop_function.hxx +17 -14
  459. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_all_functions.cxx +49 -43
  460. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_all_functions.hxx +17 -14
  461. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_function.cxx +29 -27
  462. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_function.hxx +18 -15
  463. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_status.cxx +45 -39
  464. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_status.hxx +17 -14
  465. package/deps/couchbase-cxx-client/core/operations/management/eventing_pause_function.cxx +30 -28
  466. package/deps/couchbase-cxx-client/core/operations/management/eventing_pause_function.hxx +17 -14
  467. package/deps/couchbase-cxx-client/core/operations/management/eventing_problem.hxx +3 -3
  468. package/deps/couchbase-cxx-client/core/operations/management/eventing_resume_function.cxx +30 -28
  469. package/deps/couchbase-cxx-client/core/operations/management/eventing_resume_function.hxx +17 -14
  470. package/deps/couchbase-cxx-client/core/operations/management/eventing_undeploy_function.cxx +30 -28
  471. package/deps/couchbase-cxx-client/core/operations/management/eventing_undeploy_function.hxx +17 -14
  472. package/deps/couchbase-cxx-client/core/operations/management/eventing_upsert_function.cxx +328 -318
  473. package/deps/couchbase-cxx-client/core/operations/management/eventing_upsert_function.hxx +17 -14
  474. package/deps/couchbase-cxx-client/core/operations/management/freeform.cxx +23 -22
  475. package/deps/couchbase-cxx-client/core/operations/management/freeform.hxx +19 -17
  476. package/deps/couchbase-cxx-client/core/operations/management/group_drop.cxx +18 -17
  477. package/deps/couchbase-cxx-client/core/operations/management/group_drop.hxx +13 -11
  478. package/deps/couchbase-cxx-client/core/operations/management/group_get.cxx +25 -23
  479. package/deps/couchbase-cxx-client/core/operations/management/group_get.hxx +14 -12
  480. package/deps/couchbase-cxx-client/core/operations/management/group_get_all.cxx +23 -22
  481. package/deps/couchbase-cxx-client/core/operations/management/group_get_all.hxx +13 -11
  482. package/deps/couchbase-cxx-client/core/operations/management/group_upsert.cxx +58 -55
  483. package/deps/couchbase-cxx-client/core/operations/management/group_upsert.hxx +14 -12
  484. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.cxx +53 -48
  485. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.hxx +25 -22
  486. package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +75 -67
  487. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.cxx +128 -122
  488. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.hxx +31 -28
  489. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.cxx +95 -93
  490. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.hxx +26 -24
  491. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.cxx +97 -93
  492. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +24 -21
  493. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.cxx +66 -62
  494. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.hxx +24 -22
  495. package/deps/couchbase-cxx-client/core/operations/management/role_get_all.cxx +24 -22
  496. package/deps/couchbase-cxx-client/core/operations/management/role_get_all.hxx +13 -11
  497. package/deps/couchbase-cxx-client/core/operations/management/scope_create.cxx +38 -36
  498. package/deps/couchbase-cxx-client/core/operations/management/scope_create.hxx +15 -13
  499. package/deps/couchbase-cxx-client/core/operations/management/scope_drop.cxx +33 -32
  500. package/deps/couchbase-cxx-client/core/operations/management/scope_drop.hxx +15 -13
  501. package/deps/couchbase-cxx-client/core/operations/management/scope_get_all.cxx +27 -25
  502. package/deps/couchbase-cxx-client/core/operations/management/scope_get_all.hxx +14 -12
  503. package/deps/couchbase-cxx-client/core/operations/management/search_get_stats.cxx +12 -10
  504. package/deps/couchbase-cxx-client/core/operations/management/search_get_stats.hxx +13 -11
  505. package/deps/couchbase-cxx-client/core/operations/management/search_index_analyze_document.cxx +72 -67
  506. package/deps/couchbase-cxx-client/core/operations/management/search_index_analyze_document.hxx +20 -18
  507. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_ingest.cxx +62 -59
  508. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_ingest.hxx +19 -16
  509. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_plan_freeze.cxx +62 -59
  510. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_plan_freeze.hxx +19 -17
  511. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_query.cxx +62 -59
  512. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_query.hxx +19 -16
  513. package/deps/couchbase-cxx-client/core/operations/management/search_index_drop.cxx +58 -55
  514. package/deps/couchbase-cxx-client/core/operations/management/search_index_drop.hxx +18 -15
  515. package/deps/couchbase-cxx-client/core/operations/management/search_index_get.cxx +59 -56
  516. package/deps/couchbase-cxx-client/core/operations/management/search_index_get.hxx +18 -16
  517. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_all.cxx +51 -46
  518. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_all.hxx +18 -15
  519. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_documents_count.cxx +66 -61
  520. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_documents_count.hxx +19 -17
  521. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_stats.cxx +38 -36
  522. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_stats.hxx +17 -14
  523. package/deps/couchbase-cxx-client/core/operations/management/search_index_upsert.cxx +98 -95
  524. package/deps/couchbase-cxx-client/core/operations/management/search_index_upsert.hxx +20 -17
  525. package/deps/couchbase-cxx-client/core/operations/management/user_drop.cxx +18 -17
  526. package/deps/couchbase-cxx-client/core/operations/management/user_drop.hxx +16 -12
  527. package/deps/couchbase-cxx-client/core/operations/management/user_get.cxx +25 -23
  528. package/deps/couchbase-cxx-client/core/operations/management/user_get.hxx +17 -13
  529. package/deps/couchbase-cxx-client/core/operations/management/user_get_all.cxx +24 -22
  530. package/deps/couchbase-cxx-client/core/operations/management/user_get_all.hxx +16 -12
  531. package/deps/couchbase-cxx-client/core/operations/management/user_upsert.cxx +63 -60
  532. package/deps/couchbase-cxx-client/core/operations/management/user_upsert.hxx +17 -13
  533. package/deps/couchbase-cxx-client/core/operations/management/view_index_drop.cxx +16 -12
  534. package/deps/couchbase-cxx-client/core/operations/management/view_index_drop.hxx +15 -13
  535. package/deps/couchbase-cxx-client/core/operations/management/view_index_get.cxx +40 -35
  536. package/deps/couchbase-cxx-client/core/operations/management/view_index_get.hxx +16 -14
  537. package/deps/couchbase-cxx-client/core/operations/management/view_index_get_all.cxx +73 -69
  538. package/deps/couchbase-cxx-client/core/operations/management/view_index_get_all.hxx +16 -13
  539. package/deps/couchbase-cxx-client/core/operations/management/view_index_upsert.cxx +39 -35
  540. package/deps/couchbase-cxx-client/core/operations/management/view_index_upsert.hxx +15 -12
  541. package/deps/couchbase-cxx-client/core/origin.cxx +259 -249
  542. package/deps/couchbase-cxx-client/core/origin.hxx +55 -49
  543. package/deps/couchbase-cxx-client/core/pending_operation.hxx +3 -3
  544. package/deps/couchbase-cxx-client/core/ping_collector.hxx +3 -3
  545. package/deps/couchbase-cxx-client/core/ping_options.hxx +30 -30
  546. package/deps/couchbase-cxx-client/core/ping_reporter.hxx +3 -3
  547. package/deps/couchbase-cxx-client/core/platform/backtrace.c +100 -91
  548. package/deps/couchbase-cxx-client/core/platform/base64.cc +135 -134
  549. package/deps/couchbase-cxx-client/core/platform/dirutils.cc +66 -63
  550. package/deps/couchbase-cxx-client/core/platform/random.cc +43 -42
  551. package/deps/couchbase-cxx-client/core/platform/random.h +4 -4
  552. package/deps/couchbase-cxx-client/core/platform/string_hex.cc +42 -40
  553. package/deps/couchbase-cxx-client/core/platform/terminate_handler.cc +54 -52
  554. package/deps/couchbase-cxx-client/core/platform/uuid.cc +47 -47
  555. package/deps/couchbase-cxx-client/core/protocol/client_opcode.hxx +336 -327
  556. package/deps/couchbase-cxx-client/core/protocol/client_opcode_fmt.hxx +291 -291
  557. package/deps/couchbase-cxx-client/core/protocol/client_request.cxx +13 -10
  558. package/deps/couchbase-cxx-client/core/protocol/client_request.hxx +133 -130
  559. package/deps/couchbase-cxx-client/core/protocol/client_response.cxx +40 -40
  560. package/deps/couchbase-cxx-client/core/protocol/client_response.hxx +153 -150
  561. package/deps/couchbase-cxx-client/core/protocol/cmd_append.cxx +24 -23
  562. package/deps/couchbase-cxx-client/core/protocol/cmd_append.hxx +65 -65
  563. package/deps/couchbase-cxx-client/core/protocol/cmd_cluster_map_change_notification.cxx +25 -21
  564. package/deps/couchbase-cxx-client/core/protocol/cmd_cluster_map_change_notification.hxx +33 -25
  565. package/deps/couchbase-cxx-client/core/protocol/cmd_decrement.cxx +38 -38
  566. package/deps/couchbase-cxx-client/core/protocol/cmd_decrement.hxx +87 -87
  567. package/deps/couchbase-cxx-client/core/protocol/cmd_get.cxx +17 -17
  568. package/deps/couchbase-cxx-client/core/protocol/cmd_get.hxx +59 -59
  569. package/deps/couchbase-cxx-client/core/protocol/cmd_get_and_lock.cxx +20 -20
  570. package/deps/couchbase-cxx-client/core/protocol/cmd_get_and_lock.hxx +72 -72
  571. package/deps/couchbase-cxx-client/core/protocol/cmd_get_and_touch.cxx +20 -20
  572. package/deps/couchbase-cxx-client/core/protocol/cmd_get_and_touch.hxx +72 -72
  573. package/deps/couchbase-cxx-client/core/protocol/cmd_get_cluster_config.cxx +46 -39
  574. package/deps/couchbase-cxx-client/core/protocol/cmd_get_cluster_config.hxx +57 -49
  575. package/deps/couchbase-cxx-client/core/protocol/cmd_get_collection_id.cxx +17 -17
  576. package/deps/couchbase-cxx-client/core/protocol/cmd_get_collection_id.hxx +59 -59
  577. package/deps/couchbase-cxx-client/core/protocol/cmd_get_collections_manifest.cxx +16 -14
  578. package/deps/couchbase-cxx-client/core/protocol/cmd_get_collections_manifest.hxx +39 -39
  579. package/deps/couchbase-cxx-client/core/protocol/cmd_get_error_map.cxx +18 -17
  580. package/deps/couchbase-cxx-client/core/protocol/cmd_get_error_map.hxx +62 -62
  581. package/deps/couchbase-cxx-client/core/protocol/cmd_get_meta.cxx +24 -23
  582. package/deps/couchbase-cxx-client/core/protocol/cmd_get_meta.hxx +81 -79
  583. package/deps/couchbase-cxx-client/core/protocol/cmd_get_replica.cxx +23 -23
  584. package/deps/couchbase-cxx-client/core/protocol/cmd_get_replica.hxx +44 -44
  585. package/deps/couchbase-cxx-client/core/protocol/cmd_hello.cxx +28 -27
  586. package/deps/couchbase-cxx-client/core/protocol/cmd_hello.hxx +106 -105
  587. package/deps/couchbase-cxx-client/core/protocol/cmd_increment.cxx +38 -38
  588. package/deps/couchbase-cxx-client/core/protocol/cmd_increment.hxx +87 -87
  589. package/deps/couchbase-cxx-client/core/protocol/cmd_info.hxx +3 -3
  590. package/deps/couchbase-cxx-client/core/protocol/cmd_insert.cxx +27 -27
  591. package/deps/couchbase-cxx-client/core/protocol/cmd_insert.hxx +81 -81
  592. package/deps/couchbase-cxx-client/core/protocol/cmd_lookup_in.cxx +54 -51
  593. package/deps/couchbase-cxx-client/core/protocol/cmd_lookup_in.hxx +90 -90
  594. package/deps/couchbase-cxx-client/core/protocol/cmd_lookup_in_replica.cxx +54 -51
  595. package/deps/couchbase-cxx-client/core/protocol/cmd_lookup_in_replica.hxx +88 -88
  596. package/deps/couchbase-cxx-client/core/protocol/cmd_mutate_in.cxx +105 -97
  597. package/deps/couchbase-cxx-client/core/protocol/cmd_mutate_in.hxx +161 -153
  598. package/deps/couchbase-cxx-client/core/protocol/cmd_noop.cxx +4 -4
  599. package/deps/couchbase-cxx-client/core/protocol/cmd_noop.hxx +32 -32
  600. package/deps/couchbase-cxx-client/core/protocol/cmd_observe_seqno.cxx +36 -34
  601. package/deps/couchbase-cxx-client/core/protocol/cmd_observe_seqno.hxx +89 -89
  602. package/deps/couchbase-cxx-client/core/protocol/cmd_prepend.cxx +22 -22
  603. package/deps/couchbase-cxx-client/core/protocol/cmd_prepend.hxx +63 -63
  604. package/deps/couchbase-cxx-client/core/protocol/cmd_remove.cxx +23 -23
  605. package/deps/couchbase-cxx-client/core/protocol/cmd_remove.hxx +54 -54
  606. package/deps/couchbase-cxx-client/core/protocol/cmd_replace.cxx +28 -28
  607. package/deps/couchbase-cxx-client/core/protocol/cmd_replace.hxx +88 -88
  608. package/deps/couchbase-cxx-client/core/protocol/cmd_sasl_auth.cxx +17 -15
  609. package/deps/couchbase-cxx-client/core/protocol/cmd_sasl_auth.hxx +56 -56
  610. package/deps/couchbase-cxx-client/core/protocol/cmd_sasl_list_mechs.cxx +24 -19
  611. package/deps/couchbase-cxx-client/core/protocol/cmd_sasl_list_mechs.hxx +39 -39
  612. package/deps/couchbase-cxx-client/core/protocol/cmd_sasl_step.cxx +17 -15
  613. package/deps/couchbase-cxx-client/core/protocol/cmd_sasl_step.hxx +56 -56
  614. package/deps/couchbase-cxx-client/core/protocol/cmd_select_bucket.cxx +6 -6
  615. package/deps/couchbase-cxx-client/core/protocol/cmd_select_bucket.hxx +36 -36
  616. package/deps/couchbase-cxx-client/core/protocol/cmd_touch.cxx +8 -8
  617. package/deps/couchbase-cxx-client/core/protocol/cmd_touch.hxx +38 -38
  618. package/deps/couchbase-cxx-client/core/protocol/cmd_unlock.cxx +5 -5
  619. package/deps/couchbase-cxx-client/core/protocol/cmd_unlock.hxx +36 -36
  620. package/deps/couchbase-cxx-client/core/protocol/cmd_upsert.cxx +28 -28
  621. package/deps/couchbase-cxx-client/core/protocol/cmd_upsert.hxx +83 -83
  622. package/deps/couchbase-cxx-client/core/protocol/datatype.hxx +19 -18
  623. package/deps/couchbase-cxx-client/core/protocol/frame_info_id.hxx +108 -103
  624. package/deps/couchbase-cxx-client/core/protocol/frame_info_id_fmt.hxx +45 -45
  625. package/deps/couchbase-cxx-client/core/protocol/frame_info_utils.cxx +24 -21
  626. package/deps/couchbase-cxx-client/core/protocol/frame_info_utils.hxx +3 -1
  627. package/deps/couchbase-cxx-client/core/protocol/hello_feature.hxx +211 -175
  628. package/deps/couchbase-cxx-client/core/protocol/hello_feature_fmt.hxx +93 -90
  629. package/deps/couchbase-cxx-client/core/protocol/magic.hxx +24 -24
  630. package/deps/couchbase-cxx-client/core/protocol/magic_fmt.hxx +30 -30
  631. package/deps/couchbase-cxx-client/core/protocol/server_opcode.hxx +11 -11
  632. package/deps/couchbase-cxx-client/core/protocol/server_opcode_fmt.hxx +18 -18
  633. package/deps/couchbase-cxx-client/core/protocol/server_request.hxx +90 -86
  634. package/deps/couchbase-cxx-client/core/protocol/status.cxx +138 -138
  635. package/deps/couchbase-cxx-client/core/protocol/status.hxx +86 -86
  636. package/deps/couchbase-cxx-client/core/query_context.hxx +44 -43
  637. package/deps/couchbase-cxx-client/core/range_scan_load_balancer.cxx +51 -50
  638. package/deps/couchbase-cxx-client/core/range_scan_load_balancer.hxx +26 -25
  639. package/deps/couchbase-cxx-client/core/range_scan_options.cxx +2 -2
  640. package/deps/couchbase-cxx-client/core/range_scan_options.hxx +62 -59
  641. package/deps/couchbase-cxx-client/core/range_scan_orchestrator.cxx +515 -470
  642. package/deps/couchbase-cxx-client/core/range_scan_orchestrator.hxx +23 -18
  643. package/deps/couchbase-cxx-client/core/range_scan_orchestrator_options.hxx +10 -10
  644. package/deps/couchbase-cxx-client/core/resource_units.hxx +2 -2
  645. package/deps/couchbase-cxx-client/core/response_handler.hxx +8 -8
  646. package/deps/couchbase-cxx-client/core/retry_orchestrator.cxx +27 -19
  647. package/deps/couchbase-cxx-client/core/retry_orchestrator.hxx +3 -2
  648. package/deps/couchbase-cxx-client/core/sasl/client.cc +22 -18
  649. package/deps/couchbase-cxx-client/core/sasl/client.h +66 -62
  650. package/deps/couchbase-cxx-client/core/sasl/context.cc +4 -4
  651. package/deps/couchbase-cxx-client/core/sasl/context.h +19 -19
  652. package/deps/couchbase-cxx-client/core/sasl/error.h +12 -1
  653. package/deps/couchbase-cxx-client/core/sasl/error_fmt.h +42 -42
  654. package/deps/couchbase-cxx-client/core/sasl/mechanism.cc +13 -10
  655. package/deps/couchbase-cxx-client/core/sasl/mechanism.h +8 -3
  656. package/deps/couchbase-cxx-client/core/sasl/plain/plain.cc +8 -8
  657. package/deps/couchbase-cxx-client/core/sasl/plain/plain.h +25 -24
  658. package/deps/couchbase-cxx-client/core/sasl/scram-sha/scram-sha.cc +225 -218
  659. package/deps/couchbase-cxx-client/core/sasl/scram-sha/scram-sha.h +133 -115
  660. package/deps/couchbase-cxx-client/core/sasl/scram-sha/stringutils.cc +20 -20
  661. package/deps/couchbase-cxx-client/core/scan_result.cxx +38 -38
  662. package/deps/couchbase-cxx-client/core/scan_result.hxx +16 -16
  663. package/deps/couchbase-cxx-client/core/search_highlight_style.hxx +4 -1
  664. package/deps/couchbase-cxx-client/core/search_query_options.cxx +21 -21
  665. package/deps/couchbase-cxx-client/core/search_query_options.hxx +19 -18
  666. package/deps/couchbase-cxx-client/core/search_scan_consistency.hxx +3 -1
  667. package/deps/couchbase-cxx-client/core/seed_config.cxx +10 -7
  668. package/deps/couchbase-cxx-client/core/seed_config.hxx +8 -8
  669. package/deps/couchbase-cxx-client/core/service_type.hxx +7 -7
  670. package/deps/couchbase-cxx-client/core/service_type_fmt.hxx +33 -33
  671. package/deps/couchbase-cxx-client/core/stats_options.hxx +13 -13
  672. package/deps/couchbase-cxx-client/core/subdoc_options.hxx +60 -58
  673. package/deps/couchbase-cxx-client/core/tls_verify_mode.hxx +2 -2
  674. package/deps/couchbase-cxx-client/core/topology/capabilities.hxx +83 -83
  675. package/deps/couchbase-cxx-client/core/topology/capabilities_fmt.hxx +111 -111
  676. package/deps/couchbase-cxx-client/core/topology/collections_manifest.hxx +14 -14
  677. package/deps/couchbase-cxx-client/core/topology/collections_manifest_fmt.hxx +23 -21
  678. package/deps/couchbase-cxx-client/core/topology/collections_manifest_json.hxx +26 -25
  679. package/deps/couchbase-cxx-client/core/topology/configuration.cxx +213 -192
  680. package/deps/couchbase-cxx-client/core/topology/configuration.hxx +104 -91
  681. package/deps/couchbase-cxx-client/core/topology/configuration_fmt.hxx +131 -128
  682. package/deps/couchbase-cxx-client/core/topology/configuration_json.hxx +276 -242
  683. package/deps/couchbase-cxx-client/core/topology/error_map.hxx +5 -5
  684. package/deps/couchbase-cxx-client/core/topology/error_map_json.hxx +65 -60
  685. package/deps/couchbase-cxx-client/core/tracing/constants.hxx +153 -153
  686. package/deps/couchbase-cxx-client/core/tracing/noop_tracer.hxx +29 -28
  687. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_options.hxx +30 -30
  688. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.cxx +354 -344
  689. package/deps/couchbase-cxx-client/core/tracing/threshold_logging_tracer.hxx +12 -12
  690. package/deps/couchbase-cxx-client/core/transactions/active_transaction_record.cxx +153 -33
  691. package/deps/couchbase-cxx-client/core/transactions/active_transaction_record.hxx +30 -118
  692. package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.cxx +8 -2
  693. package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.hxx +163 -127
  694. package/deps/couchbase-cxx-client/core/transactions/atr_cleanup_entry.cxx +358 -334
  695. package/deps/couchbase-cxx-client/core/transactions/atr_ids.cxx +270 -185
  696. package/deps/couchbase-cxx-client/core/transactions/atr_ids.hxx +4 -4
  697. package/deps/couchbase-cxx-client/core/transactions/attempt_context.cxx +9 -5
  698. package/deps/couchbase-cxx-client/core/transactions/attempt_context.hxx +194 -154
  699. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +3278 -2159
  700. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +446 -573
  701. package/deps/couchbase-cxx-client/core/transactions/attempt_context_testing_hooks.cxx +15 -10
  702. package/deps/couchbase-cxx-client/core/transactions/attempt_context_testing_hooks.hxx +58 -49
  703. package/deps/couchbase-cxx-client/core/transactions/attempt_state.hxx +72 -72
  704. package/deps/couchbase-cxx-client/core/transactions/binary.cxx +3 -3
  705. package/deps/couchbase-cxx-client/core/transactions/cleanup_testing_hooks.cxx +2 -2
  706. package/deps/couchbase-cxx-client/core/transactions/cleanup_testing_hooks.hxx +28 -24
  707. package/deps/couchbase-cxx-client/core/transactions/document_metadata.hxx +68 -68
  708. package/deps/couchbase-cxx-client/core/transactions/durability_level.hxx +53 -53
  709. package/deps/couchbase-cxx-client/core/transactions/error_class.hxx +12 -12
  710. package/deps/couchbase-cxx-client/core/transactions/error_list.hxx +22 -22
  711. package/deps/couchbase-cxx-client/core/transactions/exceptions.cxx +167 -114
  712. package/deps/couchbase-cxx-client/core/transactions/exceptions.hxx +170 -139
  713. package/deps/couchbase-cxx-client/core/transactions/exceptions_fmt.hxx +105 -0
  714. package/deps/couchbase-cxx-client/core/transactions/forward_compat.cxx +220 -0
  715. package/deps/couchbase-cxx-client/core/transactions/forward_compat.hxx +63 -207
  716. package/deps/couchbase-cxx-client/core/transactions/internal/atr_cleanup_entry.hxx +110 -102
  717. package/deps/couchbase-cxx-client/core/transactions/internal/atr_entry.hxx +144 -144
  718. package/deps/couchbase-cxx-client/core/transactions/internal/client_record.hxx +53 -50
  719. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.cxx +5 -5
  720. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record.hxx +38 -35
  721. package/deps/couchbase-cxx-client/core/transactions/internal/doc_record_fmt.hxx +17 -16
  722. package/deps/couchbase-cxx-client/core/transactions/internal/exceptions_internal.hxx +238 -281
  723. package/deps/couchbase-cxx-client/core/transactions/internal/exceptions_internal_fmt.hxx +103 -0
  724. package/deps/couchbase-cxx-client/core/transactions/internal/logging.hxx +52 -29
  725. package/deps/couchbase-cxx-client/core/transactions/internal/transaction_attempt.hxx +3 -3
  726. package/deps/couchbase-cxx-client/core/transactions/internal/transaction_context.hxx +136 -120
  727. package/deps/couchbase-cxx-client/core/transactions/internal/transaction_fields.hxx +2 -1
  728. package/deps/couchbase-cxx-client/core/transactions/internal/transactions_cleanup.hxx +127 -122
  729. package/deps/couchbase-cxx-client/core/transactions/internal/utils.hxx +244 -219
  730. package/deps/couchbase-cxx-client/core/transactions/result.cxx +41 -40
  731. package/deps/couchbase-cxx-client/core/transactions/result.hxx +143 -141
  732. package/deps/couchbase-cxx-client/core/transactions/result_fmt.hxx +21 -20
  733. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +759 -627
  734. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.hxx +175 -156
  735. package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +231 -179
  736. package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.cxx +185 -198
  737. package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.hxx +207 -222
  738. package/deps/couchbase-cxx-client/core/transactions/transaction_keyspace.cxx +15 -11
  739. package/deps/couchbase-cxx-client/core/transactions/transaction_links.cxx +11 -7
  740. package/deps/couchbase-cxx-client/core/transactions/transaction_links.hxx +222 -201
  741. package/deps/couchbase-cxx-client/core/transactions/transaction_options.cxx +44 -41
  742. package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +167 -125
  743. package/deps/couchbase-cxx-client/core/transactions/transactions_cleanup.cxx +491 -424
  744. package/deps/couchbase-cxx-client/core/transactions/transactions_config.cxx +25 -19
  745. package/deps/couchbase-cxx-client/core/transactions/uid_generator.cxx +3 -3
  746. package/deps/couchbase-cxx-client/core/transactions/uid_generator.hxx +2 -2
  747. package/deps/couchbase-cxx-client/core/transactions/utils.cxx +82 -69
  748. package/deps/couchbase-cxx-client/core/transactions/waitable_op_list.hxx +154 -140
  749. package/deps/couchbase-cxx-client/core/transactions.hxx +184 -180
  750. package/deps/couchbase-cxx-client/core/utils/binary.cxx +3 -3
  751. package/deps/couchbase-cxx-client/core/utils/binary.hxx +19 -15
  752. package/deps/couchbase-cxx-client/core/utils/byteswap.hxx +17 -17
  753. package/deps/couchbase-cxx-client/core/utils/connection_string.cxx +395 -328
  754. package/deps/couchbase-cxx-client/core/utils/connection_string.hxx +37 -36
  755. package/deps/couchbase-cxx-client/core/utils/crc32.hxx +42 -34
  756. package/deps/couchbase-cxx-client/core/utils/duration_parser.cxx +142 -133
  757. package/deps/couchbase-cxx-client/core/utils/duration_parser.hxx +9 -9
  758. package/deps/couchbase-cxx-client/core/utils/join_strings.hxx +24 -24
  759. package/deps/couchbase-cxx-client/core/utils/json.cxx +234 -228
  760. package/deps/couchbase-cxx-client/core/utils/json.hxx +12 -12
  761. package/deps/couchbase-cxx-client/core/utils/json_stream_control.hxx +8 -8
  762. package/deps/couchbase-cxx-client/core/utils/json_streaming_lexer.cxx +288 -263
  763. package/deps/couchbase-cxx-client/core/utils/json_streaming_lexer.hxx +20 -17
  764. package/deps/couchbase-cxx-client/core/utils/keyspace.hxx +22 -21
  765. package/deps/couchbase-cxx-client/core/utils/movable_function.hxx +78 -76
  766. package/deps/couchbase-cxx-client/core/utils/mutation_token.cxx +7 -3
  767. package/deps/couchbase-cxx-client/core/utils/mutation_token.hxx +3 -1
  768. package/deps/couchbase-cxx-client/core/utils/name_codec.hxx +13 -13
  769. package/deps/couchbase-cxx-client/core/utils/split_string.cxx +9 -9
  770. package/deps/couchbase-cxx-client/core/utils/split_string.hxx +2 -2
  771. package/deps/couchbase-cxx-client/core/utils/unsigned_leb128.hxx +92 -88
  772. package/deps/couchbase-cxx-client/core/utils/url_codec.cxx +301 -297
  773. package/deps/couchbase-cxx-client/core/utils/url_codec.hxx +35 -35
  774. package/deps/couchbase-cxx-client/core/vector_query_combination.hxx +4 -1
  775. package/deps/couchbase-cxx-client/core/view_on_error.hxx +4 -3
  776. package/deps/couchbase-cxx-client/core/view_query_options.cxx +21 -21
  777. package/deps/couchbase-cxx-client/core/view_query_options.hxx +23 -22
  778. package/deps/couchbase-cxx-client/core/view_scan_consistency.hxx +3 -3
  779. package/deps/couchbase-cxx-client/core/view_sort_order.hxx +4 -1
  780. package/deps/couchbase-cxx-client/core/wait_until_ready_options.hxx +11 -10
  781. package/deps/couchbase-cxx-client/couchbase/allow_querying_search_index_options.hxx +11 -11
  782. package/deps/couchbase-cxx-client/couchbase/analytics_index_manager.hxx +423 -405
  783. package/deps/couchbase-cxx-client/couchbase/analytics_meta_data.hxx +105 -105
  784. package/deps/couchbase-cxx-client/couchbase/analytics_metrics.hxx +120 -118
  785. package/deps/couchbase-cxx-client/couchbase/analytics_options.hxx +318 -292
  786. package/deps/couchbase-cxx-client/couchbase/analytics_result.hxx +56 -55
  787. package/deps/couchbase-cxx-client/couchbase/analytics_scan_consistency.hxx +24 -21
  788. package/deps/couchbase-cxx-client/couchbase/analytics_status.hxx +10 -10
  789. package/deps/couchbase-cxx-client/couchbase/analytics_warning.hxx +44 -43
  790. package/deps/couchbase-cxx-client/couchbase/analyze_document_options.hxx +9 -9
  791. package/deps/couchbase-cxx-client/couchbase/append_options.hxx +51 -47
  792. package/deps/couchbase-cxx-client/couchbase/behavior_options.hxx +75 -69
  793. package/deps/couchbase-cxx-client/couchbase/best_effort_retry_strategy.hxx +12 -10
  794. package/deps/couchbase-cxx-client/couchbase/binary_collection.hxx +213 -183
  795. package/deps/couchbase-cxx-client/couchbase/boolean_field_query.hxx +38 -38
  796. package/deps/couchbase-cxx-client/couchbase/boolean_query.hxx +166 -157
  797. package/deps/couchbase-cxx-client/couchbase/bucket.hxx +69 -68
  798. package/deps/couchbase-cxx-client/couchbase/bucket_manager.hxx +97 -88
  799. package/deps/couchbase-cxx-client/couchbase/build_query_index_options.hxx +22 -21
  800. package/deps/couchbase-cxx-client/couchbase/cas.hxx +74 -73
  801. package/deps/couchbase-cxx-client/couchbase/certificate_authenticator.hxx +10 -10
  802. package/deps/couchbase-cxx-client/couchbase/cluster.hxx +266 -310
  803. package/deps/couchbase-cxx-client/couchbase/cluster_options.hxx +235 -241
  804. package/deps/couchbase-cxx-client/couchbase/codec/binary_noop_serializer.hxx +11 -11
  805. package/deps/couchbase-cxx-client/couchbase/codec/codec_flags.hxx +39 -35
  806. package/deps/couchbase-cxx-client/couchbase/codec/encoded_value.hxx +15 -2
  807. package/deps/couchbase-cxx-client/couchbase/codec/json_transcoder.hxx +17 -15
  808. package/deps/couchbase-cxx-client/couchbase/codec/raw_binary_transcoder.hxx +19 -17
  809. package/deps/couchbase-cxx-client/couchbase/codec/raw_json_transcoder.hxx +31 -24
  810. package/deps/couchbase-cxx-client/couchbase/codec/raw_string_transcoder.hxx +20 -18
  811. package/deps/couchbase-cxx-client/couchbase/codec/tao_json_serializer.hxx +38 -30
  812. package/deps/couchbase-cxx-client/couchbase/collection.hxx +1007 -902
  813. package/deps/couchbase-cxx-client/couchbase/collection_manager.hxx +115 -107
  814. package/deps/couchbase-cxx-client/couchbase/collection_query_index_manager.hxx +200 -188
  815. package/deps/couchbase-cxx-client/couchbase/common_durability_options.hxx +68 -62
  816. package/deps/couchbase-cxx-client/couchbase/common_options.hxx +67 -67
  817. package/deps/couchbase-cxx-client/couchbase/compression_options.hxx +33 -33
  818. package/deps/couchbase-cxx-client/couchbase/configuration_profile.hxx +12 -11
  819. package/deps/couchbase-cxx-client/couchbase/configuration_profiles_registry.hxx +24 -22
  820. package/deps/couchbase-cxx-client/couchbase/conjunction_query.hxx +47 -45
  821. package/deps/couchbase-cxx-client/couchbase/connect_link_analytics_options.hxx +74 -72
  822. package/deps/couchbase-cxx-client/couchbase/counter_result.hxx +32 -32
  823. package/deps/couchbase-cxx-client/couchbase/create_bucket_options.hxx +9 -10
  824. package/deps/couchbase-cxx-client/couchbase/create_collection_options.hxx +35 -34
  825. package/deps/couchbase-cxx-client/couchbase/create_dataset_analytics_options.hxx +76 -76
  826. package/deps/couchbase-cxx-client/couchbase/create_dataverse_analytics_options.hxx +44 -44
  827. package/deps/couchbase-cxx-client/couchbase/create_index_analytics_options.hxx +60 -60
  828. package/deps/couchbase-cxx-client/couchbase/create_link_analytics_options.hxx +25 -25
  829. package/deps/couchbase-cxx-client/couchbase/create_primary_query_index_options.hxx +95 -94
  830. package/deps/couchbase-cxx-client/couchbase/create_query_index_options.hxx +97 -96
  831. package/deps/couchbase-cxx-client/couchbase/create_scope_options.hxx +9 -9
  832. package/deps/couchbase-cxx-client/couchbase/date_range.hxx +29 -27
  833. package/deps/couchbase-cxx-client/couchbase/date_range_facet.hxx +20 -20
  834. package/deps/couchbase-cxx-client/couchbase/date_range_facet_result.hxx +14 -14
  835. package/deps/couchbase-cxx-client/couchbase/date_range_query.hxx +219 -205
  836. package/deps/couchbase-cxx-client/couchbase/decrement_options.hxx +93 -91
  837. package/deps/couchbase-cxx-client/couchbase/diagnostics_options.hxx +42 -41
  838. package/deps/couchbase-cxx-client/couchbase/diagnostics_result.hxx +82 -83
  839. package/deps/couchbase-cxx-client/couchbase/disallow_querying_search_index_options.hxx +11 -10
  840. package/deps/couchbase-cxx-client/couchbase/disconnect_link_analytics_options.hxx +62 -62
  841. package/deps/couchbase-cxx-client/couchbase/disjunction_query.hxx +61 -60
  842. package/deps/couchbase-cxx-client/couchbase/dns_options.hxx +30 -30
  843. package/deps/couchbase-cxx-client/couchbase/doc_id_query.hxx +69 -69
  844. package/deps/couchbase-cxx-client/couchbase/drop_bucket_options.hxx +9 -9
  845. package/deps/couchbase-cxx-client/couchbase/drop_collection_options.hxx +9 -9
  846. package/deps/couchbase-cxx-client/couchbase/drop_dataset_analytics_options.hxx +60 -60
  847. package/deps/couchbase-cxx-client/couchbase/drop_dataverse_analytics_options.hxx +44 -44
  848. package/deps/couchbase-cxx-client/couchbase/drop_index_analytics_options.hxx +60 -60
  849. package/deps/couchbase-cxx-client/couchbase/drop_link_analytics_options.hxx +25 -25
  850. package/deps/couchbase-cxx-client/couchbase/drop_primary_query_index_options.hxx +58 -58
  851. package/deps/couchbase-cxx-client/couchbase/drop_query_index_options.hxx +44 -44
  852. package/deps/couchbase-cxx-client/couchbase/drop_scope_options.hxx +9 -9
  853. package/deps/couchbase-cxx-client/couchbase/drop_search_index_options.hxx +9 -9
  854. package/deps/couchbase-cxx-client/couchbase/durability_level.hxx +32 -29
  855. package/deps/couchbase-cxx-client/couchbase/endpoint_diagnostics.hxx +171 -171
  856. package/deps/couchbase-cxx-client/couchbase/endpoint_ping_report.hxx +166 -169
  857. package/deps/couchbase-cxx-client/couchbase/error.hxx +51 -0
  858. package/deps/couchbase-cxx-client/couchbase/error_codes.hxx +975 -940
  859. package/deps/couchbase-cxx-client/couchbase/error_context.hxx +19 -152
  860. package/deps/couchbase-cxx-client/couchbase/exists_options.hxx +25 -24
  861. package/deps/couchbase-cxx-client/couchbase/exists_result.hxx +32 -32
  862. package/deps/couchbase-cxx-client/couchbase/fail_fast_retry_strategy.hxx +4 -4
  863. package/deps/couchbase-cxx-client/couchbase/flush_bucket_options.hxx +9 -9
  864. package/deps/couchbase-cxx-client/couchbase/fmt/analytics_scan_consistency.hxx +18 -18
  865. package/deps/couchbase-cxx-client/couchbase/fmt/analytics_status.hxx +42 -42
  866. package/deps/couchbase-cxx-client/couchbase/fmt/cas.hxx +10 -10
  867. package/deps/couchbase-cxx-client/couchbase/fmt/durability_level.hxx +24 -24
  868. package/deps/couchbase-cxx-client/couchbase/fmt/error.hxx +53 -0
  869. package/deps/couchbase-cxx-client/couchbase/fmt/error_context.hxx +43 -0
  870. package/deps/couchbase-cxx-client/couchbase/fmt/mutation_token.hxx +15 -11
  871. package/deps/couchbase-cxx-client/couchbase/fmt/query_profile.hxx +21 -21
  872. package/deps/couchbase-cxx-client/couchbase/fmt/query_scan_consistency.hxx +18 -18
  873. package/deps/couchbase-cxx-client/couchbase/fmt/query_status.hxx +42 -42
  874. package/deps/couchbase-cxx-client/couchbase/fmt/retry_reason.hxx +75 -75
  875. package/deps/couchbase-cxx-client/couchbase/fmt/search_scan_consistency.hxx +15 -15
  876. package/deps/couchbase-cxx-client/couchbase/fmt/tls_verify_mode.hxx +18 -18
  877. package/deps/couchbase-cxx-client/couchbase/fmt/transaction_keyspace.hxx +15 -11
  878. package/deps/couchbase-cxx-client/couchbase/fork_event.hxx +12 -12
  879. package/deps/couchbase-cxx-client/couchbase/freeze_plan_search_index_options.hxx +9 -9
  880. package/deps/couchbase-cxx-client/couchbase/geo_bounding_box_query.hxx +71 -64
  881. package/deps/couchbase-cxx-client/couchbase/geo_distance_query.hxx +73 -66
  882. package/deps/couchbase-cxx-client/couchbase/geo_point.hxx +2 -2
  883. package/deps/couchbase-cxx-client/couchbase/geo_polygon_query.hxx +40 -39
  884. package/deps/couchbase-cxx-client/couchbase/get_all_buckets_options.hxx +9 -9
  885. package/deps/couchbase-cxx-client/couchbase/get_all_datasets_analytics_options.hxx +25 -25
  886. package/deps/couchbase-cxx-client/couchbase/get_all_indexes_analytics_options.hxx +26 -25
  887. package/deps/couchbase-cxx-client/couchbase/get_all_query_indexes_options.hxx +27 -25
  888. package/deps/couchbase-cxx-client/couchbase/get_all_replicas_options.hxx +49 -26
  889. package/deps/couchbase-cxx-client/couchbase/get_all_scopes_options.hxx +9 -9
  890. package/deps/couchbase-cxx-client/couchbase/get_all_search_indexes_options.hxx +9 -9
  891. package/deps/couchbase-cxx-client/couchbase/get_and_lock_options.hxx +25 -24
  892. package/deps/couchbase-cxx-client/couchbase/get_and_touch_options.hxx +25 -24
  893. package/deps/couchbase-cxx-client/couchbase/get_any_replica_options.hxx +49 -26
  894. package/deps/couchbase-cxx-client/couchbase/get_bucket_options.hxx +9 -9
  895. package/deps/couchbase-cxx-client/couchbase/get_indexed_search_index_options.hxx +9 -9
  896. package/deps/couchbase-cxx-client/couchbase/get_links_analytics_options.hxx +74 -74
  897. package/deps/couchbase-cxx-client/couchbase/get_options.hxx +63 -60
  898. package/deps/couchbase-cxx-client/couchbase/get_pending_mutations_analytics_options.hxx +30 -28
  899. package/deps/couchbase-cxx-client/couchbase/get_replica_result.hxx +79 -75
  900. package/deps/couchbase-cxx-client/couchbase/get_result.hxx +86 -80
  901. package/deps/couchbase-cxx-client/couchbase/get_search_index_options.hxx +9 -9
  902. package/deps/couchbase-cxx-client/couchbase/highlight_style.hxx +14 -14
  903. package/deps/couchbase-cxx-client/couchbase/increment_options.hxx +94 -91
  904. package/deps/couchbase-cxx-client/couchbase/insert_options.hxx +62 -59
  905. package/deps/couchbase-cxx-client/couchbase/ip_protocol.hxx +3 -3
  906. package/deps/couchbase-cxx-client/couchbase/logger.hxx +51 -0
  907. package/deps/couchbase-cxx-client/couchbase/lookup_in_all_replicas_options.hxx +54 -43
  908. package/deps/couchbase-cxx-client/couchbase/lookup_in_any_replica_options.hxx +54 -44
  909. package/deps/couchbase-cxx-client/couchbase/lookup_in_options.hxx +40 -40
  910. package/deps/couchbase-cxx-client/couchbase/lookup_in_replica_result.hxx +38 -35
  911. package/deps/couchbase-cxx-client/couchbase/lookup_in_result.hxx +222 -216
  912. package/deps/couchbase-cxx-client/couchbase/lookup_in_specs.hxx +101 -101
  913. package/deps/couchbase-cxx-client/couchbase/management/analytics_dataset.hxx +16 -16
  914. package/deps/couchbase-cxx-client/couchbase/management/analytics_index.hxx +16 -16
  915. package/deps/couchbase-cxx-client/couchbase/management/analytics_link.hxx +193 -189
  916. package/deps/couchbase-cxx-client/couchbase/management/bucket_settings.hxx +91 -75
  917. package/deps/couchbase-cxx-client/couchbase/management/collection_spec.hxx +4 -4
  918. package/deps/couchbase-cxx-client/couchbase/management/query_index.hxx +10 -10
  919. package/deps/couchbase-cxx-client/couchbase/management/scope_spec.hxx +2 -2
  920. package/deps/couchbase-cxx-client/couchbase/management/search_index.hxx +9 -9
  921. package/deps/couchbase-cxx-client/couchbase/match_all_query.hxx +10 -9
  922. package/deps/couchbase-cxx-client/couchbase/match_none_query.hxx +10 -9
  923. package/deps/couchbase-cxx-client/couchbase/match_operator.hxx +15 -14
  924. package/deps/couchbase-cxx-client/couchbase/match_phrase_query.hxx +70 -65
  925. package/deps/couchbase-cxx-client/couchbase/match_query.hxx +115 -114
  926. package/deps/couchbase-cxx-client/couchbase/metrics/meter.hxx +33 -30
  927. package/deps/couchbase-cxx-client/couchbase/metrics/otel_meter.hxx +86 -74
  928. package/deps/couchbase-cxx-client/couchbase/metrics_options.hxx +34 -34
  929. package/deps/couchbase-cxx-client/couchbase/mutate_in_options.hxx +160 -149
  930. package/deps/couchbase-cxx-client/couchbase/mutate_in_result.hxx +130 -123
  931. package/deps/couchbase-cxx-client/couchbase/mutate_in_specs.hxx +473 -454
  932. package/deps/couchbase-cxx-client/couchbase/mutation_result.hxx +32 -32
  933. package/deps/couchbase-cxx-client/couchbase/mutation_state.hxx +35 -34
  934. package/deps/couchbase-cxx-client/couchbase/mutation_token.hxx +78 -78
  935. package/deps/couchbase-cxx-client/couchbase/network_options.hxx +101 -72
  936. package/deps/couchbase-cxx-client/couchbase/numeric_range.hxx +26 -26
  937. package/deps/couchbase-cxx-client/couchbase/numeric_range_facet.hxx +20 -20
  938. package/deps/couchbase-cxx-client/couchbase/numeric_range_facet_result.hxx +14 -14
  939. package/deps/couchbase-cxx-client/couchbase/numeric_range_query.hxx +97 -95
  940. package/deps/couchbase-cxx-client/couchbase/password_authenticator.hxx +17 -17
  941. package/deps/couchbase-cxx-client/couchbase/pause_ingest_search_index_options.hxx +11 -10
  942. package/deps/couchbase-cxx-client/couchbase/persist_to.hxx +45 -44
  943. package/deps/couchbase-cxx-client/couchbase/phrase_query.hxx +69 -65
  944. package/deps/couchbase-cxx-client/couchbase/ping_options.hxx +55 -54
  945. package/deps/couchbase-cxx-client/couchbase/ping_result.hxx +79 -77
  946. package/deps/couchbase-cxx-client/couchbase/prefix_query.hxx +43 -40
  947. package/deps/couchbase-cxx-client/couchbase/prepend_options.hxx +51 -47
  948. package/deps/couchbase-cxx-client/couchbase/query_index_manager.hxx +207 -199
  949. package/deps/couchbase-cxx-client/couchbase/query_meta_data.hxx +120 -120
  950. package/deps/couchbase-cxx-client/couchbase/query_metrics.hxx +135 -133
  951. package/deps/couchbase-cxx-client/couchbase/query_options.hxx +518 -493
  952. package/deps/couchbase-cxx-client/couchbase/query_profile.hxx +29 -26
  953. package/deps/couchbase-cxx-client/couchbase/query_result.hxx +56 -55
  954. package/deps/couchbase-cxx-client/couchbase/query_scan_consistency.hxx +24 -21
  955. package/deps/couchbase-cxx-client/couchbase/query_status.hxx +10 -10
  956. package/deps/couchbase-cxx-client/couchbase/query_string_query.hxx +34 -29
  957. package/deps/couchbase-cxx-client/couchbase/query_warning.hxx +75 -71
  958. package/deps/couchbase-cxx-client/couchbase/read_preference.hxx +58 -0
  959. package/deps/couchbase-cxx-client/couchbase/regexp_query.hxx +40 -39
  960. package/deps/couchbase-cxx-client/couchbase/remove_options.hxx +51 -47
  961. package/deps/couchbase-cxx-client/couchbase/replace_link_analytics_options.hxx +25 -25
  962. package/deps/couchbase-cxx-client/couchbase/replace_options.hxx +112 -104
  963. package/deps/couchbase-cxx-client/couchbase/replicate_to.hxx +28 -28
  964. package/deps/couchbase-cxx-client/couchbase/result.hxx +28 -28
  965. package/deps/couchbase-cxx-client/couchbase/resume_ingest_search_index_options.hxx +11 -10
  966. package/deps/couchbase-cxx-client/couchbase/retry_action.hxx +10 -10
  967. package/deps/couchbase-cxx-client/couchbase/retry_reason.hxx +53 -51
  968. package/deps/couchbase-cxx-client/couchbase/retry_request.hxx +7 -7
  969. package/deps/couchbase-cxx-client/couchbase/retry_strategy.hxx +4 -4
  970. package/deps/couchbase-cxx-client/couchbase/scan_options.hxx +114 -108
  971. package/deps/couchbase-cxx-client/couchbase/scan_result.hxx +97 -96
  972. package/deps/couchbase-cxx-client/couchbase/scan_result_item.hxx +120 -118
  973. package/deps/couchbase-cxx-client/couchbase/scan_type.hxx +237 -232
  974. package/deps/couchbase-cxx-client/couchbase/scope.hxx +164 -157
  975. package/deps/couchbase-cxx-client/couchbase/scope_search_index_manager.hxx +263 -238
  976. package/deps/couchbase-cxx-client/couchbase/search_date_range.hxx +32 -29
  977. package/deps/couchbase-cxx-client/couchbase/search_facet.hxx +25 -25
  978. package/deps/couchbase-cxx-client/couchbase/search_facet_result.hxx +11 -11
  979. package/deps/couchbase-cxx-client/couchbase/search_geo_distance_units.hxx +11 -1
  980. package/deps/couchbase-cxx-client/couchbase/search_index_manager.hxx +261 -238
  981. package/deps/couchbase-cxx-client/couchbase/search_meta_data.hxx +37 -37
  982. package/deps/couchbase-cxx-client/couchbase/search_metrics.hxx +84 -83
  983. package/deps/couchbase-cxx-client/couchbase/search_numeric_range.hxx +32 -32
  984. package/deps/couchbase-cxx-client/couchbase/search_options.hxx +449 -435
  985. package/deps/couchbase-cxx-client/couchbase/search_query.hxx +32 -30
  986. package/deps/couchbase-cxx-client/couchbase/search_request.hxx +69 -68
  987. package/deps/couchbase-cxx-client/couchbase/search_result.hxx +29 -26
  988. package/deps/couchbase-cxx-client/couchbase/search_row.hxx +52 -52
  989. package/deps/couchbase-cxx-client/couchbase/search_row_location.hxx +20 -20
  990. package/deps/couchbase-cxx-client/couchbase/search_row_locations.hxx +39 -38
  991. package/deps/couchbase-cxx-client/couchbase/search_scan_consistency.hxx +11 -10
  992. package/deps/couchbase-cxx-client/couchbase/search_sort.hxx +20 -20
  993. package/deps/couchbase-cxx-client/couchbase/search_sort_field.hxx +77 -71
  994. package/deps/couchbase-cxx-client/couchbase/search_sort_field_missing.hxx +2 -2
  995. package/deps/couchbase-cxx-client/couchbase/search_sort_field_mode.hxx +3 -3
  996. package/deps/couchbase-cxx-client/couchbase/search_sort_field_type.hxx +4 -4
  997. package/deps/couchbase-cxx-client/couchbase/search_sort_geo_distance.hxx +41 -41
  998. package/deps/couchbase-cxx-client/couchbase/search_sort_id.hxx +23 -23
  999. package/deps/couchbase-cxx-client/couchbase/search_sort_score.hxx +23 -23
  1000. package/deps/couchbase-cxx-client/couchbase/search_term_range.hxx +17 -17
  1001. package/deps/couchbase-cxx-client/couchbase/security_options.hxx +50 -50
  1002. package/deps/couchbase-cxx-client/couchbase/service_type.hxx +34 -34
  1003. package/deps/couchbase-cxx-client/couchbase/store_semantics.hxx +28 -28
  1004. package/deps/couchbase-cxx-client/couchbase/subdoc/array_add_unique.hxx +54 -54
  1005. package/deps/couchbase-cxx-client/couchbase/subdoc/array_append.hxx +40 -40
  1006. package/deps/couchbase-cxx-client/couchbase/subdoc/array_insert.hxx +41 -41
  1007. package/deps/couchbase-cxx-client/couchbase/subdoc/array_prepend.hxx +41 -41
  1008. package/deps/couchbase-cxx-client/couchbase/subdoc/count.hxx +24 -24
  1009. package/deps/couchbase-cxx-client/couchbase/subdoc/counter.hxx +41 -41
  1010. package/deps/couchbase-cxx-client/couchbase/subdoc/exists.hxx +24 -24
  1011. package/deps/couchbase-cxx-client/couchbase/subdoc/get.hxx +45 -29
  1012. package/deps/couchbase-cxx-client/couchbase/subdoc/insert.hxx +70 -54
  1013. package/deps/couchbase-cxx-client/couchbase/subdoc/lookup_in_macro.hxx +13 -12
  1014. package/deps/couchbase-cxx-client/couchbase/subdoc/mutate_in_macro.hxx +7 -2
  1015. package/deps/couchbase-cxx-client/couchbase/subdoc/remove.hxx +24 -24
  1016. package/deps/couchbase-cxx-client/couchbase/subdoc/replace.hxx +55 -39
  1017. package/deps/couchbase-cxx-client/couchbase/subdoc/upsert.hxx +70 -54
  1018. package/deps/couchbase-cxx-client/couchbase/term_facet.hxx +16 -16
  1019. package/deps/couchbase-cxx-client/couchbase/term_facet_result.hxx +14 -14
  1020. package/deps/couchbase-cxx-client/couchbase/term_query.hxx +107 -104
  1021. package/deps/couchbase-cxx-client/couchbase/term_range_query.hxx +99 -96
  1022. package/deps/couchbase-cxx-client/couchbase/timeout_options.hxx +118 -112
  1023. package/deps/couchbase-cxx-client/couchbase/tls_verify_mode.hxx +2 -2
  1024. package/deps/couchbase-cxx-client/couchbase/touch_options.hxx +25 -24
  1025. package/deps/couchbase-cxx-client/couchbase/tracing/otel_tracer.hxx +45 -44
  1026. package/deps/couchbase-cxx-client/couchbase/tracing/request_span.hxx +34 -34
  1027. package/deps/couchbase-cxx-client/couchbase/tracing/request_tracer.hxx +27 -25
  1028. package/deps/couchbase-cxx-client/couchbase/tracing_options.hxx +147 -142
  1029. package/deps/couchbase-cxx-client/couchbase/transactions/async_attempt_context.hxx +149 -115
  1030. package/deps/couchbase-cxx-client/couchbase/transactions/attempt_context.hxx +146 -95
  1031. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_get_result.hxx +52 -80
  1032. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_keyspace.hxx +33 -29
  1033. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_options.hxx +101 -96
  1034. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_options.hxx +228 -223
  1035. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_query_result.hxx +11 -12
  1036. package/deps/couchbase-cxx-client/couchbase/transactions/transaction_result.hxx +2 -3
  1037. package/deps/couchbase-cxx-client/couchbase/transactions/transactions_cleanup_config.hxx +105 -104
  1038. package/deps/couchbase-cxx-client/couchbase/transactions/transactions_config.hxx +191 -187
  1039. package/deps/couchbase-cxx-client/couchbase/transactions/transactions_query_config.hxx +32 -32
  1040. package/deps/couchbase-cxx-client/couchbase/transactions.hxx +56 -37
  1041. package/deps/couchbase-cxx-client/couchbase/unfreeze_plan_search_index_options.hxx +11 -10
  1042. package/deps/couchbase-cxx-client/couchbase/unlock_options.hxx +25 -24
  1043. package/deps/couchbase-cxx-client/couchbase/update_bucket_options.hxx +9 -9
  1044. package/deps/couchbase-cxx-client/couchbase/update_collection_options.hxx +35 -34
  1045. package/deps/couchbase-cxx-client/couchbase/upsert_options.hxx +85 -80
  1046. package/deps/couchbase-cxx-client/couchbase/upsert_search_index_options.hxx +9 -9
  1047. package/deps/couchbase-cxx-client/couchbase/vector_query.hxx +82 -62
  1048. package/deps/couchbase-cxx-client/couchbase/vector_search.hxx +51 -47
  1049. package/deps/couchbase-cxx-client/couchbase/vector_search_options.hxx +45 -41
  1050. package/deps/couchbase-cxx-client/couchbase/wan_development_configuration_profile.hxx +13 -13
  1051. package/deps/couchbase-cxx-client/couchbase/watch_query_indexes_options.hxx +41 -41
  1052. package/deps/couchbase-cxx-client/couchbase/wildcard_query.hxx +42 -41
  1053. package/deps/couchbase-cxx-client/third_party/expected/include/tl/expected.hpp +1746 -1584
  1054. package/deps/couchbase-cxx-client/third_party/jsonsl/jsonsl.c +2664 -2638
  1055. package/deps/couchbase-cxx-client/third_party/jsonsl/jsonsl.h +359 -342
  1056. package/dist/binding.d.ts +39 -4
  1057. package/dist/binding.js +4 -1
  1058. package/dist/collection.js +0 -1
  1059. package/dist/diagnosticstypes.js +2 -2
  1060. package/dist/searchtypes.d.ts +0 -4
  1061. package/dist/searchtypes.js +0 -4
  1062. package/dist/transactions.d.ts +1 -0
  1063. package/dist/transactions.js +12 -2
  1064. package/dist/vectorsearch.d.ts +4 -19
  1065. package/dist/vectorsearch.js +24 -19
  1066. package/package.json +28 -28
  1067. package/src/constants.cpp +111 -75
  1068. package/src/jstocbpp_autogen.hpp +146 -15
  1069. package/src/jstocbpp_basic.hpp +23 -0
  1070. package/src/jstocbpp_errors.hpp +9 -9
  1071. package/src/jstocbpp_transactions.hpp +17 -12
  1072. package/src/transaction.cpp +10 -5
  1073. package/tools/gen-bindings-js.js +1 -0
  1074. package/tools/gen-bindings-json.py +5 -2
  1075. package/deps/couchbase-cxx-client/core/impl/internal_manager_error_context.cxx +0 -113
  1076. package/deps/couchbase-cxx-client/core/impl/internal_manager_error_context.hxx +0 -60
  1077. package/deps/couchbase-cxx-client/core/impl/manager_error_context.cxx +0 -100
  1078. package/deps/couchbase-cxx-client/core/impl/search_error_context.cxx +0 -147
  1079. package/deps/couchbase-cxx-client/couchbase/analytics_error_context.hxx +0 -143
  1080. package/deps/couchbase-cxx-client/couchbase/fmt/key_value_error_map_attribute.hxx +0 -100
  1081. package/deps/couchbase-cxx-client/couchbase/fmt/key_value_status_code.hxx +0 -269
  1082. package/deps/couchbase-cxx-client/couchbase/key_value_error_context.hxx +0 -229
  1083. package/deps/couchbase-cxx-client/couchbase/key_value_error_map_attribute.hxx +0 -136
  1084. package/deps/couchbase-cxx-client/couchbase/key_value_error_map_info.hxx +0 -138
  1085. package/deps/couchbase-cxx-client/couchbase/key_value_extended_error_info.hxx +0 -86
  1086. package/deps/couchbase-cxx-client/couchbase/key_value_status_code.hxx +0 -109
  1087. package/deps/couchbase-cxx-client/couchbase/manager_error_context.hxx +0 -111
  1088. package/deps/couchbase-cxx-client/couchbase/query_error_context.hxx +0 -145
  1089. package/deps/couchbase-cxx-client/couchbase/search_error_context.hxx +0 -138
  1090. package/deps/couchbase-cxx-client/couchbase/subdocument_error_context.hxx +0 -147
  1091. package/deps/couchbase-cxx-client/couchbase/transaction_op_error_context.hxx +0 -76
@@ -47,824 +47,894 @@ class bucket_impl
47
47
  , public config_listener
48
48
  , public response_handler
49
49
  {
50
- public:
51
- bucket_impl(std::string client_id,
52
- std::string name,
53
- couchbase::core::origin origin,
54
- std::shared_ptr<couchbase::tracing::request_tracer> tracer,
55
- std::shared_ptr<couchbase::metrics::meter> meter,
56
- std::vector<protocol::hello_feature> known_features,
57
- std::shared_ptr<impl::bootstrap_state_listener> state_listener,
58
- asio::io_context& ctx,
59
- asio::ssl::context& tls)
60
- : client_id_{ std::move(client_id) }
61
- , name_{ std::move(name) }
62
- , log_prefix_{ fmt::format("[{}/{}]", client_id_, name_) }
63
- , origin_{ std::move(origin) }
64
- , tracer_{ std::move(tracer) }
65
- , meter_{ std::move(meter) }
66
- , known_features_{ std::move(known_features) }
67
- , state_listener_{ std::move(state_listener) }
68
- , codec_{ { known_features_.begin(), known_features_.end() } }
69
- , ctx_{ ctx }
70
- , tls_{ tls }
71
- , heartbeat_timer_(ctx_)
72
- , heartbeat_interval_{ origin_.options().config_poll_floor > origin_.options().config_poll_interval
73
- ? origin_.options().config_poll_floor
74
- : origin_.options().config_poll_interval }
75
- {
50
+ public:
51
+ bucket_impl(std::string client_id,
52
+ std::string name,
53
+ couchbase::core::origin origin,
54
+ std::shared_ptr<couchbase::tracing::request_tracer> tracer,
55
+ std::shared_ptr<couchbase::metrics::meter> meter,
56
+ std::vector<protocol::hello_feature> known_features,
57
+ std::shared_ptr<impl::bootstrap_state_listener> state_listener,
58
+ asio::io_context& ctx,
59
+ asio::ssl::context& tls)
60
+ : client_id_{ std::move(client_id) }
61
+ , name_{ std::move(name) }
62
+ , log_prefix_{ fmt::format("[{}/{}]", client_id_, name_) }
63
+ , origin_{ std::move(origin) }
64
+ , tracer_{ std::move(tracer) }
65
+ , meter_{ std::move(meter) }
66
+ , known_features_{ std::move(known_features) }
67
+ , state_listener_{ std::move(state_listener) }
68
+ , codec_{ { known_features_.begin(), known_features_.end() } }
69
+ , ctx_{ ctx }
70
+ , tls_{ tls }
71
+ , heartbeat_timer_(ctx_)
72
+ , heartbeat_interval_{ origin_.options().config_poll_floor >
73
+ origin_.options().config_poll_interval
74
+ ? origin_.options().config_poll_floor
75
+ : origin_.options().config_poll_interval }
76
+ {
77
+ }
78
+
79
+ auto resolve_response(std::shared_ptr<mcbp::queue_request> req,
80
+ std::shared_ptr<mcbp::queue_response> resp,
81
+ std::error_code ec,
82
+ retry_reason reason,
83
+ std::optional<key_value_error_map_info> error_info)
84
+ {
85
+ // TODO: copy from mcbp_command, subject to refactor later
86
+ static std::string meter_name = "db.couchbase.operations";
87
+ static std::map<std::string, std::string> tags = {
88
+ { "db.couchbase.service", "kv" },
89
+ { "db.operation", fmt::format("{}", req->command_) },
90
+ };
91
+ meter_->get_value_recorder(meter_name, tags)
92
+ ->record_value(std::chrono::duration_cast<std::chrono::microseconds>(
93
+ std::chrono::steady_clock::now() - req->dispatched_time_)
94
+ .count());
95
+
96
+ if (ec == asio::error::operation_aborted) {
97
+ // TODO: fix tracing
98
+ // self->span_->add_tag(tracing::attributes::orphan, "aborted");
99
+ return req->try_callback(resp,
100
+ req->idempotent() ? errc::common::unambiguous_timeout
101
+ : errc::common::ambiguous_timeout);
76
102
  }
77
-
78
- auto resolve_response(std::shared_ptr<mcbp::queue_request> req,
79
- std::shared_ptr<mcbp::queue_response> resp,
80
- std::error_code ec,
81
- retry_reason reason,
82
- std::optional<key_value_error_map_info> error_info)
83
- {
84
- // TODO: copy from mcbp_command, subject to refactor later
85
- static std::string meter_name = "db.couchbase.operations";
86
- static std::map<std::string, std::string> tags = {
87
- { "db.couchbase.service", "kv" },
88
- { "db.operation", fmt::format("{}", req->command_) },
89
- };
90
- meter_->get_value_recorder(meter_name, tags)
91
- ->record_value(
92
- std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - req->dispatched_time_).count());
93
-
94
- if (ec == asio::error::operation_aborted) {
95
- // TODO: fix tracing
96
- // self->span_->add_tag(tracing::attributes::orphan, "aborted");
97
- return req->try_callback(resp, req->idempotent() ? errc::common::unambiguous_timeout : errc::common::ambiguous_timeout);
98
- }
99
- if (ec == errc::common::request_canceled) {
100
- if (!req->idempotent() && !allows_non_idempotent_retry(reason)) {
101
- // TODO: fix tracing
102
- // self->span_->add_tag(tracing::attributes::orphan, "canceled");
103
- return req->try_callback(resp, ec);
104
- }
105
- backoff_and_retry(req, reason == retry_reason::do_not_retry ? retry_reason::node_not_available : reason);
106
- return;
107
- }
108
- key_value_status_code status{ key_value_status_code::unknown };
109
- if (resp) {
110
- status = resp->status_code_;
111
- }
112
- if (status == key_value_status_code::not_my_vbucket) {
113
- reason = retry_reason::key_value_not_my_vbucket;
114
- }
115
- if (status == key_value_status_code::unknown && error_info && error_info.value().has_retry_attribute()) {
116
- reason = retry_reason::key_value_error_map_retry_indicated;
117
- } else {
118
- switch (status) {
119
- case key_value_status_code::locked:
120
- if (req->command_ != protocol::client_opcode::unlock) {
121
- /**
122
- * special case for unlock command, when it should not be retried, because it does not make sense
123
- * (someone else unlocked the document)
124
- */
125
- reason = retry_reason::key_value_locked;
126
- }
127
- break;
128
- case key_value_status_code::temporary_failure:
129
- reason = retry_reason::key_value_temporary_failure;
130
- break;
131
- case key_value_status_code::sync_write_in_progress:
132
- reason = retry_reason::key_value_sync_write_in_progress;
133
- break;
134
- case key_value_status_code::sync_write_re_commit_in_progress:
135
- reason = retry_reason::key_value_sync_write_re_commit_in_progress;
136
- break;
137
- default:
138
- break;
139
- }
140
- }
141
- if (reason == retry_reason::do_not_retry || !backoff_and_retry(req, reason)) {
142
- return req->try_callback(resp, ec);
143
- }
103
+ if (ec == errc::common::request_canceled) {
104
+ if (!req->idempotent() && !allows_non_idempotent_retry(reason)) {
105
+ // TODO: fix tracing
106
+ // self->span_->add_tag(tracing::attributes::orphan, "canceled");
107
+ return req->try_callback(resp, ec);
108
+ }
109
+ backoff_and_retry(std::move(req),
110
+ reason == retry_reason::do_not_retry ? retry_reason::node_not_available
111
+ : reason);
112
+ return;
144
113
  }
145
-
146
- void handle_response(std::shared_ptr<mcbp::queue_request> req,
147
- std::error_code error,
148
- retry_reason reason,
149
- io::mcbp_message msg,
150
- std::optional<key_value_error_map_info> error_info) override
151
- {
152
- std::shared_ptr<mcbp::queue_response> resp{};
153
- auto header = msg.header_data();
154
- auto [packet, size, err] = codec_.decode_packet(gsl::span(header.data(), header.size()), msg.body);
155
- if (err) {
156
- error = errc::network::protocol_error;
157
- } else {
158
- resp = std::make_shared<mcbp::queue_response>(std::move(packet));
159
- }
160
- resolve_response(req, resp, error, reason, std::move(error_info));
114
+ key_value_status_code status{ key_value_status_code::unknown };
115
+ if (resp) {
116
+ status = resp->status_code_;
161
117
  }
162
-
163
- auto direct_dispatch(std::shared_ptr<mcbp::queue_request> req) -> std::error_code
164
- {
165
- if (closed_) {
166
- req->cancel(errc::network::bucket_closed);
167
- return errc::network::bucket_closed;
168
- }
169
- if (!configured_) {
170
- return defer_command([self = shared_from_this(), req]() { self->direct_dispatch(req); });
171
- }
172
-
173
- req->dispatched_time_ = std::chrono::steady_clock::now();
174
-
175
- auto session = route_request(req);
176
- if (!session || !session->has_config()) {
177
- return defer_command([self = shared_from_this(), req]() mutable { self->direct_dispatch(std::move(req)); });
178
- }
179
- if (session->is_stopped()) {
180
- if (backoff_and_retry(req, retry_reason::node_not_available)) {
181
- return {};
182
- }
183
- return errc::common::service_not_available;
184
- }
185
- req->opaque_ = session->next_opaque();
186
- session->write_and_subscribe(req, shared_from_this());
187
- return {};
118
+ if (status == key_value_status_code::not_my_vbucket) {
119
+ reason = retry_reason::key_value_not_my_vbucket;
120
+ }
121
+ if (status == key_value_status_code::unknown && error_info &&
122
+ error_info.value().has_retry_attribute()) {
123
+ reason = retry_reason::key_value_error_map_retry_indicated;
124
+ } else {
125
+ switch (status) {
126
+ case key_value_status_code::locked:
127
+ if (req->command_ != protocol::client_opcode::unlock) {
128
+ /**
129
+ * special case for unlock command, when it should not be retried, because it does not
130
+ * make sense (someone else unlocked the document)
131
+ */
132
+ reason = retry_reason::key_value_locked;
133
+ }
134
+ break;
135
+ case key_value_status_code::temporary_failure:
136
+ reason = retry_reason::key_value_temporary_failure;
137
+ break;
138
+ case key_value_status_code::sync_write_in_progress:
139
+ reason = retry_reason::key_value_sync_write_in_progress;
140
+ break;
141
+ case key_value_status_code::sync_write_re_commit_in_progress:
142
+ reason = retry_reason::key_value_sync_write_re_commit_in_progress;
143
+ break;
144
+ default:
145
+ break;
146
+ }
147
+ }
148
+ if (reason == retry_reason::do_not_retry || !backoff_and_retry(req, reason)) {
149
+ return req->try_callback(resp, ec);
150
+ }
151
+ }
152
+
153
+ void handle_response(std::shared_ptr<mcbp::queue_request> req,
154
+ std::error_code error,
155
+ retry_reason reason,
156
+ io::mcbp_message msg,
157
+ std::optional<key_value_error_map_info> error_info) override
158
+ {
159
+ std::shared_ptr<mcbp::queue_response> resp{};
160
+ auto header = msg.header_data();
161
+ auto [packet, size, err] =
162
+ codec_.decode_packet(gsl::span(header.data(), header.size()), msg.body);
163
+ if (err) {
164
+ error = errc::network::protocol_error;
165
+ } else {
166
+ resp = std::make_shared<mcbp::queue_response>(std::move(packet));
167
+ }
168
+ resolve_response(std::move(req), std::move(resp), error, reason, std::move(error_info));
169
+ }
170
+
171
+ auto direct_dispatch(std::shared_ptr<mcbp::queue_request> req) -> std::error_code
172
+ {
173
+ if (closed_) {
174
+ req->cancel(errc::network::bucket_closed);
175
+ return errc::network::bucket_closed;
176
+ }
177
+ if (!configured_) {
178
+ return defer_command([self = shared_from_this(), req]() {
179
+ self->direct_dispatch(req);
180
+ });
188
181
  }
189
182
 
190
- auto direct_re_queue(std::shared_ptr<mcbp::queue_request> req, bool is_retry) -> std::error_code
191
- {
192
- auto handle_error = [is_retry, req](std::error_code ec) {
193
- // We only want to log an error on retries if the error isn't cancelled.
194
- if (!is_retry || (is_retry && ec != errc::common::request_canceled)) {
195
- CB_LOG_ERROR("reschedule failed, failing request ({})", ec.message());
196
- }
197
-
198
- req->try_callback({}, ec);
199
- };
200
-
201
- CB_LOG_DEBUG("request being re-queued. opaque={}, opcode={}", req->opaque_, req->command_);
183
+ req->dispatched_time_ = std::chrono::steady_clock::now();
202
184
 
203
- auto session = route_request(req);
204
- if (!session || !session->has_config()) {
205
- return defer_command([self = shared_from_this(), req]() { self->direct_dispatch(req); });
206
- }
207
- if (session->is_stopped()) {
208
- if (backoff_and_retry(req, retry_reason::node_not_available)) {
209
- return {};
210
- }
211
- handle_error(errc::common::service_not_available);
212
- return errc::common::service_not_available;
213
- }
214
- req->opaque_ = session->next_opaque();
215
- auto data = codec_.encode_packet(*req);
216
- if (!data) {
217
- CB_LOG_DEBUG("unable to encode packet. ec={}", data.error().message());
218
- handle_error(data.error());
219
- return data.error();
220
- }
221
- session->write_and_subscribe(
222
- req->opaque_,
223
- std::move(data.value()),
224
- [self = shared_from_this(), req, session](
225
- std::error_code error, retry_reason reason, io::mcbp_message msg, std::optional<key_value_error_map_info> error_info) {
226
- std::shared_ptr<mcbp::queue_response> resp{};
227
- auto header = msg.header_data();
228
- auto [packet, size, err] = self->codec_.decode_packet(gsl::span(header.data(), header.size()), msg.body);
229
- if (err) {
230
- error = errc::network::protocol_error;
231
- } else {
232
- resp = std::make_shared<mcbp::queue_response>(std::move(packet));
233
- }
234
- return self->resolve_response(req, resp, error, reason, std::move(error_info));
235
- });
185
+ auto session = route_request(req);
186
+ if (!session || !session->has_config()) {
187
+ return defer_command([self = shared_from_this(), req]() mutable {
188
+ self->direct_dispatch(std::move(req));
189
+ });
190
+ }
191
+ if (session->is_stopped()) {
192
+ if (backoff_and_retry(req, retry_reason::node_not_available)) {
236
193
  return {};
194
+ }
195
+ return errc::common::service_not_available;
237
196
  }
238
-
239
- auto backoff_and_retry(std::shared_ptr<mcbp::queue_request> request, retry_reason reason) -> bool
240
- {
241
- auto action = retry_orchestrator::should_retry(request, reason);
242
- auto retried = action.need_to_retry();
243
- if (retried) {
244
- auto timer = std::make_shared<asio::steady_timer>(ctx_);
245
- timer->expires_after(action.duration());
246
- timer->async_wait([self = shared_from_this(), request](auto error) {
247
- if (error == asio::error::operation_aborted) {
248
- return;
249
- }
250
- self->direct_re_queue(request, true);
251
- });
252
- request->set_retry_backoff(timer);
253
- }
254
- return retried;
197
+ req->opaque_ = session->next_opaque();
198
+ session->write_and_subscribe(req, shared_from_this());
199
+ return {};
200
+ }
201
+
202
+ auto direct_re_queue(std::shared_ptr<mcbp::queue_request> req, bool is_retry) -> std::error_code
203
+ {
204
+ auto handle_error = [is_retry, req](std::error_code ec) {
205
+ // We only want to log an error on retries if the error isn't cancelled.
206
+ if (!is_retry || (is_retry && ec != errc::common::request_canceled)) {
207
+ CB_LOG_ERROR("reschedule failed, failing request ({})", ec.message());
208
+ }
209
+
210
+ req->try_callback({}, ec);
211
+ };
212
+
213
+ CB_LOG_DEBUG("request being re-queued. opaque={}, opcode={}", req->opaque_, req->command_);
214
+
215
+ auto session = route_request(req);
216
+ if (!session || !session->has_config()) {
217
+ return defer_command([self = shared_from_this(), req]() {
218
+ self->direct_dispatch(req);
219
+ });
255
220
  }
256
-
257
- auto route_request(std::shared_ptr<mcbp::queue_request> req) -> std::optional<io::mcbp_session>
258
- {
259
- if (req->key_.empty()) {
260
- if (auto server = server_by_vbucket(req->vbucket_, req->replica_index_); server) {
261
- return find_session_by_index(server.value());
262
- }
263
- } else if (auto [partition, server] = map_id(req->key_, req->replica_index_); server) {
264
- req->vbucket_ = partition;
265
- return find_session_by_index(server.value());
266
- }
221
+ if (session->is_stopped()) {
222
+ if (backoff_and_retry(req, retry_reason::node_not_available)) {
267
223
  return {};
224
+ }
225
+ handle_error(errc::common::service_not_available);
226
+ return errc::common::service_not_available;
268
227
  }
269
-
270
- [[nodiscard]] auto server_by_vbucket(std::uint16_t vbucket, std::size_t node_index) -> std::optional<std::size_t>
271
- {
272
- std::scoped_lock lock(config_mutex_);
273
- return config_->server_by_vbucket(vbucket, node_index);
274
- }
275
-
276
- [[nodiscard]] auto map_id(const document_id& id) -> std::pair<std::uint16_t, std::optional<std::size_t>>
277
- {
278
- std::scoped_lock lock(config_mutex_);
279
- return config_->map_key(id.key(), id.node_index());
228
+ req->opaque_ = session->next_opaque();
229
+ auto data = codec_.encode_packet(*req);
230
+ if (!data) {
231
+ CB_LOG_DEBUG("unable to encode packet. ec={}", data.error().message());
232
+ handle_error(data.error());
233
+ return data.error();
280
234
  }
281
-
282
- auto config_rev() const -> std::string
283
- {
284
- std::scoped_lock lock(config_mutex_);
285
- if (config_) {
286
- return config_->rev_str();
235
+ session->write_and_subscribe(
236
+ req->opaque_,
237
+ std::move(data.value()),
238
+ [self = shared_from_this(), req, session](
239
+ std::error_code error,
240
+ retry_reason reason,
241
+ io::mcbp_message msg,
242
+ std::optional<key_value_error_map_info> error_info) {
243
+ std::shared_ptr<mcbp::queue_response> resp{};
244
+ auto header = msg.header_data();
245
+ auto [packet, size, err] =
246
+ self->codec_.decode_packet(gsl::span(header.data(), header.size()), msg.body);
247
+ if (err) {
248
+ error = errc::network::protocol_error;
249
+ } else {
250
+ resp = std::make_shared<mcbp::queue_response>(std::move(packet));
251
+ }
252
+ return self->resolve_response(req, resp, error, reason, std::move(error_info));
253
+ });
254
+ return {};
255
+ }
256
+
257
+ auto backoff_and_retry(std::shared_ptr<mcbp::queue_request> request, retry_reason reason) -> bool
258
+ {
259
+ auto action = retry_orchestrator::should_retry(request, reason);
260
+ auto retried = action.need_to_retry();
261
+ if (retried) {
262
+ auto timer = std::make_shared<asio::steady_timer>(ctx_);
263
+ timer->expires_after(action.duration());
264
+ timer->async_wait([self = shared_from_this(), request](auto error) {
265
+ if (error == asio::error::operation_aborted) {
266
+ return;
287
267
  }
288
- return "<no-config>";
268
+ self->direct_re_queue(request, true);
269
+ });
270
+ request->set_retry_backoff(timer);
289
271
  }
290
-
291
- [[nodiscard]] auto map_id(const std::vector<std::byte>& key, std::size_t node_index)
292
- -> std::pair<std::uint16_t, std::optional<std::size_t>>
293
- {
294
- std::scoped_lock lock(config_mutex_);
295
- return config_->map_key(key, node_index);
272
+ return retried;
273
+ }
274
+
275
+ auto route_request(std::shared_ptr<mcbp::queue_request> req) -> std::optional<io::mcbp_session>
276
+ {
277
+ if (req->key_.empty()) {
278
+ if (auto server = server_by_vbucket(req->vbucket_, req->replica_index_); server) {
279
+ return find_session_by_index(server.value());
280
+ }
281
+ } else if (auto [partition, server] = map_id(req->key_, req->replica_index_); server) {
282
+ req->vbucket_ = partition;
283
+ return find_session_by_index(server.value());
296
284
  }
297
-
298
- void restart_sessions()
299
- {
300
- const std::scoped_lock lock(config_mutex_, sessions_mutex_);
301
- if (!config_.has_value()) {
302
- return;
303
- }
304
-
305
- std::size_t kv_node_index{ 0 };
306
- for (std::size_t index = 0; index < config_->nodes.size(); ++index) {
307
- const auto& node = config_->nodes[index];
308
-
309
- const auto& hostname = node.hostname_for(origin_.options().network);
310
- auto port = node.port_or(origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
311
- if (port == 0) {
312
- continue;
313
- }
314
-
315
- auto ptr = std::find_if(sessions_.begin(), sessions_.end(), [&hostname, &port](const auto& session) {
316
- return session.second.bootstrap_hostname() == hostname && session.second.bootstrap_port_number() == port;
317
- });
318
- if (ptr != sessions_.end()) {
319
-
320
- if (auto found_kv_node_index = ptr->first; found_kv_node_index != kv_node_index) {
321
- if (auto current = sessions_.find(kv_node_index); current == sessions_.end()) {
322
- CB_LOG_WARNING(R"({} KV node index mismatch: config rev={} states that address="{}:{}" should be at idx={}, )"
323
- R"(but it is at idx={} ("{}"). Moving session to idx={}.)",
324
- log_prefix_,
325
- config_->rev_str(),
326
- hostname,
327
- port,
328
- kv_node_index,
329
- found_kv_node_index,
330
- ptr->second.id(),
331
- kv_node_index);
332
- sessions_.insert_or_assign(kv_node_index, std::move(ptr->second));
333
- sessions_.erase(ptr);
334
- } else {
335
- CB_LOG_WARNING(
336
- R"({} KV node index mismatch: config rev={} states that address="{}:{}" should be at idx={}, )"
337
- R"(but it is at idx={} ("{}"). Slot with idx={} is holds session with address="{}" ("{}"), swapping them.)",
338
- log_prefix_,
339
- config_->rev_str(),
340
- hostname,
341
- port,
342
- kv_node_index,
343
- found_kv_node_index,
344
- ptr->second.id(),
345
- kv_node_index,
346
- current->second.bootstrap_address(),
347
- current->second.id());
348
- std::swap(current->second, ptr->second);
349
- }
350
- }
351
- ++kv_node_index;
352
- continue;
353
- }
354
- couchbase::core::origin origin(origin_.credentials(), hostname, port, origin_.options());
355
- io::mcbp_session session = origin_.options().enable_tls
356
- ? io::mcbp_session(client_id_, ctx_, tls_, origin, state_listener_, name_, known_features_)
357
- : io::mcbp_session(client_id_, ctx_, origin, state_listener_, name_, known_features_);
358
- CB_LOG_DEBUG(R"({} rev={}, restart idx={}, session="{}", address="{}:{}")",
359
- log_prefix_,
360
- config_->rev_str(),
361
- node.index,
362
- session.id(),
363
- hostname,
364
- port);
365
- session.bootstrap(
366
- [self = shared_from_this(), session](std::error_code err, topology::configuration cfg) mutable {
367
- if (err) {
368
- return self->remove_session(session.id());
369
- }
370
- self->update_config(std::move(cfg));
371
- session.on_configuration_update(self);
372
- session.on_stop([id = session.id(), self]() { self->remove_session(id); });
373
- self->drain_deferred_queue();
374
- },
375
- true);
376
- sessions_.insert_or_assign(index, std::move(session));
377
- ++kv_node_index;
378
- }
285
+ return {};
286
+ }
287
+
288
+ [[nodiscard]] auto server_by_vbucket(std::uint16_t vbucket,
289
+ std::size_t node_index) -> std::optional<std::size_t>
290
+ {
291
+ std::scoped_lock lock(config_mutex_);
292
+ return config_->server_by_vbucket(vbucket, node_index);
293
+ }
294
+
295
+ [[nodiscard]] auto map_id(const document_id& id)
296
+ -> std::pair<std::uint16_t, std::optional<std::size_t>>
297
+ {
298
+ std::scoped_lock lock(config_mutex_);
299
+ return config_->map_key(id.key(), id.node_index());
300
+ }
301
+
302
+ auto config_rev() const -> std::string
303
+ {
304
+ std::scoped_lock lock(config_mutex_);
305
+ if (config_) {
306
+ return config_->rev_str();
379
307
  }
380
-
381
- void remove_session(const std::string& id)
382
- {
383
- bool found{ false };
384
- const std::scoped_lock lock(sessions_mutex_);
385
- for (auto ptr = sessions_.cbegin(); ptr != sessions_.cend();) {
386
- if (ptr->second.id() == id) {
387
- CB_LOG_DEBUG(R"({} removed session id="{}", address="{}", bootstrap_address="{}:{}")",
388
- log_prefix_,
389
- ptr->second.id(),
390
- ptr->second.remote_address(),
391
- ptr->second.bootstrap_hostname(),
392
- ptr->second.bootstrap_port());
393
- ptr = sessions_.erase(ptr);
394
- found = true;
395
- } else {
396
- ptr = std::next(ptr);
397
- }
398
- }
399
-
400
- if (found) {
401
- asio::post(asio::bind_executor(ctx_, [self = shared_from_this()]() { return self->restart_sessions(); }));
402
- }
308
+ return "<no-config>";
309
+ }
310
+
311
+ [[nodiscard]] auto map_id(const std::vector<std::byte>& key, std::size_t node_index)
312
+ -> std::pair<std::uint16_t, std::optional<std::size_t>>
313
+ {
314
+ std::scoped_lock lock(config_mutex_);
315
+ return config_->map_key(key, node_index);
316
+ }
317
+
318
+ void restart_sessions()
319
+ {
320
+ const std::scoped_lock lock(config_mutex_, sessions_mutex_);
321
+ if (!config_.has_value()) {
322
+ return;
403
323
  }
404
324
 
405
- void bootstrap(utils::movable_function<void(std::error_code, topology::configuration)>&& handler)
406
- {
407
- if (state_listener_) {
408
- state_listener_->register_config_listener(shared_from_this());
409
- }
410
- io::mcbp_session new_session = origin_.options().enable_tls
411
- ? io::mcbp_session(client_id_, ctx_, tls_, origin_, state_listener_, name_, known_features_)
412
- : io::mcbp_session(client_id_, ctx_, origin_, state_listener_, name_, known_features_);
413
- new_session.bootstrap([self = shared_from_this(), new_session, h = std::move(handler)](std::error_code ec,
414
- topology::configuration cfg) mutable {
415
- if (ec) {
416
- CB_LOG_WARNING(R"({} failed to bootstrap session ec={}, bucket="{}")", new_session.log_prefix(), ec.message(), self->name_);
417
- self->remove_session(new_session.id());
418
- } else {
419
- const std::size_t this_index = new_session.index();
420
- new_session.on_configuration_update(self);
421
- new_session.on_stop([id = new_session.id(), self]() { self->remove_session(id); });
422
-
423
- {
424
- std::scoped_lock lock(self->sessions_mutex_);
425
- self->sessions_.insert_or_assign(this_index, std::move(new_session));
426
- }
427
- self->update_config(cfg);
428
- self->drain_deferred_queue();
429
- self->poll_config({});
430
- }
431
- asio::post(asio::bind_executor(self->ctx_, [h = std::move(h), ec, cfg = std::move(cfg)]() mutable { h(ec, cfg); }));
325
+ std::size_t kv_node_index{ 0 };
326
+ for (std::size_t index = 0; index < config_->nodes.size(); ++index) {
327
+ const auto& node = config_->nodes[index];
328
+
329
+ const auto& hostname = node.hostname_for(origin_.options().network);
330
+ auto port = node.port_or(
331
+ origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
332
+ if (port == 0) {
333
+ continue;
334
+ }
335
+
336
+ auto ptr =
337
+ std::find_if(sessions_.begin(), sessions_.end(), [&hostname, &port](const auto& session) {
338
+ return session.second.bootstrap_hostname() == hostname &&
339
+ session.second.bootstrap_port_number() == port;
432
340
  });
433
- }
434
-
435
- void with_configuration(utils::movable_function<void(std::error_code, topology::configuration)>&& handler)
436
- {
437
- if (closed_) {
438
- return handler(errc::network::configuration_not_available, topology::configuration{});
439
- }
440
- if (configured_) {
441
- std::optional<topology::configuration> config{};
442
- {
443
- std::scoped_lock config_lock(config_mutex_);
444
- config = config_;
445
- }
446
- if (config) {
447
- return handler({}, config.value());
448
- }
449
- return handler(errc::network::configuration_not_available, topology::configuration{});
341
+ if (ptr != sessions_.end()) {
342
+
343
+ if (auto found_kv_node_index = ptr->first; found_kv_node_index != kv_node_index) {
344
+ if (auto current = sessions_.find(kv_node_index); current == sessions_.end()) {
345
+ CB_LOG_WARNING(
346
+ R"({} KV node index mismatch: config rev={} states that address="{}:{}" should be at idx={}, )"
347
+ R"(but it is at idx={} ("{}"). Moving session to idx={}.)",
348
+ log_prefix_,
349
+ config_->rev_str(),
350
+ hostname,
351
+ port,
352
+ kv_node_index,
353
+ found_kv_node_index,
354
+ ptr->second.id(),
355
+ kv_node_index);
356
+ sessions_.insert_or_assign(kv_node_index, std::move(ptr->second));
357
+ sessions_.erase(ptr);
358
+ } else {
359
+ CB_LOG_WARNING(
360
+ R"({} KV node index mismatch: config rev={} states that address="{}:{}" should be at idx={}, )"
361
+ R"(but it is at idx={} ("{}"). Slot with idx={} is holds session with address="{}" ("{}"), swapping them.)",
362
+ log_prefix_,
363
+ config_->rev_str(),
364
+ hostname,
365
+ port,
366
+ kv_node_index,
367
+ found_kv_node_index,
368
+ ptr->second.id(),
369
+ kv_node_index,
370
+ current->second.bootstrap_address(),
371
+ current->second.id());
372
+ std::swap(current->second, ptr->second);
373
+ }
450
374
  }
451
- std::scoped_lock lock(deferred_commands_mutex_);
452
- deferred_commands_.emplace([self = shared_from_this(), handler = std::move(handler)]() mutable {
453
- if (self->closed_ || !self->configured_) {
454
- return handler(errc::network::configuration_not_available, topology::configuration{});
455
- }
456
-
457
- std::optional<topology::configuration> config{};
458
- {
459
- std::scoped_lock config_lock(self->config_mutex_);
460
- config = self->config_;
461
- }
462
- if (config) {
463
- return handler({}, config.value());
464
- }
465
- return handler(errc::network::configuration_not_available, topology::configuration{});
466
- });
375
+ ++kv_node_index;
376
+ continue;
377
+ }
378
+ couchbase::core::origin origin(origin_.credentials(), hostname, port, origin_.options());
379
+ io::mcbp_session session =
380
+ origin_.options().enable_tls
381
+ ? io::mcbp_session(
382
+ client_id_, ctx_, tls_, origin, state_listener_, name_, known_features_)
383
+ : io::mcbp_session(client_id_, ctx_, origin, state_listener_, name_, known_features_);
384
+ CB_LOG_DEBUG(R"({} rev={}, restart idx={}, session="{}", address="{}:{}")",
385
+ log_prefix_,
386
+ config_->rev_str(),
387
+ node.index,
388
+ session.id(),
389
+ hostname,
390
+ port);
391
+ session.bootstrap(
392
+ [self = shared_from_this(), session](std::error_code err,
393
+ topology::configuration cfg) mutable {
394
+ if (err) {
395
+ return self->remove_session(session.id());
396
+ }
397
+ self->update_config(std::move(cfg));
398
+ session.on_configuration_update(self);
399
+ session.on_stop([id = session.id(), self]() {
400
+ self->remove_session(id);
401
+ });
402
+ self->drain_deferred_queue();
403
+ },
404
+ true);
405
+ sessions_.insert_or_assign(index, std::move(session));
406
+ ++kv_node_index;
467
407
  }
468
-
469
- void drain_deferred_queue()
470
- {
471
- std::queue<utils::movable_function<void()>> commands{};
472
- {
473
- std::scoped_lock lock(deferred_commands_mutex_);
474
- std::swap(deferred_commands_, commands);
475
- }
476
- if (!commands.empty()) {
477
- CB_LOG_TRACE(R"({} draining deferred operation queue, size={})", log_prefix_, commands.size());
478
- }
479
- while (!commands.empty()) {
480
- commands.front()();
481
- commands.pop();
482
- }
408
+ }
409
+
410
+ void remove_session(const std::string& id)
411
+ {
412
+ bool found{ false };
413
+ const std::scoped_lock lock(sessions_mutex_);
414
+ for (auto ptr = sessions_.cbegin(); ptr != sessions_.cend();) {
415
+ if (ptr->second.id() == id) {
416
+ CB_LOG_DEBUG(R"({} removed session id="{}", address="{}", bootstrap_address="{}:{}")",
417
+ log_prefix_,
418
+ ptr->second.id(),
419
+ ptr->second.remote_address(),
420
+ ptr->second.bootstrap_hostname(),
421
+ ptr->second.bootstrap_port());
422
+ ptr = sessions_.erase(ptr);
423
+ found = true;
424
+ } else {
425
+ ptr = std::next(ptr);
426
+ }
483
427
  }
484
428
 
485
- void fetch_config()
486
- {
487
- if (closed_) {
488
- return;
489
- }
490
- std::optional<io::mcbp_session> session{};
491
- {
492
- std::scoped_lock lock(sessions_mutex_);
493
-
494
- std::size_t start = heartbeat_next_index_.fetch_add(1);
495
- std::size_t i = start;
496
- do {
497
- auto ptr = sessions_.find(i % sessions_.size());
498
- if (ptr != sessions_.end() && ptr->second.is_bootstrapped() && ptr->second.supports_gcccp()) {
499
- session = ptr->second;
500
- }
501
- i = heartbeat_next_index_.fetch_add(1);
502
- } while (start % sessions_.size() != i % sessions_.size());
503
- }
504
- if (session) {
505
- protocol::client_request<protocol::get_cluster_config_request_body> req;
506
- req.opaque(session->next_opaque());
507
- session->write_and_flush(req.data());
508
- } else {
509
- CB_LOG_WARNING(R"({} unable to find connected session with GCCCP support, retry in {})", log_prefix_, heartbeat_interval_);
510
- }
429
+ if (found) {
430
+ asio::post(asio::bind_executor(ctx_, [self = shared_from_this()]() {
431
+ return self->restart_sessions();
432
+ }));
511
433
  }
434
+ }
512
435
 
513
- void poll_config(std::error_code ec)
514
- {
515
- if (ec == asio::error::operation_aborted || closed_) {
516
- return;
517
- }
518
- if (heartbeat_timer_.expiry() > std::chrono::steady_clock::now()) {
519
- return;
520
- }
521
-
522
- fetch_config();
523
-
524
- heartbeat_timer_.expires_after(heartbeat_interval_);
525
- return heartbeat_timer_.async_wait([self = shared_from_this()](std::error_code e) {
526
- if (e == asio::error::operation_aborted) {
527
- return;
528
- }
529
- self->poll_config(e);
530
- });
436
+ void bootstrap(utils::movable_function<void(std::error_code, topology::configuration)>&& handler)
437
+ {
438
+ if (state_listener_) {
439
+ state_listener_->register_config_listener(shared_from_this());
531
440
  }
441
+ io::mcbp_session new_session =
442
+ origin_.options().enable_tls
443
+ ? io::mcbp_session(client_id_, ctx_, tls_, origin_, state_listener_, name_, known_features_)
444
+ : io::mcbp_session(client_id_, ctx_, origin_, state_listener_, name_, known_features_);
445
+ new_session.bootstrap([self = shared_from_this(), new_session, h = std::move(handler)](
446
+ std::error_code ec, topology::configuration cfg) mutable {
447
+ if (ec) {
448
+ CB_LOG_WARNING(R"({} failed to bootstrap session ec={}, bucket="{}")",
449
+ new_session.log_prefix(),
450
+ ec.message(),
451
+ self->name_);
452
+ self->remove_session(new_session.id());
453
+ } else {
454
+ const std::size_t this_index = new_session.index();
455
+ new_session.on_configuration_update(self);
456
+ new_session.on_stop([id = new_session.id(), self]() {
457
+ self->remove_session(id);
458
+ });
532
459
 
533
- void close()
534
- {
535
- if (bool expected_state{ false }; !closed_.compare_exchange_strong(expected_state, true)) {
536
- return;
537
- }
538
-
539
- heartbeat_timer_.cancel();
540
-
541
- drain_deferred_queue();
542
-
543
- if (state_listener_ != nullptr) {
544
- state_listener_->unregister_config_listener(shared_from_this());
545
- }
546
-
547
- {
548
- std::scoped_lock lock(config_listeners_mutex_);
549
- config_listeners_.clear();
550
- }
551
-
552
- std::map<size_t, io::mcbp_session> old_sessions;
553
460
  {
554
- std::scoped_lock lock(sessions_mutex_);
555
- std::swap(old_sessions, sessions_);
556
- }
557
- for (auto& [index, session] : old_sessions) {
558
- session.stop(retry_reason::do_not_retry);
461
+ std::scoped_lock lock(self->sessions_mutex_);
462
+ self->sessions_.insert_or_assign(this_index, std::move(new_session));
559
463
  }
464
+ self->update_config(cfg);
465
+ self->drain_deferred_queue();
466
+ self->poll_config({});
467
+ }
468
+ asio::post(
469
+ asio::bind_executor(self->ctx_, [h = std::move(h), ec, cfg = std::move(cfg)]() mutable {
470
+ h(ec, cfg);
471
+ }));
472
+ });
473
+ }
474
+
475
+ void with_configuration(
476
+ utils::movable_function<void(std::error_code, topology::configuration)>&& handler)
477
+ {
478
+ if (closed_) {
479
+ return handler(errc::network::configuration_not_available, topology::configuration{});
560
480
  }
561
-
562
- /**
563
- * copies nodes from rhs that are not in lhs to output vector
564
- */
565
- void diff_nodes(const std::vector<topology::configuration::node>& lhs,
566
- const std::vector<topology::configuration::node>& rhs,
567
- std::vector<topology::configuration::node>& output)
568
- {
569
- for (const auto& re : rhs) {
570
- bool known = false;
571
- const auto& rhost = re.hostname_for(origin_.options().network);
572
- const auto rport = re.port_or(origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
573
- for (const auto& le : lhs) {
574
- const auto& lhost = le.hostname_for(origin_.options().network);
575
- const auto lport = le.port_or(origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
576
- if (rhost == lhost && rport == lport) {
577
- known = true;
578
- break;
579
- }
580
- }
581
- if (!known) {
582
- output.push_back(re);
583
- }
584
- }
481
+ if (configured_) {
482
+ std::optional<topology::configuration> config{};
483
+ {
484
+ std::scoped_lock config_lock(config_mutex_);
485
+ config = config_;
486
+ }
487
+ if (config) {
488
+ return handler({}, config.value());
489
+ }
490
+ return handler(errc::network::configuration_not_available, topology::configuration{});
585
491
  }
586
-
587
- void update_config(topology::configuration config) override
492
+ std::scoped_lock lock(deferred_commands_mutex_);
493
+ deferred_commands_.emplace([self = shared_from_this(), handler = std::move(handler)]() mutable {
494
+ if (self->closed_ || !self->configured_) {
495
+ return handler(errc::network::configuration_not_available, topology::configuration{});
496
+ }
497
+
498
+ std::optional<topology::configuration> config{};
499
+ {
500
+ std::scoped_lock config_lock(self->config_mutex_);
501
+ config = self->config_;
502
+ }
503
+ if (config) {
504
+ return handler({}, config.value());
505
+ }
506
+ return handler(errc::network::configuration_not_available, topology::configuration{});
507
+ });
508
+ }
509
+
510
+ void drain_deferred_queue()
511
+ {
512
+ std::queue<utils::movable_function<void()>> commands{};
588
513
  {
589
- std::vector<topology::configuration::node> added{};
590
- std::vector<topology::configuration::node> removed{};
591
- bool sequence_changed = false;
592
- {
593
- std::scoped_lock lock(config_mutex_);
594
- // MB-60405 fixes this for 7.6.2, but for earlier versions we need to protect against using a
595
- // config that has an empty vbucket map. Ideally we only run into this condition on initial
596
- // bootstrap and that is handled in the session's update_config(), but just in case, only accept
597
- // a config w/ a non-empty vbucket map.
598
- if (config.vbmap && config.vbmap->size() == 0) {
599
- if (!config_) {
600
- CB_LOG_WARNING("{} will not initialize configuration rev={} because config has an empty partition map",
601
- log_prefix_,
602
- config.rev_str());
603
- } else {
604
- CB_LOG_WARNING("{} will not update the configuration old={} -> new={}, because new config has an empty partition map",
605
- log_prefix_,
606
- config_->rev_str(),
607
- config.rev_str());
608
- }
609
- // this is to make sure we can get a correct config soon
610
- poll_config(errc::network::configuration_not_available);
611
- return;
612
- } else if (!config_) {
613
- CB_LOG_DEBUG("{} initialize configuration rev={}", log_prefix_, config.rev_str());
614
- } else if (config.force) {
615
- CB_LOG_DEBUG("{} forced to accept configuration rev={}", log_prefix_, config.rev_str());
616
- } else if (!config.vbmap) {
617
- CB_LOG_DEBUG("{} will not update the configuration old={} -> new={}, because new config does not have partition map",
618
- log_prefix_,
619
- config_->rev_str(),
620
- config.rev_str());
621
- return;
622
- } else if (config_ < config) {
623
- CB_LOG_DEBUG("{} will update the configuration old={} -> new={}", log_prefix_, config_->rev_str(), config.rev_str());
624
- } else {
625
- return;
626
- }
627
-
628
- if (config_) {
629
- diff_nodes(config_->nodes, config.nodes, added);
630
- diff_nodes(config.nodes, config_->nodes, removed);
631
- if (added.empty() && removed.empty() && config.nodes.size() == config_->nodes.size()) {
632
- for (std::size_t i = 0; i < config.nodes.size(); ++i) {
633
- if (config.nodes[i] != config_->nodes[i]) {
634
- sequence_changed = true;
635
- break;
636
- }
637
- }
638
- } else {
639
- sequence_changed = true;
640
- }
641
- } else {
642
- sequence_changed = true;
643
- added = config.nodes;
644
- }
645
- config_.reset();
646
- config_ = config;
647
- configured_ = true;
648
-
649
- {
650
- std::scoped_lock listeners_lock(config_listeners_mutex_);
651
- for (const auto& listener : config_listeners_) {
652
- listener->update_config(*config_);
653
- }
654
- }
655
- }
656
- if (!added.empty() || !removed.empty() || sequence_changed) {
657
- std::scoped_lock lock(sessions_mutex_);
658
- std::map<size_t, io::mcbp_session> new_sessions{};
659
-
660
- std::size_t next_index{ 0 };
661
- for (const auto& node : config.nodes) {
662
- const auto& hostname = node.hostname_for(origin_.options().network);
663
- auto port = node.port_or(origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
664
- if (port == 0) {
665
- continue;
666
- }
667
-
668
- bool reused_session{ false };
669
- for (auto it = sessions_.begin(); it != sessions_.end(); ++it) {
670
- if (it->second.bootstrap_hostname() == hostname && it->second.bootstrap_port_number() == port) {
671
- CB_LOG_DEBUG(R"({} rev={}, preserve session="{}", address="{}:{}", index={}->{})",
672
- log_prefix_,
673
- config.rev_str(),
674
- it->second.id(),
675
- it->second.bootstrap_hostname(),
676
- it->second.bootstrap_port(),
677
- it->first,
678
- next_index);
679
- new_sessions.insert_or_assign(next_index, std::move(it->second));
680
- reused_session = true;
681
- ++next_index;
682
- sessions_.erase(it);
683
- break;
684
- }
685
- }
686
- if (reused_session) {
687
- continue;
688
- }
689
-
690
- couchbase::core::origin origin(origin_.credentials(), hostname, port, origin_.options());
691
- io::mcbp_session session = origin_.options().enable_tls
692
- ? io::mcbp_session(client_id_, ctx_, tls_, origin, state_listener_, name_, known_features_)
693
- : io::mcbp_session(client_id_, ctx_, origin, state_listener_, name_, known_features_);
694
- CB_LOG_DEBUG(R"({} rev={}, add session="{}", address="{}:{}", index={})",
695
- log_prefix_,
696
- config.rev_str(),
697
- session.id(),
698
- hostname,
699
- port,
700
- node.index);
701
- session.bootstrap(
702
- [self = shared_from_this(), session, idx = next_index](std::error_code err, topology::configuration cfg) mutable {
703
- if (err) {
704
- CB_LOG_WARNING(R"({} failed to bootstrap session="{}", address="{}:{}", index={}, ec={})",
705
- session.log_prefix(),
706
- session.id(),
707
- session.bootstrap_hostname(),
708
- session.bootstrap_port(),
709
- idx,
710
- err.message());
711
- return self->remove_session(session.id());
712
- }
713
- self->update_config(std::move(cfg));
714
- session.on_configuration_update(self);
715
- session.on_stop([id = session.id(), self]() { self->remove_session(id); });
716
- self->drain_deferred_queue();
717
- },
718
- true);
719
- new_sessions.insert_or_assign(next_index, std::move(session));
720
- ++next_index;
721
- }
722
- std::swap(sessions_, new_sessions);
723
-
724
- for (auto it = new_sessions.begin(); it != new_sessions.end(); ++it) {
725
- CB_LOG_DEBUG(R"({} rev={}, drop session="{}", address="{}:{}", index={})",
726
- log_prefix_,
727
- config.rev_str(),
728
- it->second.id(),
729
- it->second.bootstrap_hostname(),
730
- it->second.bootstrap_port(),
731
- it->first);
732
- asio::post(asio::bind_executor(
733
- ctx_, [session = std::move(it->second)]() mutable { return session.stop(retry_reason::do_not_retry); }));
734
- }
735
- }
514
+ std::scoped_lock lock(deferred_commands_mutex_);
515
+ std::swap(deferred_commands_, commands);
736
516
  }
737
-
738
- [[nodiscard]] auto find_session_by_index(std::size_t index) const -> std::optional<io::mcbp_session>
739
- {
740
- std::scoped_lock lock(sessions_mutex_);
741
- if (auto ptr = sessions_.find(index); ptr != sessions_.end()) {
742
- return ptr->second;
743
- }
744
- return {};
517
+ if (!commands.empty()) {
518
+ CB_LOG_TRACE(
519
+ R"({} draining deferred operation queue, size={})", log_prefix_, commands.size());
520
+ }
521
+ while (!commands.empty()) {
522
+ commands.front()();
523
+ commands.pop();
745
524
  }
525
+ }
746
526
 
747
- [[nodiscard]] auto next_session_index() -> std::size_t
527
+ void fetch_config()
528
+ {
529
+ if (closed_) {
530
+ return;
531
+ }
532
+ std::optional<io::mcbp_session> session{};
748
533
  {
749
- std::scoped_lock lock(sessions_mutex_);
750
-
751
- if (auto index = round_robin_next_.fetch_add(1); index < sessions_.size()) {
752
- return index;
534
+ std::scoped_lock lock(sessions_mutex_);
535
+ if (sessions_.empty()) {
536
+ CB_LOG_WARNING(R"({} unable to find connected session (sessions_ is empty), retry in {})",
537
+ log_prefix_,
538
+ heartbeat_interval_);
539
+ return;
540
+ }
541
+
542
+ std::size_t start = heartbeat_next_index_.fetch_add(1);
543
+ std::size_t i = start;
544
+ do {
545
+ auto ptr = sessions_.find(i % sessions_.size());
546
+ if (ptr != sessions_.end() && ptr->second.is_bootstrapped() &&
547
+ ptr->second.supports_gcccp()) {
548
+ session = ptr->second;
753
549
  }
754
- round_robin_next_ = 0;
755
- return 0;
550
+ i = heartbeat_next_index_.fetch_add(1);
551
+ } while (start % sessions_.size() != i % sessions_.size());
756
552
  }
757
-
758
- [[nodiscard]] auto default_timeout() const -> std::chrono::milliseconds
759
- {
760
- return origin_.options().default_timeout_for(service_type::key_value);
553
+ if (session) {
554
+ protocol::client_request<protocol::get_cluster_config_request_body> req;
555
+ req.opaque(session->next_opaque());
556
+ session->write_and_flush(req.data());
557
+ } else {
558
+ CB_LOG_WARNING(R"({} unable to find connected session with GCCCP support, retry in {})",
559
+ log_prefix_,
560
+ heartbeat_interval_);
761
561
  }
562
+ }
762
563
 
763
- [[nodiscard]] auto name() const -> const std::string&
764
- {
765
- return name_;
564
+ void poll_config(std::error_code ec)
565
+ {
566
+ if (ec == asio::error::operation_aborted || closed_) {
567
+ return;
766
568
  }
767
-
768
- [[nodiscard]] auto log_prefix() const -> const std::string&
769
- {
770
- return client_id_;
569
+ if (heartbeat_timer_.expiry() > std::chrono::steady_clock::now()) {
570
+ return;
771
571
  }
772
572
 
773
- [[nodiscard]] auto is_closed() const -> bool
774
- {
775
- return closed_;
573
+ fetch_config();
574
+
575
+ heartbeat_timer_.expires_after(heartbeat_interval_);
576
+ return heartbeat_timer_.async_wait([self = shared_from_this()](std::error_code e) {
577
+ if (e == asio::error::operation_aborted) {
578
+ return;
579
+ }
580
+ self->poll_config(e);
581
+ });
582
+ }
583
+
584
+ void close()
585
+ {
586
+ if (bool expected_state{ false }; !closed_.compare_exchange_strong(expected_state, true)) {
587
+ return;
776
588
  }
777
589
 
778
- [[nodiscard]] auto is_configured() const -> bool
779
- {
780
- return configured_;
590
+ heartbeat_timer_.cancel();
591
+
592
+ drain_deferred_queue();
593
+
594
+ if (state_listener_ != nullptr) {
595
+ state_listener_->unregister_config_listener(shared_from_this());
781
596
  }
782
597
 
783
- [[nodiscard]] auto tracer() const -> std::shared_ptr<couchbase::tracing::request_tracer>
784
598
  {
785
- return tracer_;
599
+ std::scoped_lock lock(config_listeners_mutex_);
600
+ config_listeners_.clear();
786
601
  }
787
602
 
788
- [[nodiscard]] auto meter() const -> std::shared_ptr<couchbase::metrics::meter>
603
+ std::map<size_t, io::mcbp_session> old_sessions;
789
604
  {
790
- return meter_;
605
+ std::scoped_lock lock(sessions_mutex_);
606
+ std::swap(old_sessions, sessions_);
607
+ }
608
+ for (auto& [index, session] : old_sessions) {
609
+ session.stop(retry_reason::do_not_retry);
610
+ }
611
+ }
612
+
613
+ /**
614
+ * copies nodes from rhs that are not in lhs to output vector
615
+ */
616
+ void diff_nodes(const std::vector<topology::configuration::node>& lhs,
617
+ const std::vector<topology::configuration::node>& rhs,
618
+ std::vector<topology::configuration::node>& output)
619
+ {
620
+ for (const auto& re : rhs) {
621
+ bool known = false;
622
+ const auto& rhost = re.hostname_for(origin_.options().network);
623
+ const auto rport = re.port_or(
624
+ origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
625
+ for (const auto& le : lhs) {
626
+ const auto& lhost = le.hostname_for(origin_.options().network);
627
+ const auto lport = le.port_or(
628
+ origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
629
+ if (rhost == lhost && rport == lport) {
630
+ known = true;
631
+ break;
632
+ }
633
+ }
634
+ if (!known) {
635
+ output.push_back(re);
636
+ }
791
637
  }
638
+ }
792
639
 
793
- void export_diag_info(diag::diagnostics_result& res) const
640
+ void update_config(topology::configuration config) override
641
+ {
642
+ std::vector<topology::configuration::node> added{};
643
+ std::vector<topology::configuration::node> removed{};
644
+ bool sequence_changed = false;
794
645
  {
795
- std::map<size_t, io::mcbp_session> sessions;
796
- {
797
- std::scoped_lock lock(sessions_mutex_);
798
- sessions = sessions_;
646
+ std::scoped_lock lock(config_mutex_);
647
+ // MB-60405 fixes this for 7.6.2, but for earlier versions we need to protect against using a
648
+ // config that has an empty vbucket map. Ideally we only run into this condition on initial
649
+ // bootstrap and that is handled in the session's update_config(), but just in case, only
650
+ // accept a config w/ a non-empty vbucket map.
651
+ if (config.vbmap && config.vbmap->size() == 0) {
652
+ if (!config_) {
653
+ CB_LOG_WARNING(
654
+ "{} will not initialize configuration rev={} because config has an empty partition map",
655
+ log_prefix_,
656
+ config.rev_str());
657
+ } else {
658
+ CB_LOG_WARNING("{} will not update the configuration old={} -> new={}, because new "
659
+ "config has an empty partition map",
660
+ log_prefix_,
661
+ config_->rev_str(),
662
+ config.rev_str());
663
+ }
664
+ // this is to make sure we can get a correct config soon
665
+ poll_config(errc::network::configuration_not_available);
666
+ return;
667
+ } else if (!config_) {
668
+ CB_LOG_DEBUG("{} initialize configuration rev={}", log_prefix_, config.rev_str());
669
+ } else if (config.force) {
670
+ CB_LOG_DEBUG("{} forced to accept configuration rev={}", log_prefix_, config.rev_str());
671
+ } else if (!config.vbmap) {
672
+ CB_LOG_DEBUG("{} will not update the configuration old={} -> new={}, because new config "
673
+ "does not have partition map",
674
+ log_prefix_,
675
+ config_->rev_str(),
676
+ config.rev_str());
677
+ return;
678
+ } else if (config_ < config) {
679
+ CB_LOG_DEBUG("{} will update the configuration old={} -> new={}",
680
+ log_prefix_,
681
+ config_->rev_str(),
682
+ config.rev_str());
683
+ } else {
684
+ return;
685
+ }
686
+
687
+ if (config_) {
688
+ diff_nodes(config_->nodes, config.nodes, added);
689
+ diff_nodes(config.nodes, config_->nodes, removed);
690
+ if (added.empty() && removed.empty() && config.nodes.size() == config_->nodes.size()) {
691
+ for (std::size_t i = 0; i < config.nodes.size(); ++i) {
692
+ if (config.nodes[i] != config_->nodes[i]) {
693
+ sequence_changed = true;
694
+ break;
695
+ }
696
+ }
697
+ } else {
698
+ sequence_changed = true;
799
699
  }
800
- for (const auto& [index, session] : sessions) {
801
- res.services[service_type::key_value].emplace_back(session.diag_info());
700
+ } else {
701
+ sequence_changed = true;
702
+ added = config.nodes;
703
+ }
704
+ config_.reset();
705
+ config_ = config;
706
+ configured_ = true;
707
+
708
+ {
709
+ std::scoped_lock listeners_lock(config_listeners_mutex_);
710
+ for (const auto& listener : config_listeners_) {
711
+ listener->update_config(*config_);
802
712
  }
713
+ }
803
714
  }
715
+ if (!added.empty() || !removed.empty() || sequence_changed) {
716
+ std::scoped_lock lock(sessions_mutex_);
717
+ std::map<size_t, io::mcbp_session> new_sessions{};
718
+
719
+ std::size_t next_index{ 0 };
720
+ for (const auto& node : config.nodes) {
721
+ const auto& hostname = node.hostname_for(origin_.options().network);
722
+ auto port = node.port_or(
723
+ origin_.options().network, service_type::key_value, origin_.options().enable_tls, 0);
724
+ if (port == 0) {
725
+ continue;
726
+ }
804
727
 
805
- void ping(std::shared_ptr<diag::ping_collector> collector, std::optional<std::chrono::milliseconds> timeout)
806
- {
807
- std::map<size_t, io::mcbp_session> sessions;
808
- {
809
- std::scoped_lock lock(sessions_mutex_);
810
- sessions = sessions_;
728
+ bool reused_session{ false };
729
+ for (auto it = sessions_.begin(); it != sessions_.end(); ++it) {
730
+ if (it->second.bootstrap_hostname() == hostname &&
731
+ it->second.bootstrap_port_number() == port) {
732
+ CB_LOG_DEBUG(R"({} rev={}, preserve session="{}", address="{}:{}", index={}->{})",
733
+ log_prefix_,
734
+ config.rev_str(),
735
+ it->second.id(),
736
+ it->second.bootstrap_hostname(),
737
+ it->second.bootstrap_port(),
738
+ it->first,
739
+ next_index);
740
+ new_sessions.insert_or_assign(next_index, std::move(it->second));
741
+ reused_session = true;
742
+ ++next_index;
743
+ sessions_.erase(it);
744
+ break;
745
+ }
811
746
  }
812
- for (const auto& [index, session] : sessions) {
813
- session.ping(collector->build_reporter(), timeout);
747
+ if (reused_session) {
748
+ continue;
814
749
  }
815
- }
816
750
 
817
- auto default_retry_strategy() const -> std::shared_ptr<couchbase::retry_strategy>
818
- {
819
- return origin_.options().default_retry_strategy_;
751
+ couchbase::core::origin origin(origin_.credentials(), hostname, port, origin_.options());
752
+ io::mcbp_session session =
753
+ origin_.options().enable_tls
754
+ ? io::mcbp_session(
755
+ client_id_, ctx_, tls_, origin, state_listener_, name_, known_features_)
756
+ : io::mcbp_session(client_id_, ctx_, origin, state_listener_, name_, known_features_);
757
+ CB_LOG_DEBUG(R"({} rev={}, add session="{}", address="{}:{}", index={})",
758
+ log_prefix_,
759
+ config.rev_str(),
760
+ session.id(),
761
+ hostname,
762
+ port,
763
+ node.index);
764
+ session.bootstrap(
765
+ [self = shared_from_this(), session, idx = next_index](
766
+ std::error_code err, topology::configuration cfg) mutable {
767
+ if (err) {
768
+ CB_LOG_WARNING(
769
+ R"({} failed to bootstrap session="{}", address="{}:{}", index={}, ec={})",
770
+ session.log_prefix(),
771
+ session.id(),
772
+ session.bootstrap_hostname(),
773
+ session.bootstrap_port(),
774
+ idx,
775
+ err.message());
776
+ return self->remove_session(session.id());
777
+ }
778
+ self->update_config(std::move(cfg));
779
+ session.on_configuration_update(self);
780
+ session.on_stop([id = session.id(), self]() {
781
+ self->remove_session(id);
782
+ });
783
+ self->drain_deferred_queue();
784
+ },
785
+ true);
786
+ new_sessions.insert_or_assign(next_index, std::move(session));
787
+ ++next_index;
788
+ }
789
+ std::swap(sessions_, new_sessions);
790
+
791
+ for (auto it = new_sessions.begin(); it != new_sessions.end(); ++it) {
792
+ CB_LOG_DEBUG(R"({} rev={}, drop session="{}", address="{}:{}", index={})",
793
+ log_prefix_,
794
+ config.rev_str(),
795
+ it->second.id(),
796
+ it->second.bootstrap_hostname(),
797
+ it->second.bootstrap_port(),
798
+ it->first);
799
+ asio::post(asio::bind_executor(ctx_, [session = std::move(it->second)]() mutable {
800
+ return session.stop(retry_reason::do_not_retry);
801
+ }));
802
+ }
803
+ }
804
+ }
805
+
806
+ [[nodiscard]] auto find_session_by_index(std::size_t index) const
807
+ -> std::optional<io::mcbp_session>
808
+ {
809
+ std::scoped_lock lock(sessions_mutex_);
810
+ if (auto ptr = sessions_.find(index); ptr != sessions_.end()) {
811
+ return ptr->second;
820
812
  }
813
+ return {};
814
+ }
815
+
816
+ [[nodiscard]] auto next_session_index() -> std::size_t
817
+ {
818
+ std::scoped_lock lock(sessions_mutex_);
821
819
 
822
- void on_configuration_update(std::shared_ptr<config_listener> handler)
820
+ if (auto index = round_robin_next_.fetch_add(1); index < sessions_.size()) {
821
+ return index;
822
+ }
823
+ round_robin_next_ = 0;
824
+ return 0;
825
+ }
826
+
827
+ [[nodiscard]] auto default_timeout() const -> std::chrono::milliseconds
828
+ {
829
+ return origin_.options().default_timeout_for(service_type::key_value);
830
+ }
831
+
832
+ [[nodiscard]] auto name() const -> const std::string&
833
+ {
834
+ return name_;
835
+ }
836
+
837
+ [[nodiscard]] auto log_prefix() const -> const std::string&
838
+ {
839
+ return client_id_;
840
+ }
841
+
842
+ [[nodiscard]] auto is_closed() const -> bool
843
+ {
844
+ return closed_;
845
+ }
846
+
847
+ [[nodiscard]] auto is_configured() const -> bool
848
+ {
849
+ return configured_;
850
+ }
851
+
852
+ [[nodiscard]] auto tracer() const -> std::shared_ptr<couchbase::tracing::request_tracer>
853
+ {
854
+ return tracer_;
855
+ }
856
+
857
+ [[nodiscard]] auto meter() const -> std::shared_ptr<couchbase::metrics::meter>
858
+ {
859
+ return meter_;
860
+ }
861
+
862
+ void export_diag_info(diag::diagnostics_result& res) const
863
+ {
864
+ std::map<size_t, io::mcbp_session> sessions;
823
865
  {
824
- std::scoped_lock lock(config_listeners_mutex_);
825
- config_listeners_.emplace_back(std::move(handler));
866
+ std::scoped_lock lock(sessions_mutex_);
867
+ sessions = sessions_;
868
+ }
869
+ for (const auto& [index, session] : sessions) {
870
+ res.services[service_type::key_value].emplace_back(session.diag_info());
826
871
  }
872
+ }
827
873
 
828
- auto defer_command(utils::movable_function<void()> command) -> std::error_code
874
+ void ping(std::shared_ptr<diag::ping_collector> collector,
875
+ std::optional<std::chrono::milliseconds> timeout)
876
+ {
877
+ std::map<size_t, io::mcbp_session> sessions;
829
878
  {
830
- std::scoped_lock lock_for_deferred_commands(deferred_commands_mutex_);
831
- deferred_commands_.emplace(std::move(command));
832
- return {};
879
+ std::scoped_lock lock(sessions_mutex_);
880
+ sessions = sessions_;
833
881
  }
834
-
835
- private:
836
- const std::string client_id_;
837
- const std::string name_;
838
- const std::string log_prefix_;
839
- const origin origin_;
840
- const std::shared_ptr<couchbase::tracing::request_tracer> tracer_;
841
- const std::shared_ptr<couchbase::metrics::meter> meter_;
842
- const std::vector<protocol::hello_feature> known_features_;
843
- const std::shared_ptr<impl::bootstrap_state_listener> state_listener_;
844
- mcbp::codec codec_;
845
-
846
- asio::io_context& ctx_;
847
- asio::ssl::context& tls_;
848
-
849
- asio::steady_timer heartbeat_timer_;
850
- std::chrono::milliseconds heartbeat_interval_;
851
- std::atomic_size_t heartbeat_next_index_{ 0 };
852
-
853
- std::atomic_bool closed_{ false };
854
- std::atomic_bool configured_{ false };
855
-
856
- std::optional<topology::configuration> config_{};
857
- mutable std::mutex config_mutex_{};
858
-
859
- std::vector<std::shared_ptr<config_listener>> config_listeners_{};
860
- std::mutex config_listeners_mutex_{};
861
-
862
- std::queue<utils::movable_function<void()>> deferred_commands_{};
863
- std::mutex deferred_commands_mutex_{};
864
-
865
- std::map<size_t, io::mcbp_session> sessions_{};
866
- mutable std::mutex sessions_mutex_{};
867
- std::atomic_size_t round_robin_next_{ 0 };
882
+ for (const auto& [index, session] : sessions) {
883
+ session.ping(collector->build_reporter(), timeout);
884
+ }
885
+ }
886
+
887
+ auto default_retry_strategy() const -> std::shared_ptr<couchbase::retry_strategy>
888
+ {
889
+ return origin_.options().default_retry_strategy_;
890
+ }
891
+
892
+ void on_configuration_update(std::shared_ptr<config_listener> handler)
893
+ {
894
+ std::scoped_lock lock(config_listeners_mutex_);
895
+ config_listeners_.emplace_back(std::move(handler));
896
+ }
897
+
898
+ auto defer_command(utils::movable_function<void()> command) -> std::error_code
899
+ {
900
+ std::scoped_lock lock_for_deferred_commands(deferred_commands_mutex_);
901
+ deferred_commands_.emplace(std::move(command));
902
+ return {};
903
+ }
904
+
905
+ private:
906
+ const std::string client_id_;
907
+ const std::string name_;
908
+ const std::string log_prefix_;
909
+ const origin origin_;
910
+ const std::shared_ptr<couchbase::tracing::request_tracer> tracer_;
911
+ const std::shared_ptr<couchbase::metrics::meter> meter_;
912
+ const std::vector<protocol::hello_feature> known_features_;
913
+ const std::shared_ptr<impl::bootstrap_state_listener> state_listener_;
914
+ mcbp::codec codec_;
915
+
916
+ asio::io_context& ctx_;
917
+ asio::ssl::context& tls_;
918
+
919
+ asio::steady_timer heartbeat_timer_;
920
+ std::chrono::milliseconds heartbeat_interval_;
921
+ std::atomic_size_t heartbeat_next_index_{ 0 };
922
+
923
+ std::atomic_bool closed_{ false };
924
+ std::atomic_bool configured_{ false };
925
+
926
+ std::optional<topology::configuration> config_{};
927
+ mutable std::mutex config_mutex_{};
928
+
929
+ std::vector<std::shared_ptr<config_listener>> config_listeners_{};
930
+ std::mutex config_listeners_mutex_{};
931
+
932
+ std::queue<utils::movable_function<void()>> deferred_commands_{};
933
+ std::mutex deferred_commands_mutex_{};
934
+
935
+ std::map<size_t, io::mcbp_session> sessions_{};
936
+ mutable std::mutex sessions_mutex_{};
937
+ std::atomic_size_t round_robin_next_{ 0 };
868
938
  };
869
939
 
870
940
  bucket::bucket(std::string client_id,
@@ -892,144 +962,146 @@ bucket::bucket(std::string client_id,
892
962
 
893
963
  bucket::~bucket()
894
964
  {
895
- impl_->close();
965
+ impl_->close();
896
966
  }
897
967
 
898
968
  void
899
969
  bucket::export_diag_info(diag::diagnostics_result& res) const
900
970
  {
901
- return impl_->export_diag_info(res);
971
+ return impl_->export_diag_info(res);
902
972
  }
903
973
 
904
974
  void
905
- bucket::ping(std::shared_ptr<diag::ping_collector> collector, std::optional<std::chrono::milliseconds> timeout)
975
+ bucket::ping(std::shared_ptr<diag::ping_collector> collector,
976
+ std::optional<std::chrono::milliseconds> timeout)
906
977
  {
907
- return impl_->ping(std::move(collector), std::move(timeout));
978
+ return impl_->ping(std::move(collector), std::move(timeout));
908
979
  }
909
980
 
910
981
  void
911
982
  bucket::fetch_config()
912
983
  {
913
- return impl_->fetch_config();
984
+ return impl_->fetch_config();
914
985
  }
915
986
 
916
987
  void
917
988
  bucket::update_config(topology::configuration config)
918
989
  {
919
- return impl_->update_config(std::move(config));
990
+ return impl_->update_config(std::move(config));
920
991
  }
921
992
 
922
993
  const std::string&
923
994
  bucket::name() const
924
995
  {
925
- return impl_->name();
996
+ return impl_->name();
926
997
  }
927
998
 
928
999
  void
929
1000
  bucket::close()
930
1001
  {
931
- return impl_->close();
1002
+ return impl_->close();
932
1003
  }
933
1004
 
934
1005
  const std::string&
935
1006
  bucket::log_prefix() const
936
1007
  {
937
- return impl_->log_prefix();
1008
+ return impl_->log_prefix();
938
1009
  }
939
1010
 
940
1011
  auto
941
1012
  bucket::tracer() const -> std::shared_ptr<couchbase::tracing::request_tracer>
942
1013
  {
943
- return impl_->tracer();
1014
+ return impl_->tracer();
944
1015
  }
945
1016
 
946
1017
  auto
947
1018
  bucket::meter() const -> std::shared_ptr<couchbase::metrics::meter>
948
1019
  {
949
- return impl_->meter();
1020
+ return impl_->meter();
950
1021
  }
951
1022
 
952
1023
  auto
953
1024
  bucket::default_retry_strategy() const -> std::shared_ptr<couchbase::retry_strategy>
954
1025
  {
955
- return impl_->default_retry_strategy();
1026
+ return impl_->default_retry_strategy();
956
1027
  }
957
1028
 
958
1029
  void
959
1030
  bucket::on_configuration_update(std::shared_ptr<config_listener> handler)
960
1031
  {
961
- return impl_->on_configuration_update(std::move(handler));
1032
+ return impl_->on_configuration_update(std::move(handler));
962
1033
  }
963
1034
 
964
1035
  void
965
1036
  bucket::bootstrap(utils::movable_function<void(std::error_code, topology::configuration)>&& handler)
966
1037
  {
967
- return impl_->bootstrap(std::move(handler));
1038
+ return impl_->bootstrap(std::move(handler));
968
1039
  }
969
1040
 
970
1041
  void
971
- bucket::with_configuration(utils::movable_function<void(std::error_code, topology::configuration)>&& handler)
1042
+ bucket::with_configuration(
1043
+ utils::movable_function<void(std::error_code, topology::configuration)>&& handler)
972
1044
  {
973
- return impl_->with_configuration(std::move(handler));
1045
+ return impl_->with_configuration(std::move(handler));
974
1046
  }
975
1047
 
976
1048
  auto
977
1049
  bucket::is_closed() const -> bool
978
1050
  {
979
- return impl_->is_closed();
1051
+ return impl_->is_closed();
980
1052
  }
981
1053
 
982
1054
  auto
983
1055
  bucket::is_configured() const -> bool
984
1056
  {
985
- return impl_->is_configured();
1057
+ return impl_->is_configured();
986
1058
  }
987
1059
 
988
1060
  void
989
1061
  bucket::defer_command(utils::movable_function<void()> command)
990
1062
  {
991
- impl_->defer_command(std::move(command));
1063
+ impl_->defer_command(std::move(command));
992
1064
  }
993
1065
 
994
1066
  auto
995
1067
  bucket::default_timeout() const -> std::chrono::milliseconds
996
1068
  {
997
- return impl_->default_timeout();
1069
+ return impl_->default_timeout();
998
1070
  }
999
1071
 
1000
1072
  auto
1001
1073
  bucket::find_session_by_index(std::size_t index) const -> std::optional<io::mcbp_session>
1002
1074
  {
1003
- return impl_->find_session_by_index(index);
1075
+ return impl_->find_session_by_index(index);
1004
1076
  }
1005
1077
 
1006
1078
  auto
1007
1079
  bucket::next_session_index() -> std::size_t
1008
1080
  {
1009
- return impl_->next_session_index();
1081
+ return impl_->next_session_index();
1010
1082
  }
1011
1083
 
1012
1084
  auto
1013
1085
  bucket::map_id(const document_id& id) -> std::pair<std::uint16_t, std::optional<std::size_t>>
1014
1086
  {
1015
- return impl_->map_id(id);
1087
+ return impl_->map_id(id);
1016
1088
  }
1017
1089
 
1018
1090
  auto
1019
1091
  bucket::config_rev() const -> std::string
1020
1092
  {
1021
- return impl_->config_rev();
1093
+ return impl_->config_rev();
1022
1094
  }
1023
1095
 
1024
1096
  auto
1025
1097
  bucket::direct_dispatch(std::shared_ptr<mcbp::queue_request> req) -> std::error_code
1026
1098
  {
1027
- return impl_->direct_dispatch(std::move(req));
1099
+ return impl_->direct_dispatch(std::move(req));
1028
1100
  }
1029
1101
 
1030
1102
  auto
1031
1103
  bucket::direct_re_queue(std::shared_ptr<mcbp::queue_request> req, bool is_retry) -> std::error_code
1032
1104
  {
1033
- return impl_->direct_re_queue(std::move(req), is_retry);
1105
+ return impl_->direct_re_queue(std::move(req), is_retry);
1034
1106
  }
1035
1107
  } // namespace couchbase::core