couchbase 3.5.1 → 3.5.2

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 (1166) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -1
  3. data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +40 -0
  4. data/ext/CMakeLists.txt +22 -2
  5. data/ext/cache/extconf_include.rb +3 -3
  6. data/ext/cache/mozilla-ca-bundle.crt +19 -32
  7. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  8. data/ext/couchbase/CMakeLists.txt +16 -9
  9. data/ext/couchbase/cmake/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +3 -4
  10. data/ext/couchbase/cmake/CompilerWarnings.cmake +2 -1
  11. data/ext/couchbase/cmake/Packaging.cmake +41 -0
  12. data/ext/couchbase/cmake/Sanitizers.cmake +1 -0
  13. data/ext/couchbase/cmake/VersionInfo.cmake +5 -5
  14. data/ext/couchbase/cmake/build_version.hxx.in +1 -0
  15. data/ext/couchbase/cmake/couchbase-cxx-client.pc.in +10 -0
  16. data/ext/couchbase/cmake/test_boringssl.cxx +1 -1
  17. data/ext/couchbase/cmake/test_openssl.cxx +1 -1
  18. data/ext/couchbase/core/agent.cxx +353 -304
  19. data/ext/couchbase/core/agent.hxx +94 -76
  20. data/ext/couchbase/core/agent_config.cxx +9 -8
  21. data/ext/couchbase/core/agent_config.hxx +7 -7
  22. data/ext/couchbase/core/agent_group.cxx +132 -120
  23. data/ext/couchbase/core/agent_group.hxx +26 -22
  24. data/ext/couchbase/core/agent_group_config.cxx +8 -7
  25. data/ext/couchbase/core/agent_group_config.hxx +6 -6
  26. data/ext/couchbase/core/agent_unit_test_api.hxx +6 -6
  27. data/ext/couchbase/core/analytics_query_options.cxx +21 -21
  28. data/ext/couchbase/core/analytics_query_options.hxx +19 -18
  29. data/ext/couchbase/core/analytics_scan_consistency.hxx +2 -2
  30. data/ext/couchbase/core/bucket.cxx +848 -776
  31. data/ext/couchbase/core/bucket.hxx +151 -139
  32. data/ext/couchbase/core/capella_ca.hxx +20 -19
  33. data/ext/couchbase/core/cluster.cxx +1240 -927
  34. data/ext/couchbase/core/cluster.hxx +254 -167
  35. data/ext/couchbase/core/cluster_agent.cxx +7 -7
  36. data/ext/couchbase/core/cluster_agent.hxx +4 -4
  37. data/ext/couchbase/core/cluster_agent_config.cxx +8 -7
  38. data/ext/couchbase/core/cluster_agent_config.hxx +6 -6
  39. data/ext/couchbase/core/cluster_options.cxx +17 -17
  40. data/ext/couchbase/core/cluster_options.hxx +50 -47
  41. data/ext/couchbase/core/cluster_state.hxx +3 -3
  42. data/ext/couchbase/core/collection_id_cache_entry.hxx +5 -4
  43. data/ext/couchbase/core/collections_component.cxx +372 -329
  44. data/ext/couchbase/core/collections_component.hxx +17 -13
  45. data/ext/couchbase/core/collections_component_unit_test_api.hxx +6 -6
  46. data/ext/couchbase/core/collections_options.hxx +29 -27
  47. data/ext/couchbase/core/config_listener.hxx +3 -3
  48. data/ext/couchbase/core/config_profile.hxx +3 -3
  49. data/ext/couchbase/core/config_profiles.cxx +31 -31
  50. data/ext/couchbase/core/config_profiles.hxx +19 -19
  51. data/ext/couchbase/core/core_sdk_shim.cxx +2 -1
  52. data/ext/couchbase/core/core_sdk_shim.hxx +2 -2
  53. data/ext/couchbase/core/crud_component.cxx +310 -276
  54. data/ext/couchbase/core/crud_component.hxx +21 -15
  55. data/ext/couchbase/core/crud_options.hxx +361 -354
  56. data/ext/couchbase/core/crypto/cbcrypto.cc +732 -627
  57. data/ext/couchbase/core/crypto/cbcrypto.h +12 -3
  58. data/ext/couchbase/core/design_document_namespace.hxx +2 -2
  59. data/ext/couchbase/core/design_document_namespace_fmt.hxx +18 -18
  60. data/ext/couchbase/core/diagnostics.hxx +44 -44
  61. data/ext/couchbase/core/diagnostics_fmt.hxx +76 -76
  62. data/ext/couchbase/core/diagnostics_json.hxx +61 -60
  63. data/ext/couchbase/core/diagntostics_options.hxx +14 -14
  64. data/ext/couchbase/core/dispatcher.cxx +4 -3
  65. data/ext/couchbase/core/dispatcher.hxx +8 -7
  66. data/ext/couchbase/core/document_id.cxx +37 -34
  67. data/ext/couchbase/core/document_id.hxx +87 -86
  68. data/ext/couchbase/core/document_id_fmt.hxx +10 -10
  69. data/ext/couchbase/core/durability_options.hxx +50 -49
  70. data/ext/couchbase/core/error_context/analytics.hxx +18 -18
  71. data/ext/couchbase/core/error_context/analytics_json.hxx +115 -0
  72. data/ext/couchbase/core/error_context/base_error_context.hxx +184 -0
  73. data/ext/couchbase/core/error_context/http.hxx +14 -14
  74. data/ext/couchbase/core/error_context/http_json.hxx +90 -0
  75. data/ext/couchbase/core/error_context/internal_tof_metadata_json.hxx +36 -0
  76. data/ext/couchbase/core/error_context/key_value.cxx +27 -27
  77. data/ext/couchbase/core/error_context/key_value.hxx +41 -38
  78. data/ext/couchbase/core/error_context/key_value_error_context.hxx +235 -0
  79. data/ext/couchbase/core/error_context/key_value_error_map_attribute.hxx +142 -0
  80. data/ext/couchbase/core/error_context/key_value_error_map_info.hxx +139 -0
  81. data/ext/couchbase/core/error_context/key_value_extended_error_info.hxx +86 -0
  82. data/ext/couchbase/core/error_context/key_value_json.hxx +83 -0
  83. data/ext/couchbase/core/error_context/key_value_status_code.hxx +109 -0
  84. data/ext/couchbase/core/error_context/query.hxx +18 -18
  85. data/ext/couchbase/core/error_context/query_error_context.hxx +150 -0
  86. data/ext/couchbase/core/error_context/query_json.hxx +114 -0
  87. data/ext/couchbase/core/error_context/query_public_json.hxx +84 -0
  88. data/ext/couchbase/core/error_context/search.hxx +17 -17
  89. data/ext/couchbase/core/error_context/search_json.hxx +101 -0
  90. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +147 -0
  91. data/ext/couchbase/core/error_context/subdocument_json.hxx +48 -0
  92. data/ext/couchbase/{couchbase → core/error_context}/transaction_error_context.hxx +22 -22
  93. data/ext/couchbase/core/error_context/transaction_op_error_context.hxx +79 -0
  94. data/ext/couchbase/core/error_context/view.hxx +17 -17
  95. data/ext/couchbase/core/fmt/key_value_error_map_attribute.hxx +100 -0
  96. data/ext/couchbase/{couchbase → core}/fmt/key_value_extended_error_info.hxx +20 -20
  97. data/ext/couchbase/core/fmt/key_value_status_code.hxx +269 -0
  98. data/ext/couchbase/core/free_form_http_request.cxx +26 -26
  99. data/ext/couchbase/core/free_form_http_request.hxx +34 -33
  100. data/ext/couchbase/core/impl/analytics.cxx +111 -131
  101. data/ext/couchbase/core/impl/analytics.hxx +5 -7
  102. data/ext/couchbase/core/impl/analytics_error_category.cxx +29 -28
  103. data/ext/couchbase/core/impl/analytics_index_manager.cxx +615 -516
  104. data/ext/couchbase/core/impl/best_effort_retry_strategy.cxx +53 -50
  105. data/ext/couchbase/core/impl/binary_collection.cxx +346 -285
  106. data/ext/couchbase/core/impl/boolean_field_query.cxx +10 -10
  107. data/ext/couchbase/core/impl/boolean_query.cxx +27 -27
  108. data/ext/couchbase/core/impl/bootstrap_state_listener.hxx +6 -6
  109. data/ext/couchbase/core/impl/bucket.cxx +39 -34
  110. data/ext/couchbase/core/impl/bucket_manager.cxx +354 -313
  111. data/ext/couchbase/core/impl/cluster.cxx +430 -325
  112. data/ext/couchbase/core/impl/collection.cxx +1033 -1187
  113. data/ext/couchbase/core/impl/collection_manager.cxx +201 -170
  114. data/ext/couchbase/core/impl/common_error_category.cxx +58 -55
  115. data/ext/couchbase/core/impl/configuration_profiles_registry.cxx +46 -32
  116. data/ext/couchbase/core/impl/conjunction_query.cxx +17 -17
  117. data/ext/couchbase/core/impl/date_range.cxx +24 -20
  118. data/ext/couchbase/core/impl/date_range_facet.cxx +22 -22
  119. data/ext/couchbase/core/impl/date_range_facet_result.cxx +6 -6
  120. data/ext/couchbase/core/impl/date_range_query.cxx +50 -48
  121. data/ext/couchbase/core/impl/diagnostics.cxx +211 -198
  122. data/ext/couchbase/core/impl/diagnostics.hxx +7 -6
  123. data/ext/couchbase/core/impl/disjunction_query.cxx +18 -17
  124. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +92 -75
  125. data/ext/couchbase/core/impl/dns_srv_tracker.hxx +24 -20
  126. data/ext/couchbase/core/impl/doc_id_query.cxx +9 -9
  127. data/ext/couchbase/core/impl/encoded_search_facet.hxx +2 -2
  128. data/ext/couchbase/core/impl/encoded_search_query.hxx +2 -2
  129. data/ext/couchbase/core/impl/encoded_search_sort.hxx +2 -2
  130. data/ext/couchbase/core/impl/error.cxx +171 -0
  131. data/ext/couchbase/core/impl/error.hxx +64 -0
  132. data/ext/couchbase/core/impl/error_context.cxx +56 -0
  133. data/ext/couchbase/core/impl/expiry.cxx +66 -53
  134. data/ext/couchbase/core/impl/fail_fast_retry_strategy.cxx +5 -4
  135. data/ext/couchbase/core/impl/field_level_encryption_error_category.cxx +30 -28
  136. data/ext/couchbase/core/impl/geo_bounding_box_query.cxx +17 -17
  137. data/ext/couchbase/core/impl/geo_distance_query.cxx +14 -14
  138. data/ext/couchbase/core/impl/geo_polygon_query.cxx +17 -17
  139. data/ext/couchbase/core/impl/get_all_replicas.hxx +26 -22
  140. data/ext/couchbase/core/impl/get_any_replica.hxx +25 -23
  141. data/ext/couchbase/core/impl/get_replica.cxx +18 -15
  142. data/ext/couchbase/core/impl/get_replica.hxx +23 -18
  143. data/ext/couchbase/core/impl/internal_date_range_facet_result.cxx +16 -14
  144. data/ext/couchbase/core/impl/internal_date_range_facet_result.hxx +16 -15
  145. data/ext/couchbase/core/impl/internal_error_context.cxx +79 -0
  146. data/ext/couchbase/core/impl/internal_error_context.hxx +52 -0
  147. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.cxx +18 -15
  148. data/ext/couchbase/core/impl/internal_numeric_range_facet_result.hxx +16 -15
  149. data/ext/couchbase/core/impl/internal_scan_result.hxx +7 -7
  150. data/ext/couchbase/core/impl/internal_search_error_context.cxx +25 -22
  151. data/ext/couchbase/core/impl/internal_search_error_context.hxx +32 -31
  152. data/ext/couchbase/core/impl/internal_search_meta_data.cxx +15 -13
  153. data/ext/couchbase/core/impl/internal_search_meta_data.hxx +10 -9
  154. data/ext/couchbase/core/impl/internal_search_result.cxx +30 -22
  155. data/ext/couchbase/core/impl/internal_search_result.hxx +10 -9
  156. data/ext/couchbase/core/impl/internal_search_row.cxx +10 -10
  157. data/ext/couchbase/core/impl/internal_search_row.hxx +16 -16
  158. data/ext/couchbase/core/impl/internal_search_row_location.hxx +2 -2
  159. data/ext/couchbase/core/impl/internal_search_row_locations.cxx +68 -65
  160. data/ext/couchbase/core/impl/internal_search_row_locations.hxx +16 -13
  161. data/ext/couchbase/core/impl/internal_term_facet_result.cxx +16 -14
  162. data/ext/couchbase/core/impl/internal_term_facet_result.hxx +15 -15
  163. data/ext/couchbase/core/impl/key_value_error_category.cxx +73 -72
  164. data/ext/couchbase/core/impl/key_value_error_context.cxx +65 -65
  165. data/ext/couchbase/core/impl/logger.cxx +91 -0
  166. data/ext/couchbase/core/impl/lookup_in_all_replicas.hxx +32 -29
  167. data/ext/couchbase/core/impl/lookup_in_any_replica.hxx +33 -29
  168. data/ext/couchbase/core/impl/lookup_in_replica.cxx +75 -68
  169. data/ext/couchbase/core/impl/lookup_in_replica.hxx +30 -26
  170. data/ext/couchbase/core/impl/management_error_category.cxx +41 -40
  171. data/ext/couchbase/core/impl/match_all_query.cxx +6 -6
  172. data/ext/couchbase/core/impl/match_none_query.cxx +6 -6
  173. data/ext/couchbase/core/impl/match_phrase_query.cxx +13 -13
  174. data/ext/couchbase/core/impl/match_query.cxx +28 -28
  175. data/ext/couchbase/core/impl/network_error_category.cxx +39 -38
  176. data/ext/couchbase/core/impl/numeric_range.cxx +6 -6
  177. data/ext/couchbase/core/impl/numeric_range_facet.cxx +22 -22
  178. data/ext/couchbase/core/impl/numeric_range_facet_result.cxx +6 -6
  179. data/ext/couchbase/core/impl/numeric_range_query.cxx +22 -22
  180. data/ext/couchbase/core/impl/observe_poll.cxx +294 -277
  181. data/ext/couchbase/core/impl/observe_poll.hxx +1 -1
  182. data/ext/couchbase/core/impl/observe_seqno.cxx +21 -18
  183. data/ext/couchbase/core/impl/observe_seqno.hxx +31 -26
  184. data/ext/couchbase/core/impl/phrase_query.cxx +10 -10
  185. data/ext/couchbase/core/impl/prefix_query.cxx +10 -10
  186. data/ext/couchbase/core/impl/query.cxx +163 -154
  187. data/ext/couchbase/core/impl/query.hxx +6 -7
  188. data/ext/couchbase/core/impl/query_error_category.cxx +22 -21
  189. data/ext/couchbase/core/impl/query_error_context.cxx +45 -45
  190. data/ext/couchbase/core/impl/query_index_manager.cxx +488 -408
  191. data/ext/couchbase/core/impl/query_string_query.cxx +7 -7
  192. data/ext/couchbase/core/impl/regexp_query.cxx +10 -10
  193. data/ext/couchbase/core/impl/replica_utils.cxx +66 -0
  194. data/ext/couchbase/core/impl/replica_utils.hxx +48 -0
  195. data/ext/couchbase/core/impl/retry_action.cxx +3 -3
  196. data/ext/couchbase/core/impl/retry_reason.cxx +129 -56
  197. data/ext/couchbase/core/impl/retry_reason.hxx +28 -0
  198. data/ext/couchbase/core/impl/scan_result.cxx +53 -49
  199. data/ext/couchbase/core/impl/scope.cxx +103 -94
  200. data/ext/couchbase/core/impl/search.cxx +139 -130
  201. data/ext/couchbase/core/impl/search.hxx +4 -4
  202. data/ext/couchbase/core/impl/search_error_category.cxx +18 -17
  203. data/ext/couchbase/core/impl/search_index_manager.cxx +492 -390
  204. data/ext/couchbase/core/impl/search_meta_data.cxx +3 -3
  205. data/ext/couchbase/core/impl/search_request.cxx +78 -78
  206. data/ext/couchbase/core/impl/search_result.cxx +5 -5
  207. data/ext/couchbase/core/impl/search_row.cxx +7 -7
  208. data/ext/couchbase/core/impl/search_row_location.cxx +9 -8
  209. data/ext/couchbase/core/impl/search_row_locations.cxx +8 -7
  210. data/ext/couchbase/core/impl/search_sort_field.cxx +53 -53
  211. data/ext/couchbase/core/impl/search_sort_geo_distance.cxx +49 -48
  212. data/ext/couchbase/core/impl/search_sort_id.cxx +10 -10
  213. data/ext/couchbase/core/impl/search_sort_score.cxx +10 -10
  214. data/ext/couchbase/core/impl/streaming_json_lexer_error_category.cxx +70 -68
  215. data/ext/couchbase/core/impl/subdoc/array_add_unique.cxx +6 -6
  216. data/ext/couchbase/core/impl/subdoc/array_append.cxx +6 -6
  217. data/ext/couchbase/core/impl/subdoc/array_insert.cxx +6 -6
  218. data/ext/couchbase/core/impl/subdoc/array_prepend.cxx +6 -6
  219. data/ext/couchbase/core/impl/subdoc/command.hxx +5 -5
  220. data/ext/couchbase/core/impl/subdoc/command_bundle.hxx +11 -11
  221. data/ext/couchbase/core/impl/subdoc/count.cxx +6 -6
  222. data/ext/couchbase/core/impl/subdoc/counter.cxx +6 -6
  223. data/ext/couchbase/core/impl/subdoc/exists.cxx +6 -6
  224. data/ext/couchbase/core/impl/subdoc/get.cxx +6 -6
  225. data/ext/couchbase/core/impl/subdoc/insert.cxx +6 -6
  226. data/ext/couchbase/core/impl/subdoc/join_values.cxx +25 -25
  227. data/ext/couchbase/core/impl/subdoc/lookup_in_macro.cxx +61 -60
  228. data/ext/couchbase/core/impl/subdoc/lookup_in_specs.cxx +9 -9
  229. data/ext/couchbase/core/impl/subdoc/mutate_in_macro.cxx +48 -39
  230. data/ext/couchbase/core/impl/subdoc/mutate_in_specs.cxx +9 -9
  231. data/ext/couchbase/core/impl/subdoc/opcode.hxx +16 -16
  232. data/ext/couchbase/core/impl/subdoc/path_flags.hxx +40 -17
  233. data/ext/couchbase/core/impl/subdoc/remove.cxx +6 -6
  234. data/ext/couchbase/core/impl/subdoc/replace.cxx +6 -6
  235. data/ext/couchbase/core/impl/subdoc/upsert.cxx +6 -6
  236. data/ext/couchbase/core/impl/term_facet.cxx +8 -8
  237. data/ext/couchbase/core/impl/term_facet_result.cxx +6 -6
  238. data/ext/couchbase/core/impl/term_query.cxx +25 -25
  239. data/ext/couchbase/core/impl/term_range_query.cxx +22 -22
  240. data/ext/couchbase/core/impl/transaction_error_category.cxx +21 -20
  241. data/ext/couchbase/core/impl/transaction_get_result.cxx +41 -30
  242. data/ext/couchbase/core/impl/transaction_op_error_category.cxx +55 -56
  243. data/ext/couchbase/core/impl/vector_query.cxx +15 -10
  244. data/ext/couchbase/core/impl/vector_search.cxx +9 -9
  245. data/ext/couchbase/core/impl/view_error_category.cxx +17 -16
  246. data/ext/couchbase/core/impl/wildcard_query.cxx +10 -10
  247. data/ext/couchbase/core/impl/with_legacy_durability.hxx +30 -29
  248. data/ext/couchbase/core/io/dns_client.cxx +257 -232
  249. data/ext/couchbase/core/io/dns_client.hxx +19 -18
  250. data/ext/couchbase/core/io/dns_codec.hxx +156 -154
  251. data/ext/couchbase/core/io/dns_config.cxx +114 -109
  252. data/ext/couchbase/core/io/dns_config.hxx +15 -13
  253. data/ext/couchbase/core/io/dns_message.hxx +365 -342
  254. data/ext/couchbase/core/io/http_command.hxx +155 -134
  255. data/ext/couchbase/core/io/http_context.hxx +5 -5
  256. data/ext/couchbase/core/io/http_message.hxx +75 -71
  257. data/ext/couchbase/core/io/http_parser.cxx +70 -67
  258. data/ext/couchbase/core/io/http_parser.hxx +18 -18
  259. data/ext/couchbase/core/io/http_session.hxx +620 -520
  260. data/ext/couchbase/core/io/http_session_manager.hxx +406 -315
  261. data/ext/couchbase/core/io/http_traits.hxx +7 -0
  262. data/ext/couchbase/core/io/ip_protocol.hxx +3 -3
  263. data/ext/couchbase/core/io/mcbp_command.hxx +298 -278
  264. data/ext/couchbase/core/io/mcbp_context.hxx +7 -6
  265. data/ext/couchbase/core/io/mcbp_message.cxx +8 -8
  266. data/ext/couchbase/core/io/mcbp_message.hxx +19 -19
  267. data/ext/couchbase/core/io/mcbp_parser.cxx +60 -51
  268. data/ext/couchbase/core/io/mcbp_parser.hxx +21 -17
  269. data/ext/couchbase/core/io/mcbp_session.cxx +1769 -1616
  270. data/ext/couchbase/core/io/mcbp_session.hxx +63 -57
  271. data/ext/couchbase/core/io/query_cache.hxx +34 -34
  272. data/ext/couchbase/core/io/retry_context.hxx +45 -45
  273. data/ext/couchbase/core/io/retry_orchestrator.hxx +52 -42
  274. data/ext/couchbase/core/io/streams.hxx +210 -193
  275. data/ext/couchbase/core/json_string.hxx +47 -47
  276. data/ext/couchbase/core/key_value_config.cxx +8 -8
  277. data/ext/couchbase/core/key_value_config.hxx +12 -11
  278. data/ext/couchbase/core/logger/configuration.hxx +35 -35
  279. data/ext/couchbase/core/logger/custom_rotating_file_sink.cxx +73 -72
  280. data/ext/couchbase/core/logger/custom_rotating_file_sink.hxx +20 -18
  281. data/ext/couchbase/core/logger/level.hxx +9 -1
  282. data/ext/couchbase/core/logger/logger.cxx +279 -252
  283. data/ext/couchbase/core/logger/logger.hxx +110 -58
  284. data/ext/couchbase/core/management/analytics_dataset.hxx +4 -4
  285. data/ext/couchbase/core/management/analytics_index.hxx +4 -4
  286. data/ext/couchbase/core/management/analytics_link_azure_blob_external.cxx +35 -33
  287. data/ext/couchbase/core/management/analytics_link_azure_blob_external.hxx +36 -35
  288. data/ext/couchbase/core/management/analytics_link_azure_blob_external_json.hxx +24 -20
  289. data/ext/couchbase/core/management/analytics_link_couchbase_remote.cxx +66 -65
  290. data/ext/couchbase/core/management/analytics_link_couchbase_remote.hxx +77 -70
  291. data/ext/couchbase/core/management/analytics_link_couchbase_remote_json.hxx +38 -32
  292. data/ext/couchbase/core/management/analytics_link_s3_external.cxx +26 -25
  293. data/ext/couchbase/core/management/analytics_link_s3_external.hxx +30 -30
  294. data/ext/couchbase/core/management/analytics_link_s3_external_json.hxx +18 -16
  295. data/ext/couchbase/core/management/bucket_settings.hxx +109 -91
  296. data/ext/couchbase/core/management/bucket_settings_json.hxx +112 -94
  297. data/ext/couchbase/core/management/design_document.hxx +9 -9
  298. data/ext/couchbase/core/management/eventing_function.hxx +124 -121
  299. data/ext/couchbase/core/management/eventing_function_json.hxx +228 -184
  300. data/ext/couchbase/core/management/eventing_status.hxx +41 -41
  301. data/ext/couchbase/core/management/eventing_status_json.hxx +53 -45
  302. data/ext/couchbase/core/management/rbac.hxx +33 -28
  303. data/ext/couchbase/core/management/rbac_fmt.hxx +21 -21
  304. data/ext/couchbase/core/management/rbac_json.hxx +132 -125
  305. data/ext/couchbase/core/management/search_index.cxx +79 -0
  306. data/ext/couchbase/core/management/search_index.hxx +11 -10
  307. data/ext/couchbase/core/management/search_index_json.hxx +27 -26
  308. data/ext/couchbase/core/mcbp/barrier_frame.hxx +4 -3
  309. data/ext/couchbase/core/mcbp/big_endian.cxx +22 -22
  310. data/ext/couchbase/core/mcbp/buffer_writer.cxx +22 -19
  311. data/ext/couchbase/core/mcbp/buffer_writer.hxx +9 -9
  312. data/ext/couchbase/core/mcbp/codec.cxx +419 -397
  313. data/ext/couchbase/core/mcbp/codec.hxx +14 -12
  314. data/ext/couchbase/core/mcbp/command_code.cxx +48 -48
  315. data/ext/couchbase/core/mcbp/completion_token.hxx +33 -33
  316. data/ext/couchbase/core/mcbp/datatype.hxx +3 -3
  317. data/ext/couchbase/core/mcbp/durability_level.hxx +8 -7
  318. data/ext/couchbase/core/mcbp/durability_level_frame.hxx +3 -2
  319. data/ext/couchbase/core/mcbp/durability_timeout_frame.hxx +4 -3
  320. data/ext/couchbase/core/mcbp/open_tracing_frame.hxx +3 -2
  321. data/ext/couchbase/core/mcbp/operation_consumer.cxx +3 -3
  322. data/ext/couchbase/core/mcbp/operation_consumer.hxx +9 -9
  323. data/ext/couchbase/core/mcbp/operation_queue.cxx +76 -70
  324. data/ext/couchbase/core/mcbp/operation_queue.hxx +18 -17
  325. data/ext/couchbase/core/mcbp/packet.cxx +65 -51
  326. data/ext/couchbase/core/mcbp/packet.hxx +25 -25
  327. data/ext/couchbase/core/mcbp/preserve_expiry_frame.hxx +4 -2
  328. data/ext/couchbase/core/mcbp/queue_callback.hxx +3 -2
  329. data/ext/couchbase/core/mcbp/queue_request.cxx +65 -62
  330. data/ext/couchbase/core/mcbp/queue_request.hxx +54 -52
  331. data/ext/couchbase/core/mcbp/queue_request_connection_info.hxx +3 -3
  332. data/ext/couchbase/core/mcbp/queue_response.hxx +7 -7
  333. data/ext/couchbase/core/mcbp/read_units_frame.hxx +3 -2
  334. data/ext/couchbase/core/mcbp/server_duration.cxx +7 -7
  335. data/ext/couchbase/core/mcbp/server_duration_frame.hxx +3 -2
  336. data/ext/couchbase/core/mcbp/stream_id_frame.hxx +3 -2
  337. data/ext/couchbase/core/mcbp/unsupported_frame.hxx +4 -3
  338. data/ext/couchbase/core/mcbp/user_impersonation_frame.hxx +1 -1
  339. data/ext/couchbase/core/mcbp/write_units_frame.hxx +3 -2
  340. data/ext/couchbase/core/meta/features.hxx +58 -0
  341. data/ext/couchbase/core/meta/version.cxx +255 -204
  342. data/ext/couchbase/core/meta/version.hxx +31 -20
  343. data/ext/couchbase/core/metrics/logging_meter.cxx +160 -154
  344. data/ext/couchbase/core/metrics/logging_meter.hxx +16 -15
  345. data/ext/couchbase/core/metrics/logging_meter_options.hxx +1 -1
  346. data/ext/couchbase/core/metrics/noop_meter.hxx +14 -13
  347. data/ext/couchbase/core/mozilla_ca_bundle.hxx +2 -2
  348. data/ext/couchbase/core/n1ql_query_options.cxx +31 -31
  349. data/ext/couchbase/core/n1ql_query_options.hxx +22 -21
  350. data/ext/couchbase/core/operation_map.hxx +3 -3
  351. data/ext/couchbase/core/operations/document_analytics.cxx +187 -176
  352. data/ext/couchbase/core/operations/document_analytics.hxx +79 -71
  353. data/ext/couchbase/core/operations/document_append.cxx +18 -15
  354. data/ext/couchbase/core/operations/document_append.hxx +18 -16
  355. data/ext/couchbase/core/operations/document_decrement.cxx +26 -23
  356. data/ext/couchbase/core/operations/document_decrement.hxx +24 -20
  357. data/ext/couchbase/core/operations/document_exists.cxx +23 -21
  358. data/ext/couchbase/core/operations/document_exists.hxx +25 -23
  359. data/ext/couchbase/core/operations/document_get.cxx +17 -15
  360. data/ext/couchbase/core/operations/document_get.hxx +17 -15
  361. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +121 -92
  362. data/ext/couchbase/core/operations/document_get_and_lock.cxx +19 -16
  363. data/ext/couchbase/core/operations/document_get_and_lock.hxx +21 -17
  364. data/ext/couchbase/core/operations/document_get_and_touch.cxx +19 -16
  365. data/ext/couchbase/core/operations/document_get_and_touch.hxx +22 -18
  366. data/ext/couchbase/core/operations/document_get_any_replica.hxx +111 -82
  367. data/ext/couchbase/core/operations/document_get_projected.cxx +193 -184
  368. data/ext/couchbase/core/operations/document_get_projected.hxx +25 -21
  369. data/ext/couchbase/core/operations/document_increment.cxx +26 -23
  370. data/ext/couchbase/core/operations/document_increment.hxx +24 -20
  371. data/ext/couchbase/core/operations/document_insert.cxx +23 -20
  372. data/ext/couchbase/core/operations/document_insert.hxx +20 -18
  373. data/ext/couchbase/core/operations/document_lookup_in.cxx +80 -67
  374. data/ext/couchbase/core/operations/document_lookup_in.hxx +31 -27
  375. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +187 -149
  376. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +190 -145
  377. data/ext/couchbase/core/operations/document_mutate_in.cxx +98 -80
  378. data/ext/couchbase/core/operations/document_mutate_in.hxx +38 -33
  379. data/ext/couchbase/core/operations/document_prepend.cxx +18 -15
  380. data/ext/couchbase/core/operations/document_prepend.hxx +18 -16
  381. data/ext/couchbase/core/operations/document_query.cxx +367 -356
  382. data/ext/couchbase/core/operations/document_query.hxx +83 -79
  383. data/ext/couchbase/core/operations/document_remove.cxx +18 -15
  384. data/ext/couchbase/core/operations/document_remove.hxx +18 -16
  385. data/ext/couchbase/core/operations/document_replace.cxx +27 -24
  386. data/ext/couchbase/core/operations/document_replace.hxx +22 -20
  387. data/ext/couchbase/core/operations/document_search.cxx +322 -308
  388. data/ext/couchbase/core/operations/document_search.hxx +125 -121
  389. data/ext/couchbase/core/operations/document_touch.cxx +16 -14
  390. data/ext/couchbase/core/operations/document_touch.hxx +19 -17
  391. data/ext/couchbase/core/operations/document_unlock.cxx +16 -14
  392. data/ext/couchbase/core/operations/document_unlock.hxx +19 -17
  393. data/ext/couchbase/core/operations/document_upsert.cxx +26 -23
  394. data/ext/couchbase/core/operations/document_upsert.hxx +21 -19
  395. data/ext/couchbase/core/operations/document_view.cxx +169 -159
  396. data/ext/couchbase/core/operations/document_view.hxx +68 -65
  397. data/ext/couchbase/core/operations/http_noop.cxx +38 -35
  398. data/ext/couchbase/core/operations/http_noop.hxx +12 -10
  399. data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +58 -56
  400. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +20 -17
  401. data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +49 -44
  402. data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +18 -15
  403. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +46 -43
  404. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +16 -13
  405. data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +48 -43
  406. data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +17 -14
  407. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +48 -43
  408. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +17 -14
  409. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +38 -35
  410. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +16 -14
  411. data/ext/couchbase/core/operations/management/analytics_index_create.cxx +68 -66
  412. data/ext/couchbase/core/operations/management/analytics_index_create.hxx +20 -17
  413. data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +56 -51
  414. data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +19 -16
  415. data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +44 -42
  416. data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +16 -13
  417. data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +49 -43
  418. data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +23 -20
  419. data/ext/couchbase/core/operations/management/analytics_link_create.cxx +52 -51
  420. data/ext/couchbase/core/operations/management/analytics_link_create.hxx +33 -30
  421. data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +46 -42
  422. data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +22 -19
  423. data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +70 -67
  424. data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +22 -19
  425. data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +92 -85
  426. data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +27 -24
  427. data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +52 -51
  428. data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +33 -30
  429. data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +6 -4
  430. data/ext/couchbase/core/operations/management/analytics_problem.hxx +2 -2
  431. data/ext/couchbase/core/operations/management/bucket_create.cxx +158 -149
  432. data/ext/couchbase/core/operations/management/bucket_create.hxx +14 -12
  433. data/ext/couchbase/core/operations/management/bucket_describe.cxx +118 -42
  434. data/ext/couchbase/core/operations/management/bucket_describe.hxx +47 -22
  435. data/ext/couchbase/core/operations/management/bucket_drop.cxx +19 -18
  436. data/ext/couchbase/core/operations/management/bucket_drop.hxx +13 -11
  437. data/ext/couchbase/core/operations/management/bucket_flush.cxx +25 -24
  438. data/ext/couchbase/core/operations/management/bucket_flush.hxx +13 -11
  439. data/ext/couchbase/core/operations/management/bucket_get.cxx +24 -22
  440. data/ext/couchbase/core/operations/management/bucket_get.hxx +14 -12
  441. data/ext/couchbase/core/operations/management/bucket_get_all.cxx +25 -23
  442. data/ext/couchbase/core/operations/management/bucket_get_all.hxx +13 -11
  443. data/ext/couchbase/core/operations/management/bucket_update.cxx +112 -107
  444. data/ext/couchbase/core/operations/management/bucket_update.hxx +15 -13
  445. data/ext/couchbase/core/operations/management/change_password.cxx +22 -20
  446. data/ext/couchbase/core/operations/management/change_password.hxx +13 -11
  447. data/ext/couchbase/core/operations/management/cluster_describe.cxx +52 -50
  448. data/ext/couchbase/core/operations/management/cluster_describe.hxx +31 -29
  449. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.cxx +14 -12
  450. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +13 -11
  451. data/ext/couchbase/core/operations/management/collection_create.cxx +48 -46
  452. data/ext/couchbase/core/operations/management/collection_create.hxx +19 -16
  453. data/ext/couchbase/core/operations/management/collection_drop.cxx +37 -35
  454. data/ext/couchbase/core/operations/management/collection_drop.hxx +16 -14
  455. data/ext/couchbase/core/operations/management/collection_update.cxx +49 -47
  456. data/ext/couchbase/core/operations/management/collection_update.hxx +19 -16
  457. data/ext/couchbase/core/operations/management/collections_manifest_get.cxx +11 -9
  458. data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +17 -13
  459. data/ext/couchbase/core/operations/management/error_utils.cxx +210 -198
  460. data/ext/couchbase/core/operations/management/error_utils.hxx +3 -1
  461. data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +30 -28
  462. data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +17 -14
  463. data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +31 -29
  464. data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +17 -14
  465. data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +49 -43
  466. data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +17 -14
  467. data/ext/couchbase/core/operations/management/eventing_get_function.cxx +29 -27
  468. data/ext/couchbase/core/operations/management/eventing_get_function.hxx +18 -15
  469. data/ext/couchbase/core/operations/management/eventing_get_status.cxx +45 -39
  470. data/ext/couchbase/core/operations/management/eventing_get_status.hxx +17 -14
  471. data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +30 -28
  472. data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +17 -14
  473. data/ext/couchbase/core/operations/management/eventing_problem.hxx +3 -3
  474. data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +30 -28
  475. data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +17 -14
  476. data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +30 -28
  477. data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +17 -14
  478. data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +328 -318
  479. data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +17 -14
  480. data/ext/couchbase/core/operations/management/freeform.cxx +23 -22
  481. data/ext/couchbase/core/operations/management/freeform.hxx +19 -17
  482. data/ext/couchbase/core/operations/management/group_drop.cxx +18 -17
  483. data/ext/couchbase/core/operations/management/group_drop.hxx +13 -11
  484. data/ext/couchbase/core/operations/management/group_get.cxx +25 -23
  485. data/ext/couchbase/core/operations/management/group_get.hxx +14 -12
  486. data/ext/couchbase/core/operations/management/group_get_all.cxx +23 -22
  487. data/ext/couchbase/core/operations/management/group_get_all.hxx +13 -11
  488. data/ext/couchbase/core/operations/management/group_upsert.cxx +58 -55
  489. data/ext/couchbase/core/operations/management/group_upsert.hxx +14 -12
  490. data/ext/couchbase/core/operations/management/query_index_build.cxx +53 -48
  491. data/ext/couchbase/core/operations/management/query_index_build.hxx +25 -22
  492. data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +75 -67
  493. data/ext/couchbase/core/operations/management/query_index_create.cxx +128 -122
  494. data/ext/couchbase/core/operations/management/query_index_create.hxx +31 -28
  495. data/ext/couchbase/core/operations/management/query_index_drop.cxx +95 -93
  496. data/ext/couchbase/core/operations/management/query_index_drop.hxx +26 -24
  497. data/ext/couchbase/core/operations/management/query_index_get_all.cxx +97 -93
  498. data/ext/couchbase/core/operations/management/query_index_get_all.hxx +24 -21
  499. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +66 -62
  500. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +24 -22
  501. data/ext/couchbase/core/operations/management/role_get_all.cxx +24 -22
  502. data/ext/couchbase/core/operations/management/role_get_all.hxx +13 -11
  503. data/ext/couchbase/core/operations/management/scope_create.cxx +38 -36
  504. data/ext/couchbase/core/operations/management/scope_create.hxx +15 -13
  505. data/ext/couchbase/core/operations/management/scope_drop.cxx +33 -32
  506. data/ext/couchbase/core/operations/management/scope_drop.hxx +15 -13
  507. data/ext/couchbase/core/operations/management/scope_get_all.cxx +27 -25
  508. data/ext/couchbase/core/operations/management/scope_get_all.hxx +14 -12
  509. data/ext/couchbase/core/operations/management/search_get_stats.cxx +12 -10
  510. data/ext/couchbase/core/operations/management/search_get_stats.hxx +13 -11
  511. data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +72 -67
  512. data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +20 -18
  513. data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +62 -59
  514. data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +19 -16
  515. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +62 -59
  516. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +19 -17
  517. data/ext/couchbase/core/operations/management/search_index_control_query.cxx +62 -59
  518. data/ext/couchbase/core/operations/management/search_index_control_query.hxx +19 -16
  519. data/ext/couchbase/core/operations/management/search_index_drop.cxx +58 -55
  520. data/ext/couchbase/core/operations/management/search_index_drop.hxx +18 -15
  521. data/ext/couchbase/core/operations/management/search_index_get.cxx +59 -56
  522. data/ext/couchbase/core/operations/management/search_index_get.hxx +18 -16
  523. data/ext/couchbase/core/operations/management/search_index_get_all.cxx +51 -46
  524. data/ext/couchbase/core/operations/management/search_index_get_all.hxx +18 -15
  525. data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +66 -61
  526. data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +19 -17
  527. data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +38 -36
  528. data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +17 -14
  529. data/ext/couchbase/core/operations/management/search_index_upsert.cxx +98 -95
  530. data/ext/couchbase/core/operations/management/search_index_upsert.hxx +20 -17
  531. data/ext/couchbase/core/operations/management/user_drop.cxx +18 -17
  532. data/ext/couchbase/core/operations/management/user_drop.hxx +16 -12
  533. data/ext/couchbase/core/operations/management/user_get.cxx +25 -23
  534. data/ext/couchbase/core/operations/management/user_get.hxx +17 -13
  535. data/ext/couchbase/core/operations/management/user_get_all.cxx +24 -22
  536. data/ext/couchbase/core/operations/management/user_get_all.hxx +16 -12
  537. data/ext/couchbase/core/operations/management/user_upsert.cxx +63 -60
  538. data/ext/couchbase/core/operations/management/user_upsert.hxx +17 -13
  539. data/ext/couchbase/core/operations/management/view_index_drop.cxx +16 -12
  540. data/ext/couchbase/core/operations/management/view_index_drop.hxx +15 -13
  541. data/ext/couchbase/core/operations/management/view_index_get.cxx +40 -35
  542. data/ext/couchbase/core/operations/management/view_index_get.hxx +16 -14
  543. data/ext/couchbase/core/operations/management/view_index_get_all.cxx +73 -69
  544. data/ext/couchbase/core/operations/management/view_index_get_all.hxx +16 -13
  545. data/ext/couchbase/core/operations/management/view_index_upsert.cxx +39 -35
  546. data/ext/couchbase/core/operations/management/view_index_upsert.hxx +15 -12
  547. data/ext/couchbase/core/origin.cxx +259 -249
  548. data/ext/couchbase/core/origin.hxx +55 -49
  549. data/ext/couchbase/core/pending_operation.hxx +3 -3
  550. data/ext/couchbase/core/ping_collector.hxx +3 -3
  551. data/ext/couchbase/core/ping_options.hxx +30 -30
  552. data/ext/couchbase/core/ping_reporter.hxx +3 -3
  553. data/ext/couchbase/core/platform/backtrace.c +100 -91
  554. data/ext/couchbase/core/platform/base64.cc +135 -134
  555. data/ext/couchbase/core/platform/dirutils.cc +66 -63
  556. data/ext/couchbase/core/platform/random.cc +43 -42
  557. data/ext/couchbase/core/platform/random.h +4 -4
  558. data/ext/couchbase/core/platform/string_hex.cc +42 -40
  559. data/ext/couchbase/core/platform/terminate_handler.cc +54 -52
  560. data/ext/couchbase/core/platform/uuid.cc +47 -47
  561. data/ext/couchbase/core/protocol/client_opcode.hxx +336 -327
  562. data/ext/couchbase/core/protocol/client_opcode_fmt.hxx +291 -291
  563. data/ext/couchbase/core/protocol/client_request.cxx +13 -10
  564. data/ext/couchbase/core/protocol/client_request.hxx +133 -130
  565. data/ext/couchbase/core/protocol/client_response.cxx +40 -40
  566. data/ext/couchbase/core/protocol/client_response.hxx +153 -150
  567. data/ext/couchbase/core/protocol/cmd_append.cxx +24 -23
  568. data/ext/couchbase/core/protocol/cmd_append.hxx +65 -65
  569. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +25 -21
  570. data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.hxx +33 -25
  571. data/ext/couchbase/core/protocol/cmd_decrement.cxx +38 -38
  572. data/ext/couchbase/core/protocol/cmd_decrement.hxx +87 -87
  573. data/ext/couchbase/core/protocol/cmd_get.cxx +17 -17
  574. data/ext/couchbase/core/protocol/cmd_get.hxx +59 -59
  575. data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +20 -20
  576. data/ext/couchbase/core/protocol/cmd_get_and_lock.hxx +72 -72
  577. data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +20 -20
  578. data/ext/couchbase/core/protocol/cmd_get_and_touch.hxx +72 -72
  579. data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +46 -39
  580. data/ext/couchbase/core/protocol/cmd_get_cluster_config.hxx +57 -49
  581. data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +17 -17
  582. data/ext/couchbase/core/protocol/cmd_get_collection_id.hxx +59 -59
  583. data/ext/couchbase/core/protocol/cmd_get_collections_manifest.cxx +16 -14
  584. data/ext/couchbase/core/protocol/cmd_get_collections_manifest.hxx +39 -39
  585. data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +18 -17
  586. data/ext/couchbase/core/protocol/cmd_get_error_map.hxx +62 -62
  587. data/ext/couchbase/core/protocol/cmd_get_meta.cxx +24 -23
  588. data/ext/couchbase/core/protocol/cmd_get_meta.hxx +81 -79
  589. data/ext/couchbase/core/protocol/cmd_get_replica.cxx +23 -23
  590. data/ext/couchbase/core/protocol/cmd_get_replica.hxx +44 -44
  591. data/ext/couchbase/core/protocol/cmd_hello.cxx +28 -27
  592. data/ext/couchbase/core/protocol/cmd_hello.hxx +106 -105
  593. data/ext/couchbase/core/protocol/cmd_increment.cxx +38 -38
  594. data/ext/couchbase/core/protocol/cmd_increment.hxx +87 -87
  595. data/ext/couchbase/core/protocol/cmd_info.hxx +3 -3
  596. data/ext/couchbase/core/protocol/cmd_insert.cxx +27 -27
  597. data/ext/couchbase/core/protocol/cmd_insert.hxx +81 -81
  598. data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +54 -51
  599. data/ext/couchbase/core/protocol/cmd_lookup_in.hxx +90 -90
  600. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +54 -51
  601. data/ext/couchbase/core/protocol/cmd_lookup_in_replica.hxx +88 -88
  602. data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +105 -97
  603. data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +161 -153
  604. data/ext/couchbase/core/protocol/cmd_noop.cxx +4 -4
  605. data/ext/couchbase/core/protocol/cmd_noop.hxx +32 -32
  606. data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +36 -34
  607. data/ext/couchbase/core/protocol/cmd_observe_seqno.hxx +89 -89
  608. data/ext/couchbase/core/protocol/cmd_prepend.cxx +22 -22
  609. data/ext/couchbase/core/protocol/cmd_prepend.hxx +63 -63
  610. data/ext/couchbase/core/protocol/cmd_remove.cxx +23 -23
  611. data/ext/couchbase/core/protocol/cmd_remove.hxx +54 -54
  612. data/ext/couchbase/core/protocol/cmd_replace.cxx +28 -28
  613. data/ext/couchbase/core/protocol/cmd_replace.hxx +88 -88
  614. data/ext/couchbase/core/protocol/cmd_sasl_auth.cxx +17 -15
  615. data/ext/couchbase/core/protocol/cmd_sasl_auth.hxx +56 -56
  616. data/ext/couchbase/core/protocol/cmd_sasl_list_mechs.cxx +24 -19
  617. data/ext/couchbase/core/protocol/cmd_sasl_list_mechs.hxx +39 -39
  618. data/ext/couchbase/core/protocol/cmd_sasl_step.cxx +17 -15
  619. data/ext/couchbase/core/protocol/cmd_sasl_step.hxx +56 -56
  620. data/ext/couchbase/core/protocol/cmd_select_bucket.cxx +6 -6
  621. data/ext/couchbase/core/protocol/cmd_select_bucket.hxx +36 -36
  622. data/ext/couchbase/core/protocol/cmd_touch.cxx +8 -8
  623. data/ext/couchbase/core/protocol/cmd_touch.hxx +38 -38
  624. data/ext/couchbase/core/protocol/cmd_unlock.cxx +5 -5
  625. data/ext/couchbase/core/protocol/cmd_unlock.hxx +36 -36
  626. data/ext/couchbase/core/protocol/cmd_upsert.cxx +28 -28
  627. data/ext/couchbase/core/protocol/cmd_upsert.hxx +83 -83
  628. data/ext/couchbase/core/protocol/datatype.hxx +19 -18
  629. data/ext/couchbase/core/protocol/frame_info_id.hxx +108 -103
  630. data/ext/couchbase/core/protocol/frame_info_id_fmt.hxx +45 -45
  631. data/ext/couchbase/core/protocol/frame_info_utils.cxx +24 -21
  632. data/ext/couchbase/core/protocol/frame_info_utils.hxx +3 -1
  633. data/ext/couchbase/core/protocol/hello_feature.hxx +211 -175
  634. data/ext/couchbase/core/protocol/hello_feature_fmt.hxx +93 -90
  635. data/ext/couchbase/core/protocol/magic.hxx +24 -24
  636. data/ext/couchbase/core/protocol/magic_fmt.hxx +30 -30
  637. data/ext/couchbase/core/protocol/server_opcode.hxx +11 -11
  638. data/ext/couchbase/core/protocol/server_opcode_fmt.hxx +18 -18
  639. data/ext/couchbase/core/protocol/server_request.hxx +90 -86
  640. data/ext/couchbase/core/protocol/status.cxx +138 -138
  641. data/ext/couchbase/core/protocol/status.hxx +86 -86
  642. data/ext/couchbase/core/query_context.hxx +44 -43
  643. data/ext/couchbase/core/range_scan_load_balancer.cxx +51 -50
  644. data/ext/couchbase/core/range_scan_load_balancer.hxx +26 -25
  645. data/ext/couchbase/core/range_scan_options.cxx +2 -2
  646. data/ext/couchbase/core/range_scan_options.hxx +62 -59
  647. data/ext/couchbase/core/range_scan_orchestrator.cxx +515 -470
  648. data/ext/couchbase/core/range_scan_orchestrator.hxx +23 -18
  649. data/ext/couchbase/core/range_scan_orchestrator_options.hxx +10 -10
  650. data/ext/couchbase/core/resource_units.hxx +2 -2
  651. data/ext/couchbase/core/response_handler.hxx +8 -8
  652. data/ext/couchbase/core/retry_orchestrator.cxx +27 -19
  653. data/ext/couchbase/core/retry_orchestrator.hxx +3 -2
  654. data/ext/couchbase/core/sasl/client.cc +22 -18
  655. data/ext/couchbase/core/sasl/client.h +66 -62
  656. data/ext/couchbase/core/sasl/context.cc +4 -4
  657. data/ext/couchbase/core/sasl/context.h +19 -19
  658. data/ext/couchbase/core/sasl/error.h +12 -1
  659. data/ext/couchbase/core/sasl/error_fmt.h +42 -42
  660. data/ext/couchbase/core/sasl/mechanism.cc +13 -10
  661. data/ext/couchbase/core/sasl/mechanism.h +8 -3
  662. data/ext/couchbase/core/sasl/plain/plain.cc +8 -8
  663. data/ext/couchbase/core/sasl/plain/plain.h +25 -24
  664. data/ext/couchbase/core/sasl/scram-sha/scram-sha.cc +225 -218
  665. data/ext/couchbase/core/sasl/scram-sha/scram-sha.h +133 -115
  666. data/ext/couchbase/core/sasl/scram-sha/stringutils.cc +20 -20
  667. data/ext/couchbase/core/scan_result.cxx +38 -38
  668. data/ext/couchbase/core/scan_result.hxx +16 -16
  669. data/ext/couchbase/core/search_highlight_style.hxx +4 -1
  670. data/ext/couchbase/core/search_query_options.cxx +21 -21
  671. data/ext/couchbase/core/search_query_options.hxx +19 -18
  672. data/ext/couchbase/core/search_scan_consistency.hxx +3 -1
  673. data/ext/couchbase/core/seed_config.cxx +10 -7
  674. data/ext/couchbase/core/seed_config.hxx +8 -8
  675. data/ext/couchbase/core/service_type.hxx +7 -7
  676. data/ext/couchbase/core/service_type_fmt.hxx +33 -33
  677. data/ext/couchbase/core/stats_options.hxx +13 -13
  678. data/ext/couchbase/core/subdoc_options.hxx +60 -58
  679. data/ext/couchbase/core/tls_verify_mode.hxx +2 -2
  680. data/ext/couchbase/core/topology/capabilities.hxx +83 -83
  681. data/ext/couchbase/core/topology/capabilities_fmt.hxx +111 -111
  682. data/ext/couchbase/core/topology/collections_manifest.hxx +14 -14
  683. data/ext/couchbase/core/topology/collections_manifest_fmt.hxx +23 -21
  684. data/ext/couchbase/core/topology/collections_manifest_json.hxx +26 -25
  685. data/ext/couchbase/core/topology/configuration.cxx +213 -192
  686. data/ext/couchbase/core/topology/configuration.hxx +104 -91
  687. data/ext/couchbase/core/topology/configuration_fmt.hxx +131 -128
  688. data/ext/couchbase/core/topology/configuration_json.hxx +276 -242
  689. data/ext/couchbase/core/topology/error_map.hxx +5 -5
  690. data/ext/couchbase/core/topology/error_map_json.hxx +65 -60
  691. data/ext/couchbase/core/tracing/constants.hxx +153 -153
  692. data/ext/couchbase/core/tracing/noop_tracer.hxx +29 -28
  693. data/ext/couchbase/core/tracing/threshold_logging_options.hxx +30 -30
  694. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +354 -344
  695. data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +12 -12
  696. data/ext/couchbase/core/transactions/active_transaction_record.cxx +153 -33
  697. data/ext/couchbase/core/transactions/active_transaction_record.hxx +30 -118
  698. data/ext/couchbase/core/transactions/async_attempt_context.cxx +8 -2
  699. data/ext/couchbase/core/transactions/async_attempt_context.hxx +163 -127
  700. data/ext/couchbase/core/transactions/atr_cleanup_entry.cxx +358 -334
  701. data/ext/couchbase/core/transactions/atr_ids.cxx +270 -185
  702. data/ext/couchbase/core/transactions/atr_ids.hxx +4 -4
  703. data/ext/couchbase/core/transactions/attempt_context.cxx +9 -5
  704. data/ext/couchbase/core/transactions/attempt_context.hxx +194 -154
  705. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +3278 -2159
  706. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +446 -573
  707. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.cxx +15 -10
  708. data/ext/couchbase/core/transactions/attempt_context_testing_hooks.hxx +58 -49
  709. data/ext/couchbase/core/transactions/attempt_state.hxx +72 -72
  710. data/ext/couchbase/core/transactions/binary.cxx +3 -3
  711. data/ext/couchbase/core/transactions/cleanup_testing_hooks.cxx +2 -2
  712. data/ext/couchbase/core/transactions/cleanup_testing_hooks.hxx +28 -24
  713. data/ext/couchbase/core/transactions/document_metadata.hxx +68 -68
  714. data/ext/couchbase/core/transactions/durability_level.hxx +53 -53
  715. data/ext/couchbase/core/transactions/error_class.hxx +12 -12
  716. data/ext/couchbase/core/transactions/error_list.hxx +22 -22
  717. data/ext/couchbase/core/transactions/exceptions.cxx +167 -114
  718. data/ext/couchbase/core/transactions/exceptions.hxx +170 -139
  719. data/ext/couchbase/core/transactions/exceptions_fmt.hxx +105 -0
  720. data/ext/couchbase/core/transactions/forward_compat.cxx +220 -0
  721. data/ext/couchbase/core/transactions/forward_compat.hxx +63 -207
  722. data/ext/couchbase/core/transactions/internal/atr_cleanup_entry.hxx +110 -102
  723. data/ext/couchbase/core/transactions/internal/atr_entry.hxx +144 -144
  724. data/ext/couchbase/core/transactions/internal/client_record.hxx +53 -50
  725. data/ext/couchbase/core/transactions/internal/doc_record.cxx +5 -5
  726. data/ext/couchbase/core/transactions/internal/doc_record.hxx +38 -35
  727. data/ext/couchbase/core/transactions/internal/doc_record_fmt.hxx +17 -16
  728. data/ext/couchbase/core/transactions/internal/exceptions_internal.hxx +238 -281
  729. data/ext/couchbase/core/transactions/internal/exceptions_internal_fmt.hxx +103 -0
  730. data/ext/couchbase/core/transactions/internal/logging.hxx +52 -29
  731. data/ext/couchbase/core/transactions/internal/transaction_attempt.hxx +3 -3
  732. data/ext/couchbase/core/transactions/internal/transaction_context.hxx +136 -120
  733. data/ext/couchbase/core/transactions/internal/transaction_fields.hxx +2 -1
  734. data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +127 -122
  735. data/ext/couchbase/core/transactions/internal/utils.hxx +244 -219
  736. data/ext/couchbase/core/transactions/result.cxx +41 -40
  737. data/ext/couchbase/core/transactions/result.hxx +143 -141
  738. data/ext/couchbase/core/transactions/result_fmt.hxx +21 -20
  739. data/ext/couchbase/core/transactions/staged_mutation.cxx +759 -627
  740. data/ext/couchbase/core/transactions/staged_mutation.hxx +175 -156
  741. data/ext/couchbase/core/transactions/transaction_context.cxx +231 -179
  742. data/ext/couchbase/core/transactions/transaction_get_result.cxx +185 -198
  743. data/ext/couchbase/core/transactions/transaction_get_result.hxx +207 -222
  744. data/ext/couchbase/core/transactions/transaction_keyspace.cxx +15 -11
  745. data/ext/couchbase/core/transactions/transaction_links.cxx +11 -7
  746. data/ext/couchbase/core/transactions/transaction_links.hxx +222 -201
  747. data/ext/couchbase/core/transactions/transaction_options.cxx +44 -41
  748. data/ext/couchbase/core/transactions/transactions.cxx +167 -125
  749. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +491 -424
  750. data/ext/couchbase/core/transactions/transactions_config.cxx +25 -19
  751. data/ext/couchbase/core/transactions/uid_generator.cxx +3 -3
  752. data/ext/couchbase/core/transactions/uid_generator.hxx +2 -2
  753. data/ext/couchbase/core/transactions/utils.cxx +82 -69
  754. data/ext/couchbase/core/transactions/waitable_op_list.hxx +154 -140
  755. data/ext/couchbase/core/transactions.hxx +184 -180
  756. data/ext/couchbase/core/utils/binary.cxx +3 -3
  757. data/ext/couchbase/core/utils/binary.hxx +19 -15
  758. data/ext/couchbase/core/utils/byteswap.hxx +17 -17
  759. data/ext/couchbase/core/utils/connection_string.cxx +395 -328
  760. data/ext/couchbase/core/utils/connection_string.hxx +37 -36
  761. data/ext/couchbase/core/utils/crc32.hxx +42 -34
  762. data/ext/couchbase/core/utils/duration_parser.cxx +142 -133
  763. data/ext/couchbase/core/utils/duration_parser.hxx +9 -9
  764. data/ext/couchbase/core/utils/join_strings.hxx +24 -24
  765. data/ext/couchbase/core/utils/json.cxx +234 -228
  766. data/ext/couchbase/core/utils/json.hxx +12 -12
  767. data/ext/couchbase/core/utils/json_stream_control.hxx +8 -8
  768. data/ext/couchbase/core/utils/json_streaming_lexer.cxx +288 -263
  769. data/ext/couchbase/core/utils/json_streaming_lexer.hxx +20 -17
  770. data/ext/couchbase/core/utils/keyspace.hxx +22 -21
  771. data/ext/couchbase/core/utils/movable_function.hxx +78 -76
  772. data/ext/couchbase/core/utils/mutation_token.cxx +7 -3
  773. data/ext/couchbase/core/utils/mutation_token.hxx +3 -1
  774. data/ext/couchbase/core/utils/name_codec.hxx +13 -13
  775. data/ext/couchbase/core/utils/split_string.cxx +9 -9
  776. data/ext/couchbase/core/utils/split_string.hxx +2 -2
  777. data/ext/couchbase/core/utils/unsigned_leb128.hxx +92 -88
  778. data/ext/couchbase/core/utils/url_codec.cxx +301 -297
  779. data/ext/couchbase/core/utils/url_codec.hxx +35 -35
  780. data/ext/couchbase/core/vector_query_combination.hxx +4 -1
  781. data/ext/couchbase/core/view_on_error.hxx +4 -3
  782. data/ext/couchbase/core/view_query_options.cxx +21 -21
  783. data/ext/couchbase/core/view_query_options.hxx +23 -22
  784. data/ext/couchbase/core/view_scan_consistency.hxx +3 -3
  785. data/ext/couchbase/core/view_sort_order.hxx +4 -1
  786. data/ext/couchbase/core/wait_until_ready_options.hxx +11 -10
  787. data/ext/couchbase/couchbase/allow_querying_search_index_options.hxx +11 -11
  788. data/ext/couchbase/couchbase/analytics_index_manager.hxx +423 -405
  789. data/ext/couchbase/couchbase/analytics_meta_data.hxx +105 -105
  790. data/ext/couchbase/couchbase/analytics_metrics.hxx +120 -118
  791. data/ext/couchbase/couchbase/analytics_options.hxx +318 -292
  792. data/ext/couchbase/couchbase/analytics_result.hxx +56 -55
  793. data/ext/couchbase/couchbase/analytics_scan_consistency.hxx +24 -21
  794. data/ext/couchbase/couchbase/analytics_status.hxx +10 -10
  795. data/ext/couchbase/couchbase/analytics_warning.hxx +44 -43
  796. data/ext/couchbase/couchbase/analyze_document_options.hxx +9 -9
  797. data/ext/couchbase/couchbase/append_options.hxx +51 -47
  798. data/ext/couchbase/couchbase/behavior_options.hxx +75 -69
  799. data/ext/couchbase/couchbase/best_effort_retry_strategy.hxx +12 -10
  800. data/ext/couchbase/couchbase/binary_collection.hxx +213 -183
  801. data/ext/couchbase/couchbase/boolean_field_query.hxx +38 -38
  802. data/ext/couchbase/couchbase/boolean_query.hxx +166 -157
  803. data/ext/couchbase/couchbase/bucket.hxx +69 -68
  804. data/ext/couchbase/couchbase/bucket_manager.hxx +97 -88
  805. data/ext/couchbase/couchbase/build_query_index_options.hxx +22 -21
  806. data/ext/couchbase/couchbase/cas.hxx +74 -73
  807. data/ext/couchbase/couchbase/certificate_authenticator.hxx +10 -10
  808. data/ext/couchbase/couchbase/cluster.hxx +266 -310
  809. data/ext/couchbase/couchbase/cluster_options.hxx +235 -241
  810. data/ext/couchbase/couchbase/codec/binary_noop_serializer.hxx +11 -11
  811. data/ext/couchbase/couchbase/codec/codec_flags.hxx +39 -35
  812. data/ext/couchbase/couchbase/codec/encoded_value.hxx +15 -2
  813. data/ext/couchbase/couchbase/codec/json_transcoder.hxx +17 -15
  814. data/ext/couchbase/couchbase/codec/raw_binary_transcoder.hxx +19 -17
  815. data/ext/couchbase/couchbase/codec/raw_json_transcoder.hxx +31 -24
  816. data/ext/couchbase/couchbase/codec/raw_string_transcoder.hxx +20 -18
  817. data/ext/couchbase/couchbase/codec/tao_json_serializer.hxx +38 -30
  818. data/ext/couchbase/couchbase/collection.hxx +1007 -902
  819. data/ext/couchbase/couchbase/collection_manager.hxx +115 -107
  820. data/ext/couchbase/couchbase/collection_query_index_manager.hxx +200 -188
  821. data/ext/couchbase/couchbase/common_durability_options.hxx +68 -62
  822. data/ext/couchbase/couchbase/common_options.hxx +67 -67
  823. data/ext/couchbase/couchbase/compression_options.hxx +33 -33
  824. data/ext/couchbase/couchbase/configuration_profile.hxx +12 -11
  825. data/ext/couchbase/couchbase/configuration_profiles_registry.hxx +24 -22
  826. data/ext/couchbase/couchbase/conjunction_query.hxx +47 -45
  827. data/ext/couchbase/couchbase/connect_link_analytics_options.hxx +74 -72
  828. data/ext/couchbase/couchbase/counter_result.hxx +32 -32
  829. data/ext/couchbase/couchbase/create_bucket_options.hxx +9 -10
  830. data/ext/couchbase/couchbase/create_collection_options.hxx +35 -34
  831. data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +76 -76
  832. data/ext/couchbase/couchbase/create_dataverse_analytics_options.hxx +44 -44
  833. data/ext/couchbase/couchbase/create_index_analytics_options.hxx +60 -60
  834. data/ext/couchbase/couchbase/create_link_analytics_options.hxx +25 -25
  835. data/ext/couchbase/couchbase/create_primary_query_index_options.hxx +95 -94
  836. data/ext/couchbase/couchbase/create_query_index_options.hxx +97 -96
  837. data/ext/couchbase/couchbase/create_scope_options.hxx +9 -9
  838. data/ext/couchbase/couchbase/date_range.hxx +29 -27
  839. data/ext/couchbase/couchbase/date_range_facet.hxx +20 -20
  840. data/ext/couchbase/couchbase/date_range_facet_result.hxx +14 -14
  841. data/ext/couchbase/couchbase/date_range_query.hxx +219 -205
  842. data/ext/couchbase/couchbase/decrement_options.hxx +93 -91
  843. data/ext/couchbase/couchbase/diagnostics_options.hxx +42 -41
  844. data/ext/couchbase/couchbase/diagnostics_result.hxx +82 -83
  845. data/ext/couchbase/couchbase/disallow_querying_search_index_options.hxx +11 -10
  846. data/ext/couchbase/couchbase/disconnect_link_analytics_options.hxx +62 -62
  847. data/ext/couchbase/couchbase/disjunction_query.hxx +61 -60
  848. data/ext/couchbase/couchbase/dns_options.hxx +30 -30
  849. data/ext/couchbase/couchbase/doc_id_query.hxx +69 -69
  850. data/ext/couchbase/couchbase/drop_bucket_options.hxx +9 -9
  851. data/ext/couchbase/couchbase/drop_collection_options.hxx +9 -9
  852. data/ext/couchbase/couchbase/drop_dataset_analytics_options.hxx +60 -60
  853. data/ext/couchbase/couchbase/drop_dataverse_analytics_options.hxx +44 -44
  854. data/ext/couchbase/couchbase/drop_index_analytics_options.hxx +60 -60
  855. data/ext/couchbase/couchbase/drop_link_analytics_options.hxx +25 -25
  856. data/ext/couchbase/couchbase/drop_primary_query_index_options.hxx +58 -58
  857. data/ext/couchbase/couchbase/drop_query_index_options.hxx +44 -44
  858. data/ext/couchbase/couchbase/drop_scope_options.hxx +9 -9
  859. data/ext/couchbase/couchbase/drop_search_index_options.hxx +9 -9
  860. data/ext/couchbase/couchbase/durability_level.hxx +32 -29
  861. data/ext/couchbase/couchbase/endpoint_diagnostics.hxx +171 -171
  862. data/ext/couchbase/couchbase/endpoint_ping_report.hxx +166 -169
  863. data/ext/couchbase/couchbase/error.hxx +51 -0
  864. data/ext/couchbase/couchbase/error_codes.hxx +975 -940
  865. data/ext/couchbase/couchbase/error_context.hxx +19 -152
  866. data/ext/couchbase/couchbase/exists_options.hxx +25 -24
  867. data/ext/couchbase/couchbase/exists_result.hxx +32 -32
  868. data/ext/couchbase/couchbase/fail_fast_retry_strategy.hxx +4 -4
  869. data/ext/couchbase/couchbase/flush_bucket_options.hxx +9 -9
  870. data/ext/couchbase/couchbase/fmt/analytics_scan_consistency.hxx +18 -18
  871. data/ext/couchbase/couchbase/fmt/analytics_status.hxx +42 -42
  872. data/ext/couchbase/couchbase/fmt/cas.hxx +10 -10
  873. data/ext/couchbase/couchbase/fmt/durability_level.hxx +24 -24
  874. data/ext/couchbase/couchbase/fmt/error.hxx +53 -0
  875. data/ext/couchbase/couchbase/fmt/error_context.hxx +43 -0
  876. data/ext/couchbase/couchbase/fmt/mutation_token.hxx +15 -11
  877. data/ext/couchbase/couchbase/fmt/query_profile.hxx +21 -21
  878. data/ext/couchbase/couchbase/fmt/query_scan_consistency.hxx +18 -18
  879. data/ext/couchbase/couchbase/fmt/query_status.hxx +42 -42
  880. data/ext/couchbase/couchbase/fmt/retry_reason.hxx +75 -75
  881. data/ext/couchbase/couchbase/fmt/search_scan_consistency.hxx +15 -15
  882. data/ext/couchbase/couchbase/fmt/tls_verify_mode.hxx +18 -18
  883. data/ext/couchbase/couchbase/fmt/transaction_keyspace.hxx +15 -11
  884. data/ext/couchbase/couchbase/fork_event.hxx +12 -12
  885. data/ext/couchbase/couchbase/freeze_plan_search_index_options.hxx +9 -9
  886. data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +71 -64
  887. data/ext/couchbase/couchbase/geo_distance_query.hxx +73 -66
  888. data/ext/couchbase/couchbase/geo_point.hxx +2 -2
  889. data/ext/couchbase/couchbase/geo_polygon_query.hxx +40 -39
  890. data/ext/couchbase/couchbase/get_all_buckets_options.hxx +9 -9
  891. data/ext/couchbase/couchbase/get_all_datasets_analytics_options.hxx +25 -25
  892. data/ext/couchbase/couchbase/get_all_indexes_analytics_options.hxx +26 -25
  893. data/ext/couchbase/couchbase/get_all_query_indexes_options.hxx +27 -25
  894. data/ext/couchbase/couchbase/get_all_replicas_options.hxx +49 -26
  895. data/ext/couchbase/couchbase/get_all_scopes_options.hxx +9 -9
  896. data/ext/couchbase/couchbase/get_all_search_indexes_options.hxx +9 -9
  897. data/ext/couchbase/couchbase/get_and_lock_options.hxx +25 -24
  898. data/ext/couchbase/couchbase/get_and_touch_options.hxx +25 -24
  899. data/ext/couchbase/couchbase/get_any_replica_options.hxx +49 -26
  900. data/ext/couchbase/couchbase/get_bucket_options.hxx +9 -9
  901. data/ext/couchbase/couchbase/get_indexed_search_index_options.hxx +9 -9
  902. data/ext/couchbase/couchbase/get_links_analytics_options.hxx +74 -74
  903. data/ext/couchbase/couchbase/get_options.hxx +63 -60
  904. data/ext/couchbase/couchbase/get_pending_mutations_analytics_options.hxx +30 -28
  905. data/ext/couchbase/couchbase/get_replica_result.hxx +79 -75
  906. data/ext/couchbase/couchbase/get_result.hxx +86 -80
  907. data/ext/couchbase/couchbase/get_search_index_options.hxx +9 -9
  908. data/ext/couchbase/couchbase/highlight_style.hxx +14 -14
  909. data/ext/couchbase/couchbase/increment_options.hxx +94 -91
  910. data/ext/couchbase/couchbase/insert_options.hxx +62 -59
  911. data/ext/couchbase/couchbase/ip_protocol.hxx +3 -3
  912. data/ext/couchbase/couchbase/logger.hxx +51 -0
  913. data/ext/couchbase/couchbase/lookup_in_all_replicas_options.hxx +54 -43
  914. data/ext/couchbase/couchbase/lookup_in_any_replica_options.hxx +54 -44
  915. data/ext/couchbase/couchbase/lookup_in_options.hxx +40 -40
  916. data/ext/couchbase/couchbase/lookup_in_replica_result.hxx +38 -35
  917. data/ext/couchbase/couchbase/lookup_in_result.hxx +222 -216
  918. data/ext/couchbase/couchbase/lookup_in_specs.hxx +101 -101
  919. data/ext/couchbase/couchbase/management/analytics_dataset.hxx +16 -16
  920. data/ext/couchbase/couchbase/management/analytics_index.hxx +16 -16
  921. data/ext/couchbase/couchbase/management/analytics_link.hxx +193 -189
  922. data/ext/couchbase/couchbase/management/bucket_settings.hxx +91 -75
  923. data/ext/couchbase/couchbase/management/collection_spec.hxx +4 -4
  924. data/ext/couchbase/couchbase/management/query_index.hxx +10 -10
  925. data/ext/couchbase/couchbase/management/scope_spec.hxx +2 -2
  926. data/ext/couchbase/couchbase/management/search_index.hxx +9 -9
  927. data/ext/couchbase/couchbase/match_all_query.hxx +10 -9
  928. data/ext/couchbase/couchbase/match_none_query.hxx +10 -9
  929. data/ext/couchbase/couchbase/match_operator.hxx +15 -14
  930. data/ext/couchbase/couchbase/match_phrase_query.hxx +70 -65
  931. data/ext/couchbase/couchbase/match_query.hxx +115 -114
  932. data/ext/couchbase/couchbase/metrics/meter.hxx +33 -30
  933. data/ext/couchbase/couchbase/metrics/otel_meter.hxx +86 -74
  934. data/ext/couchbase/couchbase/metrics_options.hxx +34 -34
  935. data/ext/couchbase/couchbase/mutate_in_options.hxx +160 -149
  936. data/ext/couchbase/couchbase/mutate_in_result.hxx +130 -123
  937. data/ext/couchbase/couchbase/mutate_in_specs.hxx +473 -454
  938. data/ext/couchbase/couchbase/mutation_result.hxx +32 -32
  939. data/ext/couchbase/couchbase/mutation_state.hxx +35 -34
  940. data/ext/couchbase/couchbase/mutation_token.hxx +78 -78
  941. data/ext/couchbase/couchbase/network_options.hxx +101 -72
  942. data/ext/couchbase/couchbase/numeric_range.hxx +26 -26
  943. data/ext/couchbase/couchbase/numeric_range_facet.hxx +20 -20
  944. data/ext/couchbase/couchbase/numeric_range_facet_result.hxx +14 -14
  945. data/ext/couchbase/couchbase/numeric_range_query.hxx +97 -95
  946. data/ext/couchbase/couchbase/password_authenticator.hxx +17 -17
  947. data/ext/couchbase/couchbase/pause_ingest_search_index_options.hxx +11 -10
  948. data/ext/couchbase/couchbase/persist_to.hxx +45 -44
  949. data/ext/couchbase/couchbase/phrase_query.hxx +69 -65
  950. data/ext/couchbase/couchbase/ping_options.hxx +55 -54
  951. data/ext/couchbase/couchbase/ping_result.hxx +79 -77
  952. data/ext/couchbase/couchbase/prefix_query.hxx +43 -40
  953. data/ext/couchbase/couchbase/prepend_options.hxx +51 -47
  954. data/ext/couchbase/couchbase/query_index_manager.hxx +207 -199
  955. data/ext/couchbase/couchbase/query_meta_data.hxx +120 -120
  956. data/ext/couchbase/couchbase/query_metrics.hxx +135 -133
  957. data/ext/couchbase/couchbase/query_options.hxx +518 -493
  958. data/ext/couchbase/couchbase/query_profile.hxx +29 -26
  959. data/ext/couchbase/couchbase/query_result.hxx +56 -55
  960. data/ext/couchbase/couchbase/query_scan_consistency.hxx +24 -21
  961. data/ext/couchbase/couchbase/query_status.hxx +10 -10
  962. data/ext/couchbase/couchbase/query_string_query.hxx +34 -29
  963. data/ext/couchbase/couchbase/query_warning.hxx +75 -71
  964. data/ext/couchbase/couchbase/read_preference.hxx +58 -0
  965. data/ext/couchbase/couchbase/regexp_query.hxx +40 -39
  966. data/ext/couchbase/couchbase/remove_options.hxx +51 -47
  967. data/ext/couchbase/couchbase/replace_link_analytics_options.hxx +25 -25
  968. data/ext/couchbase/couchbase/replace_options.hxx +112 -104
  969. data/ext/couchbase/couchbase/replicate_to.hxx +28 -28
  970. data/ext/couchbase/couchbase/result.hxx +28 -28
  971. data/ext/couchbase/couchbase/resume_ingest_search_index_options.hxx +11 -10
  972. data/ext/couchbase/couchbase/retry_action.hxx +10 -10
  973. data/ext/couchbase/couchbase/retry_reason.hxx +53 -51
  974. data/ext/couchbase/couchbase/retry_request.hxx +7 -7
  975. data/ext/couchbase/couchbase/retry_strategy.hxx +4 -4
  976. data/ext/couchbase/couchbase/scan_options.hxx +114 -108
  977. data/ext/couchbase/couchbase/scan_result.hxx +97 -96
  978. data/ext/couchbase/couchbase/scan_result_item.hxx +120 -118
  979. data/ext/couchbase/couchbase/scan_type.hxx +237 -232
  980. data/ext/couchbase/couchbase/scope.hxx +164 -157
  981. data/ext/couchbase/couchbase/scope_search_index_manager.hxx +263 -238
  982. data/ext/couchbase/couchbase/search_date_range.hxx +32 -29
  983. data/ext/couchbase/couchbase/search_facet.hxx +25 -25
  984. data/ext/couchbase/couchbase/search_facet_result.hxx +11 -11
  985. data/ext/couchbase/couchbase/search_geo_distance_units.hxx +11 -1
  986. data/ext/couchbase/couchbase/search_index_manager.hxx +261 -238
  987. data/ext/couchbase/couchbase/search_meta_data.hxx +37 -37
  988. data/ext/couchbase/couchbase/search_metrics.hxx +84 -83
  989. data/ext/couchbase/couchbase/search_numeric_range.hxx +32 -32
  990. data/ext/couchbase/couchbase/search_options.hxx +449 -435
  991. data/ext/couchbase/couchbase/search_query.hxx +32 -30
  992. data/ext/couchbase/couchbase/search_request.hxx +69 -68
  993. data/ext/couchbase/couchbase/search_result.hxx +29 -26
  994. data/ext/couchbase/couchbase/search_row.hxx +52 -52
  995. data/ext/couchbase/couchbase/search_row_location.hxx +20 -20
  996. data/ext/couchbase/couchbase/search_row_locations.hxx +39 -38
  997. data/ext/couchbase/couchbase/search_scan_consistency.hxx +11 -10
  998. data/ext/couchbase/couchbase/search_sort.hxx +20 -20
  999. data/ext/couchbase/couchbase/search_sort_field.hxx +77 -71
  1000. data/ext/couchbase/couchbase/search_sort_field_missing.hxx +2 -2
  1001. data/ext/couchbase/couchbase/search_sort_field_mode.hxx +3 -3
  1002. data/ext/couchbase/couchbase/search_sort_field_type.hxx +4 -4
  1003. data/ext/couchbase/couchbase/search_sort_geo_distance.hxx +41 -41
  1004. data/ext/couchbase/couchbase/search_sort_id.hxx +23 -23
  1005. data/ext/couchbase/couchbase/search_sort_score.hxx +23 -23
  1006. data/ext/couchbase/couchbase/search_term_range.hxx +17 -17
  1007. data/ext/couchbase/couchbase/security_options.hxx +50 -50
  1008. data/ext/couchbase/couchbase/service_type.hxx +34 -34
  1009. data/ext/couchbase/couchbase/store_semantics.hxx +28 -28
  1010. data/ext/couchbase/couchbase/subdoc/array_add_unique.hxx +54 -54
  1011. data/ext/couchbase/couchbase/subdoc/array_append.hxx +40 -40
  1012. data/ext/couchbase/couchbase/subdoc/array_insert.hxx +41 -41
  1013. data/ext/couchbase/couchbase/subdoc/array_prepend.hxx +41 -41
  1014. data/ext/couchbase/couchbase/subdoc/count.hxx +24 -24
  1015. data/ext/couchbase/couchbase/subdoc/counter.hxx +41 -41
  1016. data/ext/couchbase/couchbase/subdoc/exists.hxx +24 -24
  1017. data/ext/couchbase/couchbase/subdoc/get.hxx +45 -29
  1018. data/ext/couchbase/couchbase/subdoc/insert.hxx +70 -54
  1019. data/ext/couchbase/couchbase/subdoc/lookup_in_macro.hxx +13 -12
  1020. data/ext/couchbase/couchbase/subdoc/mutate_in_macro.hxx +7 -2
  1021. data/ext/couchbase/couchbase/subdoc/remove.hxx +24 -24
  1022. data/ext/couchbase/couchbase/subdoc/replace.hxx +55 -39
  1023. data/ext/couchbase/couchbase/subdoc/upsert.hxx +70 -54
  1024. data/ext/couchbase/couchbase/term_facet.hxx +16 -16
  1025. data/ext/couchbase/couchbase/term_facet_result.hxx +14 -14
  1026. data/ext/couchbase/couchbase/term_query.hxx +107 -104
  1027. data/ext/couchbase/couchbase/term_range_query.hxx +99 -96
  1028. data/ext/couchbase/couchbase/timeout_options.hxx +118 -112
  1029. data/ext/couchbase/couchbase/tls_verify_mode.hxx +2 -2
  1030. data/ext/couchbase/couchbase/touch_options.hxx +25 -24
  1031. data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +45 -44
  1032. data/ext/couchbase/couchbase/tracing/request_span.hxx +34 -34
  1033. data/ext/couchbase/couchbase/tracing/request_tracer.hxx +27 -25
  1034. data/ext/couchbase/couchbase/tracing_options.hxx +147 -142
  1035. data/ext/couchbase/couchbase/transactions/async_attempt_context.hxx +149 -115
  1036. data/ext/couchbase/couchbase/transactions/attempt_context.hxx +146 -95
  1037. data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +52 -80
  1038. data/ext/couchbase/couchbase/transactions/transaction_keyspace.hxx +33 -29
  1039. data/ext/couchbase/couchbase/transactions/transaction_options.hxx +101 -96
  1040. data/ext/couchbase/couchbase/transactions/transaction_query_options.hxx +228 -223
  1041. data/ext/couchbase/couchbase/transactions/transaction_query_result.hxx +11 -12
  1042. data/ext/couchbase/couchbase/transactions/transaction_result.hxx +2 -3
  1043. data/ext/couchbase/couchbase/transactions/transactions_cleanup_config.hxx +105 -104
  1044. data/ext/couchbase/couchbase/transactions/transactions_config.hxx +191 -187
  1045. data/ext/couchbase/couchbase/transactions/transactions_query_config.hxx +32 -32
  1046. data/ext/couchbase/couchbase/transactions.hxx +56 -37
  1047. data/ext/couchbase/couchbase/unfreeze_plan_search_index_options.hxx +11 -10
  1048. data/ext/couchbase/couchbase/unlock_options.hxx +25 -24
  1049. data/ext/couchbase/couchbase/update_bucket_options.hxx +9 -9
  1050. data/ext/couchbase/couchbase/update_collection_options.hxx +35 -34
  1051. data/ext/couchbase/couchbase/upsert_options.hxx +85 -80
  1052. data/ext/couchbase/couchbase/upsert_search_index_options.hxx +9 -9
  1053. data/ext/couchbase/couchbase/vector_query.hxx +82 -62
  1054. data/ext/couchbase/couchbase/vector_search.hxx +51 -47
  1055. data/ext/couchbase/couchbase/vector_search_options.hxx +45 -41
  1056. data/ext/couchbase/couchbase/wan_development_configuration_profile.hxx +13 -13
  1057. data/ext/couchbase/couchbase/watch_query_indexes_options.hxx +41 -41
  1058. data/ext/couchbase/couchbase/wildcard_query.hxx +42 -41
  1059. data/ext/couchbase/third_party/expected/include/tl/expected.hpp +1746 -1584
  1060. data/ext/couchbase/third_party/jsonsl/jsonsl.c +2664 -2638
  1061. data/ext/couchbase/third_party/jsonsl/jsonsl.h +359 -342
  1062. data/ext/couchbase.cxx +43 -9568
  1063. data/ext/extconf.rb +5 -0
  1064. data/ext/rcb_analytics.cxx +1195 -0
  1065. data/ext/rcb_analytics.hxx +29 -0
  1066. data/ext/rcb_backend.cxx +530 -0
  1067. data/ext/rcb_backend.hxx +46 -0
  1068. data/ext/rcb_buckets.cxx +624 -0
  1069. data/ext/rcb_buckets.hxx +29 -0
  1070. data/ext/rcb_collections.cxx +377 -0
  1071. data/ext/rcb_collections.hxx +29 -0
  1072. data/ext/rcb_crud.cxx +1544 -0
  1073. data/ext/rcb_crud.hxx +29 -0
  1074. data/ext/rcb_diagnostics.cxx +264 -0
  1075. data/ext/rcb_diagnostics.hxx +29 -0
  1076. data/ext/rcb_exceptions.cxx +963 -0
  1077. data/ext/rcb_exceptions.hxx +111 -0
  1078. data/ext/rcb_extras.cxx +394 -0
  1079. data/ext/rcb_extras.hxx +29 -0
  1080. data/ext/rcb_logger.cxx +319 -0
  1081. data/ext/rcb_logger.hxx +36 -0
  1082. data/ext/rcb_multi.cxx +343 -0
  1083. data/ext/rcb_multi.hxx +29 -0
  1084. data/ext/rcb_query.cxx +1316 -0
  1085. data/ext/rcb_query.hxx +29 -0
  1086. data/ext/rcb_range_scan.cxx +358 -0
  1087. data/ext/rcb_range_scan.hxx +29 -0
  1088. data/ext/rcb_search.cxx +1216 -0
  1089. data/ext/rcb_search.hxx +29 -0
  1090. data/ext/rcb_users.cxx +636 -0
  1091. data/ext/rcb_users.hxx +29 -0
  1092. data/ext/rcb_utils.cxx +590 -0
  1093. data/ext/rcb_utils.hxx +564 -0
  1094. data/ext/rcb_version.cxx +137 -0
  1095. data/ext/rcb_version.hxx +34 -0
  1096. data/ext/rcb_views.cxx +485 -0
  1097. data/ext/rcb_views.hxx +29 -0
  1098. data/lib/active_support/cache/couchbase_store.rb +4 -1
  1099. data/lib/couchbase/analytics_options.rb +2 -0
  1100. data/lib/couchbase/authenticator.rb +2 -0
  1101. data/lib/couchbase/binary_collection.rb +2 -0
  1102. data/lib/couchbase/binary_collection_options.rb +2 -0
  1103. data/lib/couchbase/bucket.rb +2 -0
  1104. data/lib/couchbase/cluster.rb +2 -0
  1105. data/lib/couchbase/collection.rb +3 -1
  1106. data/lib/couchbase/collection_options.rb +2 -0
  1107. data/lib/couchbase/config_profiles.rb +2 -0
  1108. data/lib/couchbase/configuration.rb +2 -0
  1109. data/lib/couchbase/datastructures/couchbase_list.rb +4 -4
  1110. data/lib/couchbase/datastructures/couchbase_map.rb +4 -4
  1111. data/lib/couchbase/datastructures/couchbase_queue.rb +4 -4
  1112. data/lib/couchbase/datastructures/couchbase_set.rb +4 -4
  1113. data/lib/couchbase/datastructures.rb +2 -0
  1114. data/lib/couchbase/diagnostics.rb +2 -0
  1115. data/lib/couchbase/errors.rb +46 -8
  1116. data/lib/couchbase/json_transcoder.rb +2 -0
  1117. data/lib/couchbase/key_value_scan.rb +2 -0
  1118. data/lib/couchbase/logger.rb +2 -0
  1119. data/lib/couchbase/management/analytics_index_manager.rb +2 -0
  1120. data/lib/couchbase/management/bucket_manager.rb +2 -0
  1121. data/lib/couchbase/management/collection_manager.rb +2 -0
  1122. data/lib/couchbase/management/collection_query_index_manager.rb +2 -0
  1123. data/lib/couchbase/management/query_index_manager.rb +2 -0
  1124. data/lib/couchbase/management/scope_search_index_manager.rb +2 -0
  1125. data/lib/couchbase/management/search_index_manager.rb +2 -0
  1126. data/lib/couchbase/management/user_manager.rb +2 -0
  1127. data/lib/couchbase/management/view_index_manager.rb +2 -0
  1128. data/lib/couchbase/management.rb +2 -0
  1129. data/lib/couchbase/mutation_state.rb +2 -0
  1130. data/lib/couchbase/options.rb +2 -0
  1131. data/lib/couchbase/protostellar/request_generator/kv.rb +1 -1
  1132. data/lib/couchbase/query_options.rb +2 -0
  1133. data/lib/couchbase/railtie.rb +2 -0
  1134. data/lib/couchbase/raw_binary_transcoder.rb +2 -0
  1135. data/lib/couchbase/raw_json_transcoder.rb +2 -0
  1136. data/lib/couchbase/raw_string_transcoder.rb +2 -0
  1137. data/lib/couchbase/scope.rb +2 -0
  1138. data/lib/couchbase/search_options.rb +91 -63
  1139. data/lib/couchbase/subdoc.rb +5 -3
  1140. data/lib/couchbase/transcoder_flags.rb +2 -0
  1141. data/lib/couchbase/utils/generic_logger_adapter.rb +3 -1
  1142. data/lib/couchbase/utils/stdlib_logger_adapter.rb +2 -0
  1143. data/lib/couchbase/utils/time.rb +3 -1
  1144. data/lib/couchbase/utils.rb +2 -0
  1145. data/lib/couchbase/version.rb +3 -1
  1146. data/lib/couchbase/view_options.rb +2 -0
  1147. data/lib/couchbase.rb +2 -0
  1148. data/lib/rails/generators/couchbase/config/config_generator.rb +2 -0
  1149. metadata +83 -26
  1150. data/ext/couchbase/core/impl/internal_manager_error_context.cxx +0 -113
  1151. data/ext/couchbase/core/impl/internal_manager_error_context.hxx +0 -60
  1152. data/ext/couchbase/core/impl/manager_error_context.cxx +0 -100
  1153. data/ext/couchbase/core/impl/search_error_context.cxx +0 -147
  1154. data/ext/couchbase/couchbase/analytics_error_context.hxx +0 -143
  1155. data/ext/couchbase/couchbase/fmt/key_value_error_map_attribute.hxx +0 -100
  1156. data/ext/couchbase/couchbase/fmt/key_value_status_code.hxx +0 -269
  1157. data/ext/couchbase/couchbase/key_value_error_context.hxx +0 -229
  1158. data/ext/couchbase/couchbase/key_value_error_map_attribute.hxx +0 -136
  1159. data/ext/couchbase/couchbase/key_value_error_map_info.hxx +0 -138
  1160. data/ext/couchbase/couchbase/key_value_extended_error_info.hxx +0 -86
  1161. data/ext/couchbase/couchbase/key_value_status_code.hxx +0 -109
  1162. data/ext/couchbase/couchbase/manager_error_context.hxx +0 -111
  1163. data/ext/couchbase/couchbase/query_error_context.hxx +0 -145
  1164. data/ext/couchbase/couchbase/search_error_context.hxx +0 -138
  1165. data/ext/couchbase/couchbase/subdocument_error_context.hxx +0 -147
  1166. data/ext/couchbase/couchbase/transaction_op_error_context.hxx +0 -76
@@ -20,6 +20,8 @@
20
20
  #include "attempt_context_testing_hooks.hxx"
21
21
  #include "core/cluster.hxx"
22
22
 
23
+ #include "core/logger/logger.hxx"
24
+ #include "core/transactions/internal/logging.hxx"
23
25
  #include "internal/transaction_fields.hxx"
24
26
  #include "internal/utils.hxx"
25
27
  #include "result.hxx"
@@ -30,793 +32,923 @@
30
32
 
31
33
  namespace couchbase::core::transactions
32
34
  {
33
-
34
- bool
35
- unstaging_state::wait_until_unstage_possible()
35
+ auto
36
+ unstaging_state::wait_until_unstage_possible() -> bool
36
37
  {
37
- std::unique_lock lock(mutex_);
38
- auto success = cv_.wait_for(lock, ctx_->overall().remaining(), [this] { return (in_flight_count_ < MAX_PARALLELISM) || abort_; });
39
- if (!abort_) {
40
- if (success) {
41
- in_flight_count_++;
42
- } else {
43
- abort_ = true;
44
- }
38
+ std::unique_lock lock(mutex_);
39
+ auto success = cv_.wait_for(lock, ctx_->overall()->remaining(), [this] {
40
+ return (in_flight_count_ < MAX_PARALLELISM) || abort_;
41
+ });
42
+ if (!abort_) {
43
+ if (success) {
44
+ in_flight_count_++;
45
+ } else {
46
+ abort_ = true;
45
47
  }
46
- lock.unlock();
47
- return !abort_;
48
+ }
49
+ return !abort_;
48
50
  }
49
51
 
50
52
  void
51
53
  unstaging_state::notify_unstage_complete()
52
54
  {
53
- std::lock_guard lock(mutex_);
54
- in_flight_count_--;
55
- cv_.notify_one();
55
+ std::lock_guard lock(mutex_);
56
+ in_flight_count_--;
57
+ cv_.notify_one();
56
58
  }
57
59
 
58
60
  void
59
61
  unstaging_state::notify_unstage_error()
60
62
  {
61
- std::lock_guard lock(mutex_);
62
- abort_ = true;
63
- in_flight_count_--;
64
- cv_.notify_all();
63
+ std::lock_guard lock(mutex_);
64
+ abort_ = true;
65
+ in_flight_count_--;
66
+ cv_.notify_all();
65
67
  }
66
68
 
67
- bool
68
- staged_mutation_queue::empty()
69
+ auto
70
+ staged_mutation_queue::empty() -> bool
69
71
  {
70
- std::lock_guard<std::mutex> lock(mutex_);
71
- return queue_.empty();
72
+ std::lock_guard<std::mutex> lock(mutex_);
73
+ return queue_.empty();
72
74
  }
73
75
 
74
76
  void
75
77
  staged_mutation_queue::add(const staged_mutation& mutation)
76
78
  {
77
- std::lock_guard<std::mutex> lock(mutex_);
78
- // Can only have one staged mutation per document.
79
- queue_.erase(std::remove_if(queue_.begin(),
80
- queue_.end(),
81
- [&mutation](const staged_mutation& item) { return document_ids_equal(item.id(), mutation.id()); }),
82
- queue_.end());
83
- queue_.push_back(mutation);
79
+ std::lock_guard<std::mutex> lock(mutex_);
80
+ // Can only have one staged mutation per document.
81
+ queue_.erase(std::remove_if(queue_.begin(),
82
+ queue_.end(),
83
+ [&mutation](const staged_mutation& item) {
84
+ return document_ids_equal(item.id(), mutation.id());
85
+ }),
86
+ queue_.end());
87
+ queue_.push_back(mutation);
84
88
  }
85
89
 
86
90
  void
87
- staged_mutation_queue::extract_to(const std::string& prefix, core::operations::mutate_in_request& req)
91
+ staged_mutation_queue::extract_to(const std::string& prefix,
92
+ core::operations::mutate_in_request& req)
88
93
  {
89
- std::lock_guard<std::mutex> lock(mutex_);
90
- tao::json::value inserts = tao::json::empty_array;
91
- tao::json::value replaces = tao::json::empty_array;
92
- tao::json::value removes = tao::json::empty_array;
93
-
94
- for (const auto& mutation : queue_) {
95
- tao::json::value doc{ { ATR_FIELD_PER_DOC_ID, mutation.doc().id().key() },
96
- { ATR_FIELD_PER_DOC_BUCKET, mutation.doc().id().bucket() },
97
- { ATR_FIELD_PER_DOC_SCOPE, mutation.doc().id().scope() },
98
- { ATR_FIELD_PER_DOC_COLLECTION, mutation.doc().id().collection() } };
99
- switch (mutation.type()) {
100
- case staged_mutation_type::INSERT:
101
- inserts.push_back(doc);
102
- break;
103
- case staged_mutation_type::REMOVE:
104
- removes.push_back(doc);
105
- break;
106
- case staged_mutation_type::REPLACE:
107
- replaces.push_back(doc);
108
- break;
109
- }
94
+ std::lock_guard<std::mutex> lock(mutex_);
95
+ tao::json::value inserts = tao::json::empty_array;
96
+ tao::json::value replaces = tao::json::empty_array;
97
+ tao::json::value removes = tao::json::empty_array;
98
+
99
+ for (const auto& mutation : queue_) {
100
+ tao::json::value doc{ { ATR_FIELD_PER_DOC_ID, mutation.doc().id().key() },
101
+ { ATR_FIELD_PER_DOC_BUCKET, mutation.doc().id().bucket() },
102
+ { ATR_FIELD_PER_DOC_SCOPE, mutation.doc().id().scope() },
103
+ { ATR_FIELD_PER_DOC_COLLECTION, mutation.doc().id().collection() } };
104
+ switch (mutation.type()) {
105
+ case staged_mutation_type::INSERT:
106
+ inserts.push_back(doc);
107
+ break;
108
+ case staged_mutation_type::REMOVE:
109
+ removes.push_back(doc);
110
+ break;
111
+ case staged_mutation_type::REPLACE:
112
+ replaces.push_back(doc);
113
+ break;
110
114
  }
111
- auto specs =
112
- couchbase::mutate_in_specs{
113
- couchbase::mutate_in_specs::upsert_raw(prefix + ATR_FIELD_DOCS_INSERTED, core::utils::json::generate_binary(inserts))
114
- .xattr()
115
- .create_path(),
116
- couchbase::mutate_in_specs::upsert_raw(prefix + ATR_FIELD_DOCS_REPLACED, core::utils::json::generate_binary(replaces))
117
- .xattr()
118
- .create_path(),
119
- couchbase::mutate_in_specs::upsert_raw(prefix + ATR_FIELD_DOCS_REMOVED, core::utils::json::generate_binary(removes))
120
- .xattr()
121
- .create_path(),
122
- }
123
- .specs();
124
- req.specs.insert(req.specs.end(), specs.begin(), specs.end());
115
+ }
116
+ auto specs =
117
+ couchbase::mutate_in_specs{
118
+ couchbase::mutate_in_specs::upsert_raw(prefix + ATR_FIELD_DOCS_INSERTED,
119
+ core::utils::json::generate_binary(inserts))
120
+ .xattr()
121
+ .create_path(),
122
+ couchbase::mutate_in_specs::upsert_raw(prefix + ATR_FIELD_DOCS_REPLACED,
123
+ core::utils::json::generate_binary(replaces))
124
+ .xattr()
125
+ .create_path(),
126
+ couchbase::mutate_in_specs::upsert_raw(prefix + ATR_FIELD_DOCS_REMOVED,
127
+ core::utils::json::generate_binary(removes))
128
+ .xattr()
129
+ .create_path(),
130
+ }
131
+ .specs();
132
+ req.specs.insert(req.specs.end(), specs.begin(), specs.end());
125
133
  }
126
134
 
127
135
  void
128
136
  staged_mutation_queue::remove_any(const core::document_id& id)
129
137
  {
130
- const std::lock_guard<std::mutex> lock(mutex_);
131
- auto new_end =
132
- std::remove_if(queue_.begin(), queue_.end(), [&id](const staged_mutation& item) { return document_ids_equal(item.id(), id); });
133
- queue_.erase(new_end, queue_.end());
138
+ const std::lock_guard<std::mutex> lock(mutex_);
139
+ auto new_end = std::remove_if(queue_.begin(), queue_.end(), [&id](const staged_mutation& item) {
140
+ return document_ids_equal(item.id(), id);
141
+ });
142
+ queue_.erase(new_end, queue_.end());
134
143
  }
135
144
 
136
- staged_mutation*
137
- staged_mutation_queue::find_any(const core::document_id& id)
145
+ auto
146
+ staged_mutation_queue::find_any(const core::document_id& id) -> staged_mutation*
138
147
  {
139
- const std::lock_guard<std::mutex> lock(mutex_);
140
- for (auto& item : queue_) {
141
- if (document_ids_equal(item.doc().id(), id)) {
142
- return &item;
143
- }
148
+ const std::lock_guard<std::mutex> lock(mutex_);
149
+ for (auto& item : queue_) {
150
+ if (document_ids_equal(item.doc().id(), id)) {
151
+ return &item;
144
152
  }
145
- return nullptr;
153
+ }
154
+ return nullptr;
146
155
  }
147
156
 
148
- staged_mutation*
149
- staged_mutation_queue::find_replace(const core::document_id& id)
157
+ auto
158
+ staged_mutation_queue::find_replace(const core::document_id& id) -> staged_mutation*
150
159
  {
151
- std::lock_guard<std::mutex> lock(mutex_);
152
- for (auto& item : queue_) {
153
- if (item.type() == staged_mutation_type::REPLACE && document_ids_equal(item.doc().id(), id)) {
154
- return &item;
155
- }
160
+ std::lock_guard<std::mutex> lock(mutex_);
161
+ for (auto& item : queue_) {
162
+ if (item.type() == staged_mutation_type::REPLACE && document_ids_equal(item.doc().id(), id)) {
163
+ return &item;
156
164
  }
157
- return nullptr;
165
+ }
166
+ return nullptr;
158
167
  }
159
168
 
160
- staged_mutation*
161
- staged_mutation_queue::find_insert(const core::document_id& id)
169
+ auto
170
+ staged_mutation_queue::find_insert(const core::document_id& id) -> staged_mutation*
162
171
  {
163
- std::lock_guard<std::mutex> lock(mutex_);
164
- for (auto& item : queue_) {
165
- if (item.type() == staged_mutation_type::INSERT && document_ids_equal(item.doc().id(), id)) {
166
- return &item;
167
- }
172
+ std::lock_guard<std::mutex> lock(mutex_);
173
+ for (auto& item : queue_) {
174
+ if (item.type() == staged_mutation_type::INSERT && document_ids_equal(item.doc().id(), id)) {
175
+ return &item;
168
176
  }
169
- return nullptr;
177
+ }
178
+ return nullptr;
170
179
  }
171
180
 
172
- staged_mutation*
173
- staged_mutation_queue::find_remove(const core::document_id& id)
181
+ auto
182
+ staged_mutation_queue::find_remove(const core::document_id& id) -> staged_mutation*
174
183
  {
175
- std::lock_guard<std::mutex> lock(mutex_);
176
- for (auto& item : queue_) {
177
- if (item.type() == staged_mutation_type::REMOVE && document_ids_equal(item.doc().id(), id)) {
178
- return &item;
179
- }
184
+ std::lock_guard<std::mutex> lock(mutex_);
185
+ for (auto& item : queue_) {
186
+ if (item.type() == staged_mutation_type::REMOVE && document_ids_equal(item.doc().id(), id)) {
187
+ return &item;
180
188
  }
181
- return nullptr;
189
+ }
190
+ return nullptr;
182
191
  }
183
192
  void
184
193
  staged_mutation_queue::iterate(std::function<void(staged_mutation&)> op)
185
194
  {
186
- std::lock_guard<std::mutex> lock(mutex_);
187
- for (auto& item : queue_) {
188
- op(item);
189
- }
195
+ std::lock_guard<std::mutex> lock(mutex_);
196
+ for (auto& item : queue_) {
197
+ op(item);
198
+ }
190
199
  }
191
200
 
192
201
  void
193
- staged_mutation_queue::commit(attempt_context_impl* ctx)
202
+ staged_mutation_queue::commit(std::shared_ptr<attempt_context_impl> ctx)
194
203
  {
195
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "committing staged mutations...");
196
- std::lock_guard<std::mutex> lock(mutex_);
204
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "committing staged mutations...");
205
+ std::lock_guard<std::mutex> lock(mutex_);
197
206
 
198
- unstaging_state state{ ctx };
199
- std::vector<std::future<void>> futures{};
200
- futures.reserve(queue_.size());
207
+ unstaging_state state{ ctx };
208
+ std::vector<std::future<void>> futures{};
209
+ futures.reserve(queue_.size());
201
210
 
202
- bool aborted = false;
211
+ bool aborted = false;
203
212
 
204
- for (auto& item : queue_) {
205
- aborted = !state.wait_until_unstage_possible();
206
- if (aborted) {
207
- // Do not commit any more mutations
208
- break;
209
- }
213
+ for (auto& item : queue_) {
214
+ aborted = !state.wait_until_unstage_possible();
215
+ if (aborted) {
216
+ // Do not commit any more mutations
217
+ break;
218
+ }
210
219
 
211
- auto barrier = std::make_shared<std::promise<void>>();
212
- auto future = barrier->get_future();
213
-
214
- try {
215
- auto timer = std::make_shared<asio::steady_timer>(ctx->cluster_ref().io_context());
216
- async_constant_delay delay(timer);
217
-
218
- switch (item.type()) {
219
- case staged_mutation_type::REMOVE:
220
- remove_doc(ctx, item, delay, [&state, barrier](const std::exception_ptr& exc) {
221
- if (exc) {
222
- state.notify_unstage_error();
223
- barrier->set_exception(exc);
224
- } else {
225
- state.notify_unstage_complete();
226
- barrier->set_value();
227
- }
228
- });
229
- break;
230
- case staged_mutation_type::INSERT:
231
- case staged_mutation_type::REPLACE:
232
- commit_doc(ctx, item, delay, [&state, barrier](const std::exception_ptr& exc) {
233
- if (exc) {
234
- state.notify_unstage_error();
235
- barrier->set_exception(exc);
236
- } else {
237
- state.notify_unstage_complete();
238
- barrier->set_value();
239
- }
240
- });
241
- break;
242
- }
243
- } catch (...) {
244
- // This should not happen, but catching it to ensure that we wait for in-flight operations
245
- CB_ATTEMPT_CTX_LOG_ERROR(ctx,
246
- "caught exception while trying to initiate commit for {}. Aborting rest of commit and waiting for "
247
- "in-flight rollback operations to finish",
248
- item.doc().id());
249
- aborted = true;
250
- break;
251
- }
220
+ auto barrier = std::make_shared<std::promise<void>>();
221
+ auto future = barrier->get_future();
252
222
 
253
- futures.push_back(std::move(future));
254
- }
223
+ try {
224
+ auto timer = std::make_shared<asio::steady_timer>(ctx->cluster_ref().io_context());
225
+ async_constant_delay delay(timer);
255
226
 
256
- std::exception_ptr exc{};
257
- for (auto& future : futures) {
258
- try {
259
- future.get();
260
- } catch (...) {
261
- if (!exc) {
262
- exc = std::current_exception();
227
+ switch (item.type()) {
228
+ case staged_mutation_type::REMOVE:
229
+ remove_doc(ctx, item, delay, [&state, barrier](const std::exception_ptr& exc) {
230
+ if (exc) {
231
+ state.notify_unstage_error();
232
+ barrier->set_exception(exc);
233
+ } else {
234
+ state.notify_unstage_complete();
235
+ barrier->set_value();
263
236
  }
264
- }
265
- }
266
- if (exc) {
267
- rethrow_exception(exc);
237
+ });
238
+ break;
239
+ case staged_mutation_type::INSERT:
240
+ case staged_mutation_type::REPLACE:
241
+ commit_doc(ctx, item, delay, [&state, barrier](const std::exception_ptr& exc) {
242
+ if (exc) {
243
+ state.notify_unstage_error();
244
+ barrier->set_exception(exc);
245
+ } else {
246
+ state.notify_unstage_complete();
247
+ barrier->set_value();
248
+ }
249
+ });
250
+ break;
251
+ }
252
+ } catch (...) {
253
+ // This should not happen, but catching it to ensure that we wait for in-flight operations
254
+ CB_ATTEMPT_CTX_LOG_ERROR(ctx,
255
+ "caught exception while trying to initiate commit for {}. Aborting "
256
+ "rest of commit and waiting for "
257
+ "in-flight rollback operations to finish",
258
+ item.doc().id());
259
+ aborted = true;
260
+ break;
268
261
  }
269
- if (aborted) {
270
- // Commit was aborted but no exception was raised from the futures (possibly timeout during wait_until_unstage_possible())
271
- throw transaction_operation_failed(FAIL_OTHER, "commit aborted").no_rollback().failed_post_commit();
262
+
263
+ futures.push_back(std::move(future));
264
+ }
265
+
266
+ std::exception_ptr exc{};
267
+ for (auto& future : futures) {
268
+ try {
269
+ future.get();
270
+ } catch (...) {
271
+ if (!exc) {
272
+ exc = std::current_exception();
273
+ }
272
274
  }
275
+ }
276
+ if (exc) {
277
+ rethrow_exception(exc);
278
+ }
279
+ if (aborted) {
280
+ // Commit was aborted but no exception was raised from the futures (possibly timeout during
281
+ // wait_until_unstage_possible())
282
+ throw transaction_operation_failed(FAIL_OTHER, "commit aborted")
283
+ .no_rollback()
284
+ .failed_post_commit();
285
+ }
273
286
  }
274
287
 
275
288
  void
276
- staged_mutation_queue::rollback(attempt_context_impl* ctx)
289
+ staged_mutation_queue::rollback(std::shared_ptr<attempt_context_impl> ctx)
277
290
  {
278
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rolling back staged mutations...");
279
- std::lock_guard<std::mutex> lock(mutex_);
291
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rolling back staged mutations...");
292
+ std::lock_guard<std::mutex> lock(mutex_);
280
293
 
281
- unstaging_state state{ ctx };
282
- std::vector<std::future<void>> futures{};
283
- futures.reserve(queue_.size());
294
+ unstaging_state state{ ctx };
295
+ std::vector<std::future<void>> futures{};
296
+ futures.reserve(queue_.size());
284
297
 
285
- bool aborted = false;
298
+ bool aborted = false;
286
299
 
287
- for (auto& item : queue_) {
288
- aborted = !state.wait_until_unstage_possible();
289
- if (aborted) {
290
- // Do not roll back any more mutations
291
- break;
292
- }
300
+ for (auto& item : queue_) {
301
+ aborted = !state.wait_until_unstage_possible();
302
+ if (aborted) {
303
+ // Do not roll back any more mutations
304
+ break;
305
+ }
293
306
 
294
- auto barrier = std::make_shared<std::promise<void>>();
295
- auto future = barrier->get_future();
296
-
297
- try {
298
- auto timer = std::make_shared<asio::steady_timer>(ctx->cluster_ref().io_context());
299
- async_exp_delay delay(timer);
300
-
301
- switch (item.type()) {
302
- case staged_mutation_type::INSERT:
303
- rollback_insert(ctx, item, delay, [&state, barrier](const std::exception_ptr& exc) {
304
- if (exc) {
305
- state.notify_unstage_error();
306
- barrier->set_exception(exc);
307
- } else {
308
- state.notify_unstage_complete();
309
- barrier->set_value();
310
- }
311
- });
312
- break;
313
- case staged_mutation_type::REMOVE:
314
- case staged_mutation_type::REPLACE:
315
- rollback_remove_or_replace(ctx, item, delay, [&state, barrier](std::exception_ptr exc) {
316
- if (exc) {
317
- state.notify_unstage_error();
318
- barrier->set_exception(exc);
319
- } else {
320
- state.notify_unstage_complete();
321
- barrier->set_value();
322
- }
323
- });
324
- break;
325
- }
326
- } catch (...) {
327
- // This should not happen, but catching it to ensure that we wait for in-flight operations
328
- CB_ATTEMPT_CTX_LOG_ERROR(ctx,
329
- "caught exception while trying to initiate rollback for {}. Aborting rollback and waiting for "
330
- "in-flight rollback operations to finish",
331
- item.doc().id());
332
- aborted = true;
333
- break;
334
- }
307
+ auto barrier = std::make_shared<std::promise<void>>();
308
+ auto future = barrier->get_future();
335
309
 
336
- futures.push_back(std::move(future));
337
- }
310
+ try {
311
+ auto timer = std::make_shared<asio::steady_timer>(ctx->cluster_ref().io_context());
312
+ async_exp_delay delay(timer);
338
313
 
339
- std::exception_ptr exc{};
340
- for (auto& future : futures) {
341
- try {
342
- future.get();
343
- } catch (...) {
344
- if (!exc) {
345
- exc = std::current_exception();
314
+ switch (item.type()) {
315
+ case staged_mutation_type::INSERT:
316
+ rollback_insert(ctx, item, delay, [&state, barrier](const std::exception_ptr& exc) {
317
+ if (exc) {
318
+ state.notify_unstage_error();
319
+ barrier->set_exception(exc);
320
+ } else {
321
+ state.notify_unstage_complete();
322
+ barrier->set_value();
346
323
  }
347
- }
348
- }
349
- if (exc) {
350
- rethrow_exception(exc);
324
+ });
325
+ break;
326
+ case staged_mutation_type::REMOVE:
327
+ case staged_mutation_type::REPLACE:
328
+ rollback_remove_or_replace(ctx, item, delay, [&state, barrier](std::exception_ptr exc) {
329
+ if (exc) {
330
+ state.notify_unstage_error();
331
+ barrier->set_exception(exc);
332
+ } else {
333
+ state.notify_unstage_complete();
334
+ barrier->set_value();
335
+ }
336
+ });
337
+ break;
338
+ }
339
+ } catch (...) {
340
+ // This should not happen, but catching it to ensure that we wait for in-flight operations
341
+ CB_ATTEMPT_CTX_LOG_ERROR(ctx,
342
+ "caught exception while trying to initiate rollback for {}. "
343
+ "Aborting rollback and waiting for "
344
+ "in-flight rollback operations to finish",
345
+ item.doc().id());
346
+ aborted = true;
347
+ break;
351
348
  }
352
- if (aborted) {
353
- // Rollback was aborted but no exception was raised from the futures (possibly timeout during wait_until_unstage_possible())
354
- throw transaction_operation_failed(FAIL_OTHER, "rollback aborted").no_rollback();
349
+
350
+ futures.push_back(std::move(future));
351
+ }
352
+
353
+ std::exception_ptr exc{};
354
+ for (auto& future : futures) {
355
+ try {
356
+ future.get();
357
+ } catch (...) {
358
+ if (!exc) {
359
+ exc = std::current_exception();
360
+ }
355
361
  }
362
+ }
363
+ if (exc) {
364
+ rethrow_exception(exc);
365
+ }
366
+ if (aborted) {
367
+ // Rollback was aborted but no exception was raised from the futures (possibly timeout during
368
+ // wait_until_unstage_possible())
369
+ throw transaction_operation_failed(FAIL_OTHER, "rollback aborted").no_rollback();
370
+ }
356
371
  }
357
372
 
358
373
  void
359
- staged_mutation_queue::rollback_insert(attempt_context_impl* ctx,
374
+ staged_mutation_queue::rollback_insert(std::shared_ptr<attempt_context_impl> ctx,
360
375
  const staged_mutation& item,
361
376
  async_exp_delay& delay,
362
377
  utils::movable_function<void(std::exception_ptr)> callback)
363
378
  {
364
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rolling back staged insert for {} with cas {}", item.doc().id(), item.doc().cas().value());
365
-
366
- asio::post(asio::bind_executor(ctx->cluster_ref().io_context(), [this, callback = std::move(callback), ctx, &item, delay]() mutable {
367
- auto handler = [this, callback = std::move(callback), ctx, &item, delay](const std::optional<client_error>& e) mutable {
368
- if (e) {
369
- return handle_rollback_insert_error(e.value(), ctx, item, delay, std::move(callback));
370
- }
371
- return callback({});
372
- };
373
-
374
- auto ec = ctx->error_if_expired_and_not_in_overtime(STAGE_DELETE_INSERTED, item.doc().id().key());
375
- if (ec) {
376
- return handler(client_error(*ec, "expired in rollback and not in overtime mode"));
379
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx,
380
+ "rolling back staged insert for {} with cas {}",
381
+ item.doc().id(),
382
+ item.doc().cas().value());
383
+
384
+ asio::post(asio::bind_executor(
385
+ ctx->cluster_ref().io_context(),
386
+ [this, callback = std::move(callback), ctx, &item, delay]() mutable {
387
+ auto handler = [this, callback = std::move(callback), ctx, &item, delay](
388
+ const std::optional<client_error>& e) mutable {
389
+ if (e) {
390
+ return handle_rollback_insert_error(e.value(), ctx, item, delay, std::move(callback));
377
391
  }
392
+ return callback({});
393
+ };
378
394
 
379
- return ctx->hooks_.before_rollback_delete_inserted(
380
- ctx, item.doc().id().key(), [handler = std::move(handler), ctx, &item, delay](std::optional<error_class> ec) mutable {
381
- if (ec) {
382
- return handler(client_error(*ec, "before_rollback_delete_insert hook threw error"));
383
- }
384
- core::operations::mutate_in_request req{ item.doc().id() };
385
- req.specs =
386
- couchbase::mutate_in_specs{
387
- couchbase::mutate_in_specs::remove(TRANSACTION_INTERFACE_PREFIX_ONLY).xattr(),
388
- }
389
- .specs();
390
- req.access_deleted = true;
391
- req.cas = item.doc().cas();
392
- wrap_durable_request(req, ctx->overall().config());
393
- return ctx->cluster_ref().execute(
394
- req, [handler = std::move(handler), ctx, &item, delay](const core::operations::mutate_in_response& resp) mutable {
395
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "mutate_in for {} with cas {}", item.doc().id(), item.doc().cas().value());
396
-
397
- auto res = result::create_from_subdoc_response(resp);
398
- return validate_rollback_insert_result(ctx, res, item, std::move(handler));
399
- });
400
- });
395
+ auto ec =
396
+ ctx->error_if_expired_and_not_in_overtime(STAGE_DELETE_INSERTED, item.doc().id().key());
397
+ if (ec) {
398
+ return handler(client_error(*ec, "expired in rollback and not in overtime mode"));
399
+ }
400
+
401
+ return ctx->hooks_.before_rollback_delete_inserted(
402
+ ctx,
403
+ item.doc().id().key(),
404
+ [handler = std::move(handler), ctx, &item, delay](std::optional<error_class> ec) mutable {
405
+ if (ec) {
406
+ return handler(client_error(*ec, "before_rollback_delete_insert hook threw error"));
407
+ }
408
+ core::operations::mutate_in_request req{ item.doc().id() };
409
+ req.specs =
410
+ couchbase::mutate_in_specs{
411
+ couchbase::mutate_in_specs::remove(TRANSACTION_INTERFACE_PREFIX_ONLY).xattr(),
412
+ }
413
+ .specs();
414
+ req.access_deleted = true;
415
+ req.cas = item.doc().cas();
416
+ wrap_durable_request(req, ctx->overall()->config());
417
+ return ctx->cluster_ref().execute(
418
+ req,
419
+ [handler = std::move(handler), ctx, &item, delay](
420
+ const core::operations::mutate_in_response& resp) mutable {
421
+ CB_ATTEMPT_CTX_LOG_TRACE(
422
+ ctx, "mutate_in for {} with cas {}", item.doc().id(), item.doc().cas().value());
423
+
424
+ auto res = result::create_from_subdoc_response(resp);
425
+ return validate_rollback_insert_result(ctx, res, item, std::move(handler));
426
+ });
427
+ });
401
428
  }));
402
429
  }
403
430
 
404
431
  void
405
- staged_mutation_queue::rollback_remove_or_replace(attempt_context_impl* ctx,
406
- const staged_mutation& item,
407
- async_exp_delay& delay,
408
- utils::movable_function<void(std::exception_ptr)> callback)
432
+ staged_mutation_queue::rollback_remove_or_replace(
433
+ std::shared_ptr<attempt_context_impl> ctx,
434
+ const staged_mutation& item,
435
+ async_exp_delay& delay,
436
+ utils::movable_function<void(std::exception_ptr)> callback)
409
437
  {
410
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rolling back staged remove/replace for {} with cas {}", item.doc().id(), item.doc().cas().value());
411
-
412
- asio::post(asio::bind_executor(ctx->cluster_ref().io_context(), [this, callback = std::move(callback), ctx, &item, delay]() mutable {
413
- auto handler = [this, callback = std::move(callback), ctx, &item, delay](const std::optional<client_error>& e) mutable {
414
- if (e) {
415
- return handle_rollback_remove_or_replace_error(e.value(), ctx, item, delay, std::move(callback));
416
- }
417
- return callback({});
418
- };
419
- auto ec = ctx->error_if_expired_and_not_in_overtime(STAGE_ROLLBACK_DOC, item.doc().id().key());
420
- if (ec) {
421
- return handler(client_error(*ec, "expired in rollback_remove_or_replace and not in expiry overtime"));
438
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx,
439
+ "rolling back staged remove/replace for {} with cas {}",
440
+ item.doc().id(),
441
+ item.doc().cas().value());
442
+
443
+ asio::post(asio::bind_executor(
444
+ ctx->cluster_ref().io_context(),
445
+ [this, callback = std::move(callback), ctx, &item, delay]() mutable {
446
+ auto handler = [this, callback = std::move(callback), ctx, &item, delay](
447
+ const std::optional<client_error>& e) mutable {
448
+ if (e) {
449
+ return handle_rollback_remove_or_replace_error(
450
+ e.value(), ctx, item, delay, std::move(callback));
422
451
  }
423
- ctx->hooks_.before_doc_rolled_back(
424
- ctx, item.doc().id().key(), [handler = std::move(handler), ctx, &item, delay](std::optional<error_class> ec) mutable {
425
- if (ec) {
426
- return handler(client_error(*ec, "before_doc_rolled_back hook threw error"));
427
- }
428
- core::operations::mutate_in_request req{ item.doc().id() };
429
- req.specs =
430
- couchbase::mutate_in_specs{
431
- couchbase::mutate_in_specs::remove(TRANSACTION_INTERFACE_PREFIX_ONLY).xattr(),
432
- }
433
- .specs();
434
- req.cas = item.doc().cas();
435
- wrap_durable_request(req, ctx->overall().config());
436
- return ctx->cluster_ref().execute(
437
- req, [handler = std::move(handler), ctx, &item, delay](const core::operations::mutate_in_response& resp) mutable {
438
- auto res = result::create_from_subdoc_response(resp);
439
- return validate_rollback_remove_or_replace_result(ctx, res, item, std::move(handler));
440
- });
441
- });
452
+ return callback({});
453
+ };
454
+ auto ec =
455
+ ctx->error_if_expired_and_not_in_overtime(STAGE_ROLLBACK_DOC, item.doc().id().key());
456
+ if (ec) {
457
+ return handler(
458
+ client_error(*ec, "expired in rollback_remove_or_replace and not in expiry overtime"));
459
+ }
460
+ ctx->hooks_.before_doc_rolled_back(
461
+ ctx,
462
+ item.doc().id().key(),
463
+ [handler = std::move(handler), ctx, &item, delay](std::optional<error_class> ec) mutable {
464
+ if (ec) {
465
+ return handler(client_error(*ec, "before_doc_rolled_back hook threw error"));
466
+ }
467
+ core::operations::mutate_in_request req{ item.doc().id() };
468
+ req.specs =
469
+ couchbase::mutate_in_specs{
470
+ couchbase::mutate_in_specs::remove(TRANSACTION_INTERFACE_PREFIX_ONLY).xattr(),
471
+ }
472
+ .specs();
473
+ req.cas = item.doc().cas();
474
+ req.flags = item.doc().content().flags;
475
+ wrap_durable_request(req, ctx->overall()->config());
476
+ return ctx->cluster_ref().execute(
477
+ req,
478
+ [handler = std::move(handler), ctx, &item, delay](
479
+ const core::operations::mutate_in_response& resp) mutable {
480
+ auto res = result::create_from_subdoc_response(resp);
481
+ return validate_rollback_remove_or_replace_result(ctx, res, item, std::move(handler));
482
+ });
483
+ });
442
484
  }));
443
485
  }
444
486
 
445
487
  void
446
- staged_mutation_queue::commit_doc(attempt_context_impl* ctx,
488
+ staged_mutation_queue::commit_doc(std::shared_ptr<attempt_context_impl> ctx,
447
489
  staged_mutation& item,
448
490
  async_constant_delay& delay,
449
491
  utils::movable_function<void(std::exception_ptr)> callback,
450
492
  bool ambiguity_resolution_mode,
451
493
  bool cas_zero_mode)
452
494
  {
453
- CB_ATTEMPT_CTX_LOG_TRACE(
454
- ctx, "commit doc {}, cas_zero_mode {}, ambiguity_resolution_mode {}", item.doc().id(), cas_zero_mode, ambiguity_resolution_mode);
455
-
456
- asio::post(asio::bind_executor(
457
- ctx->cluster_ref().io_context(),
458
- [this, callback = std::move(callback), ctx, &item, delay, cas_zero_mode, ambiguity_resolution_mode]() mutable {
459
- ctx->check_expiry_during_commit_or_rollback(STAGE_COMMIT_DOC, std::optional<const std::string>(item.doc().id().key()));
460
-
461
- auto handler = [this, callback = std::move(callback), ctx, &item, delay](
462
- const std::optional<client_error>& e, bool ambiguity_resolution_mode, bool cas_zero_mode) mutable {
463
- if (e) {
464
- return handle_commit_doc_error(
465
- e.value(), ctx, item, delay, ambiguity_resolution_mode, cas_zero_mode, std::move(callback));
495
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx,
496
+ "commit doc {}, cas_zero_mode {}, ambiguity_resolution_mode {}",
497
+ item.doc().id(),
498
+ cas_zero_mode,
499
+ ambiguity_resolution_mode);
500
+
501
+ asio::post(asio::bind_executor(
502
+ ctx->cluster_ref().io_context(),
503
+ [this,
504
+ callback = std::move(callback),
505
+ ctx,
506
+ &item,
507
+ delay,
508
+ cas_zero_mode,
509
+ ambiguity_resolution_mode]() mutable {
510
+ ctx->check_expiry_during_commit_or_rollback(
511
+ STAGE_COMMIT_DOC, std::optional<const std::string>(item.doc().id().key()));
512
+
513
+ auto handler = [this, callback = std::move(callback), ctx, &item, delay](
514
+ const std::optional<client_error>& e,
515
+ bool ambiguity_resolution_mode,
516
+ bool cas_zero_mode) mutable {
517
+ if (e) {
518
+ return handle_commit_doc_error(e.value(),
519
+ ctx,
520
+ item,
521
+ delay,
522
+ ambiguity_resolution_mode,
523
+ cas_zero_mode,
524
+ std::move(callback));
525
+ }
526
+ callback({});
527
+ };
528
+
529
+ ctx->hooks_.before_doc_committed(
530
+ ctx,
531
+ item.doc().id().key(),
532
+ [handler = std::move(handler), ctx, &item, delay, ambiguity_resolution_mode, cas_zero_mode](
533
+ std::optional<error_class> ec) mutable {
534
+ if (ec) {
535
+ return handler(client_error(*ec, "before_doc_committed hook threw error"),
536
+ ambiguity_resolution_mode,
537
+ cas_zero_mode);
538
+ }
539
+ // move staged content into doc
540
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx,
541
+ "commit doc id {}, content {}, cas {}",
542
+ item.doc().id(),
543
+ to_string(item.content().data),
544
+ item.doc().cas().value());
545
+
546
+ if (item.type() == staged_mutation_type::INSERT && !cas_zero_mode) {
547
+ core::operations::insert_request req{ item.doc().id(), item.content().data };
548
+ req.flags = item.content().flags;
549
+ wrap_durable_request(req, ctx->overall()->config());
550
+ return ctx->cluster_ref().execute(
551
+ req,
552
+ [handler = std::move(handler),
553
+ ctx,
554
+ &item,
555
+ delay,
556
+ ambiguity_resolution_mode,
557
+ cas_zero_mode](const core::operations::insert_response& resp) mutable {
558
+ auto res = result::create_from_mutation_response(resp);
559
+ return validate_commit_doc_result(
560
+ ctx,
561
+ res,
562
+ item,
563
+ [ambiguity_resolution_mode, cas_zero_mode, handler = std::move(handler)](
564
+ auto e) mutable {
565
+ if (e) {
566
+ return handler(e, ambiguity_resolution_mode, cas_zero_mode);
567
+ }
568
+ // Commit successful
569
+ return handler({}, {}, {});
570
+ });
571
+ });
572
+ } else {
573
+ core::operations::mutate_in_request req{ item.doc().id() };
574
+ req.specs =
575
+ couchbase::mutate_in_specs{
576
+ // TODO(SA): upsert null to "txn" to match Java implementation
577
+ //
578
+ // from CoreTransactionAttemptContext.java:
579
+ // > Upsert this field to better handle illegal doc mutation.
580
+ // > E.g. run shadowDocSameTxnKVInsert without this, fails
581
+ // > at this point as path has been removed. Could also handle
582
+ // > with a spec change to handle that.
583
+ couchbase::mutate_in_specs::remove(TRANSACTION_INTERFACE_PREFIX_ONLY).xattr(),
584
+ // subdoc::opcode::set_doc used in replace w/ empty path
585
+ couchbase::mutate_in_specs::replace_raw("", std::move(item.content().data)),
466
586
  }
467
- callback({});
468
- };
469
-
470
- ctx->hooks_.before_doc_committed(
471
- ctx,
472
- item.doc().id().key(),
473
- [handler = std::move(handler), ctx, &item, delay, ambiguity_resolution_mode, cas_zero_mode](
474
- std::optional<error_class> ec) mutable {
475
- if (ec) {
476
- return handler(client_error(*ec, "before_doc_committed hook threw error"), ambiguity_resolution_mode, cas_zero_mode);
477
- }
478
- // move staged content into doc
479
- CB_ATTEMPT_CTX_LOG_TRACE(
480
- ctx, "commit doc id {}, content {}, cas {}", item.doc().id(), to_string(item.content()), item.doc().cas().value());
481
-
482
- if (item.type() == staged_mutation_type::INSERT && !cas_zero_mode) {
483
- core::operations::insert_request req{ item.doc().id(), item.content() };
484
- req.flags = couchbase::codec::codec_flags::json_common_flags;
485
- wrap_durable_request(req, ctx->overall().config());
486
- return ctx->cluster_ref().execute(
487
- req,
488
- [handler = std::move(handler), ctx, &item, delay, ambiguity_resolution_mode, cas_zero_mode](
489
- const core::operations::insert_response& resp) mutable {
490
- auto res = result::create_from_mutation_response(resp);
491
- return validate_commit_doc_result(
492
- ctx, res, item, [ambiguity_resolution_mode, cas_zero_mode, handler = std::move(handler)](auto e) mutable {
493
- if (e) {
494
- return handler(e, ambiguity_resolution_mode, cas_zero_mode);
495
- }
496
- // Commit successful
497
- return handler({}, {}, {});
498
- });
499
- });
500
- } else {
501
- core::operations::mutate_in_request req{ item.doc().id() };
502
- req.specs =
503
- couchbase::mutate_in_specs{
504
- couchbase::mutate_in_specs::remove(TRANSACTION_INTERFACE_PREFIX_ONLY).xattr(),
505
- // subdoc::opcode::set_doc used in replace w/ empty path
506
- couchbase::mutate_in_specs::replace_raw("", item.content()),
507
- }
508
- .specs();
509
- req.store_semantics = couchbase::store_semantics::replace;
510
- req.cas = couchbase::cas(cas_zero_mode ? 0 : item.doc().cas().value());
511
- wrap_durable_request(req, ctx->overall().config());
512
- return ctx->cluster_ref().execute(
513
- req,
514
- [handler = std::move(handler), ctx, &item, delay, ambiguity_resolution_mode, cas_zero_mode](
515
- const core::operations::mutate_in_response resp) mutable {
516
- auto res = result::create_from_subdoc_response(resp);
517
- return validate_commit_doc_result(
518
- ctx, res, item, [ambiguity_resolution_mode, cas_zero_mode, handler = std::move(handler)](auto e) mutable {
519
- if (e) {
520
- return handler(e, ambiguity_resolution_mode, cas_zero_mode);
521
- }
522
- // Commit successful
523
- return handler({}, {}, {});
524
- });
525
- });
526
- }
527
- });
528
- }));
587
+ .specs();
588
+ req.store_semantics = couchbase::store_semantics::replace;
589
+ req.cas = couchbase::cas(cas_zero_mode ? 0 : item.doc().cas().value());
590
+ req.flags = item.content().flags;
591
+ wrap_durable_request(req, ctx->overall()->config());
592
+ return ctx->cluster_ref().execute(
593
+ req,
594
+ [handler = std::move(handler),
595
+ ctx,
596
+ &item,
597
+ delay,
598
+ ambiguity_resolution_mode,
599
+ cas_zero_mode](const core::operations::mutate_in_response resp) mutable {
600
+ auto res = result::create_from_subdoc_response(resp);
601
+ return validate_commit_doc_result(
602
+ ctx,
603
+ res,
604
+ item,
605
+ [ambiguity_resolution_mode, cas_zero_mode, handler = std::move(handler)](
606
+ auto e) mutable {
607
+ if (e) {
608
+ return handler(e, ambiguity_resolution_mode, cas_zero_mode);
609
+ }
610
+ // Commit successful
611
+ return handler({}, {}, {});
612
+ });
613
+ });
614
+ }
615
+ });
616
+ }));
529
617
  }
530
618
 
531
619
  void
532
- staged_mutation_queue::remove_doc(attempt_context_impl* ctx,
620
+ staged_mutation_queue::remove_doc(std::shared_ptr<attempt_context_impl> ctx,
533
621
  const staged_mutation& item,
534
622
  async_constant_delay& delay,
535
623
  utils::movable_function<void(std::exception_ptr)> callback)
536
624
  {
537
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "remove doc {}", item.doc().id());
538
-
539
- asio::post(asio::bind_executor(ctx->cluster_ref().io_context(), [this, callback = std::move(callback), ctx, &item, delay]() mutable {
540
- auto handler = [this, ctx, &item, delay, callback = std::move(callback)](const std::optional<client_error>& e) mutable {
541
- if (e) {
542
- return handle_remove_doc_error(e.value(), ctx, item, delay, std::move(callback));
543
- }
544
- return callback({});
545
- };
546
-
547
- ctx->check_expiry_during_commit_or_rollback(STAGE_REMOVE_DOC, std::optional<const std::string>(item.doc().id().key()));
548
- return ctx->hooks_.before_doc_removed(
549
- ctx, item.doc().id().key(), [ctx, &item, delay, handler = std::move(handler)](auto ec) mutable {
550
- if (ec) {
551
- return handler(client_error(*ec, "before_doc_removed hook threw error"));
552
- }
553
- core::operations::remove_request req{ item.doc().id() };
554
- wrap_durable_request(req, ctx->overall().config());
555
- return ctx->cluster_ref().execute(
556
- req, [handler = std::move(handler), ctx, &item, delay](core::operations::remove_response resp) mutable {
557
- auto res = result::create_from_mutation_response(resp);
558
- return validate_remove_doc_result(ctx, res, item, std::move(handler));
559
- });
560
- });
625
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "remove doc {}", item.doc().id());
626
+
627
+ asio::post(asio::bind_executor(
628
+ ctx->cluster_ref().io_context(),
629
+ [this, callback = std::move(callback), ctx, &item, delay]() mutable {
630
+ auto handler = [this, ctx, &item, delay, callback = std::move(callback)](
631
+ const std::optional<client_error>& e) mutable {
632
+ if (e) {
633
+ return handle_remove_doc_error(e.value(), ctx, item, delay, std::move(callback));
634
+ }
635
+ return callback({});
636
+ };
637
+
638
+ ctx->check_expiry_during_commit_or_rollback(
639
+ STAGE_REMOVE_DOC, std::optional<const std::string>(item.doc().id().key()));
640
+ return ctx->hooks_.before_doc_removed(
641
+ ctx,
642
+ item.doc().id().key(),
643
+ [ctx, &item, delay, handler = std::move(handler)](auto ec) mutable {
644
+ if (ec) {
645
+ return handler(client_error(*ec, "before_doc_removed hook threw error"));
646
+ }
647
+ core::operations::remove_request req{ item.doc().id() };
648
+ wrap_durable_request(req, ctx->overall()->config());
649
+ return ctx->cluster_ref().execute(
650
+ req,
651
+ [handler = std::move(handler), ctx, &item, delay](
652
+ core::operations::remove_response resp) mutable {
653
+ auto res = result::create_from_mutation_response(resp);
654
+ return validate_remove_doc_result(ctx, res, item, std::move(handler));
655
+ });
656
+ });
561
657
  }));
562
658
  }
563
659
 
564
660
  void
565
- staged_mutation_queue::validate_commit_doc_result(attempt_context_impl* ctx,
661
+ staged_mutation_queue::validate_commit_doc_result(std::shared_ptr<attempt_context_impl> ctx,
566
662
  result& res,
567
663
  staged_mutation& item,
568
664
  client_error_handler&& handler)
569
665
  {
570
- try {
571
- validate_operation_result(res);
572
- } catch (const client_error& e) {
573
- return handler(e);
574
- }
575
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "commit doc result {}", res);
576
- // TODO: mutation tokens
577
- ctx->hooks_.after_doc_committed_before_saving_cas(
578
- ctx, item.doc().id().key(), [ctx, res, item, handler = std::move(handler)](auto ec) mutable {
666
+ try {
667
+ validate_operation_result(res);
668
+ } catch (const client_error& e) {
669
+ return handler(e);
670
+ }
671
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "commit doc result {}", res);
672
+ // TODO: mutation tokens
673
+ ctx->hooks_.after_doc_committed_before_saving_cas(
674
+ ctx, item.doc().id().key(), [ctx, res, item, handler = std::move(handler)](auto ec) mutable {
675
+ if (ec) {
676
+ return handler(client_error(*ec, "after_doc_committed_before_saving_cas threw error"));
677
+ }
678
+ item.doc().cas(res.cas);
679
+ return ctx->hooks_.after_doc_committed(
680
+ ctx, item.doc().id().key(), [res, item, handler = std::move(handler)](auto ec) mutable {
579
681
  if (ec) {
580
- return handler(client_error(*ec, "after_doc_committed_before_saving_cas threw error"));
682
+ return handler(client_error(*ec, "after_doc_committed threw error"));
581
683
  }
582
- item.doc().cas(res.cas);
583
- return ctx->hooks_.after_doc_committed(ctx, item.doc().id().key(), [res, item, handler = std::move(handler)](auto ec) mutable {
584
- if (ec) {
585
- return handler(client_error(*ec, "after_doc_committed threw error"));
586
- }
587
- return handler({});
588
- });
589
- });
684
+ return handler({});
685
+ });
686
+ });
590
687
  }
591
688
 
592
689
  void
593
- staged_mutation_queue::validate_remove_doc_result(attempt_context_impl* ctx,
690
+ staged_mutation_queue::validate_remove_doc_result(std::shared_ptr<attempt_context_impl> ctx,
594
691
  result& res,
595
692
  const staged_mutation& item,
596
693
  client_error_handler&& handler)
597
694
  {
598
- try {
599
- validate_operation_result(res);
600
- } catch (const client_error& e) {
601
- return handler(e);
602
- }
603
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "remove doc result {}", res);
604
- return ctx->hooks_.after_doc_removed_pre_retry(ctx, item.doc().id().key(), [handler = std::move(handler)](auto ec) {
605
- if (ec) {
606
- return handler(client_error(*ec, "after_doc_removed_pre_retry threw error"));
607
- }
608
- return handler({});
695
+ try {
696
+ validate_operation_result(res);
697
+ } catch (const client_error& e) {
698
+ return handler(e);
699
+ }
700
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "remove doc result {}", res);
701
+ return ctx->hooks_.after_doc_removed_pre_retry(
702
+ ctx, item.doc().id().key(), [handler = std::move(handler)](auto ec) {
703
+ if (ec) {
704
+ return handler(client_error(*ec, "after_doc_removed_pre_retry threw error"));
705
+ }
706
+ return handler({});
609
707
  });
610
708
  }
611
709
 
612
710
  void
613
- staged_mutation_queue::validate_rollback_insert_result(attempt_context_impl* ctx,
711
+ staged_mutation_queue::validate_rollback_insert_result(std::shared_ptr<attempt_context_impl> ctx,
614
712
  result& res,
615
713
  const staged_mutation& item,
616
714
  client_error_handler&& handler)
617
715
  {
618
- try {
619
- validate_operation_result(res);
620
- } catch (const client_error& e) {
621
- return handler(e);
622
- }
623
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback insert result {}", res);
624
- return ctx->hooks_.after_rollback_delete_inserted(ctx, item.doc().id().key(), [handler = std::move(handler)](auto ec) {
625
- if (ec) {
626
- return handler(client_error(*ec, "after_rollback_delete_insert hook threw error"));
627
- }
628
- return handler({});
716
+ try {
717
+ validate_operation_result(res);
718
+ } catch (const client_error& e) {
719
+ return handler(e);
720
+ }
721
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback insert result {}", res);
722
+ return ctx->hooks_.after_rollback_delete_inserted(
723
+ ctx, item.doc().id().key(), [handler = std::move(handler)](auto ec) {
724
+ if (ec) {
725
+ return handler(client_error(*ec, "after_rollback_delete_insert hook threw error"));
726
+ }
727
+ return handler({});
629
728
  });
630
729
  }
631
730
 
632
731
  void
633
- staged_mutation_queue::validate_rollback_remove_or_replace_result(attempt_context_impl* ctx,
634
- result& res,
635
- const staged_mutation& item,
636
- client_error_handler&& handler)
732
+ staged_mutation_queue::validate_rollback_remove_or_replace_result(
733
+ std::shared_ptr<attempt_context_impl> ctx,
734
+ result& res,
735
+ const staged_mutation& item,
736
+ client_error_handler&& handler)
637
737
  {
638
- try {
639
- validate_operation_result(res);
640
- } catch (const client_error& e) {
641
- return handler(e);
642
- }
643
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback remove or replace result {}", res);
644
- return ctx->hooks_.after_rollback_replace_or_remove(ctx, item.doc().id().key(), [handler = std::move(handler)](auto ec) {
645
- if (ec) {
646
- return handler(client_error(*ec, "after_rollback_replace_or_remove hook threw error"));
647
- }
648
- return handler({});
738
+ try {
739
+ validate_operation_result(res);
740
+ } catch (const client_error& e) {
741
+ return handler(e);
742
+ }
743
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback remove or replace result {}", res);
744
+ return ctx->hooks_.after_rollback_replace_or_remove(
745
+ ctx, item.doc().id().key(), [handler = std::move(handler)](auto ec) {
746
+ if (ec) {
747
+ return handler(client_error(*ec, "after_rollback_replace_or_remove hook threw error"));
748
+ }
749
+ return handler({});
649
750
  });
650
751
  }
651
752
 
652
753
  void
653
- staged_mutation_queue::handle_commit_doc_error(const client_error& e,
654
- attempt_context_impl* ctx,
655
- staged_mutation& item,
656
- async_constant_delay& delay,
657
- bool ambiguity_resolution_mode,
658
- bool cas_zero_mode,
659
- utils::movable_function<void(std::exception_ptr)> callback)
754
+ staged_mutation_queue::handle_commit_doc_error(
755
+ const client_error& e,
756
+ std::shared_ptr<attempt_context_impl> ctx,
757
+ staged_mutation& item,
758
+ async_constant_delay& delay,
759
+ bool ambiguity_resolution_mode,
760
+ bool cas_zero_mode,
761
+ utils::movable_function<void(std::exception_ptr)> callback)
660
762
  {
661
- const error_class ec = e.ec();
662
- try {
663
- if (ctx->expiry_overtime_mode_.load()) {
664
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "commit_doc for {} error while in overtime mode {}", item.doc().id(), e.what());
665
- throw transaction_operation_failed(FAIL_EXPIRY, "expired during commit").no_rollback().failed_post_commit();
666
- }
667
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "commit_doc for {} error {}", item.doc().id(), e.what());
668
- switch (ec) {
669
- case FAIL_AMBIGUOUS:
670
- ambiguity_resolution_mode = true;
671
- throw retry_operation("FAIL_AMBIGUOUS in commit_doc");
672
- case FAIL_CAS_MISMATCH:
673
- case FAIL_DOC_ALREADY_EXISTS:
674
- if (ambiguity_resolution_mode) {
675
- throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
676
- }
677
- ambiguity_resolution_mode = true;
678
- cas_zero_mode = true;
679
- throw retry_operation("FAIL_DOC_ALREADY_EXISTS in commit_doc");
680
- default:
681
- throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
763
+ const error_class ec = e.ec();
764
+ try {
765
+ if (ctx->expiry_overtime_mode_.load()) {
766
+ CB_ATTEMPT_CTX_LOG_TRACE(
767
+ ctx, "commit_doc for {} error while in overtime mode {}", item.doc().id(), e.what());
768
+ throw transaction_operation_failed(FAIL_EXPIRY, "expired during commit")
769
+ .no_rollback()
770
+ .failed_post_commit();
771
+ }
772
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "commit_doc for {} error {}", item.doc().id(), e.what());
773
+ switch (ec) {
774
+ case FAIL_AMBIGUOUS:
775
+ ambiguity_resolution_mode = true;
776
+ throw retry_operation("FAIL_AMBIGUOUS in commit_doc");
777
+ case FAIL_CAS_MISMATCH:
778
+ case FAIL_DOC_ALREADY_EXISTS:
779
+ if (ambiguity_resolution_mode) {
780
+ throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
682
781
  }
683
- } catch (const retry_operation&) {
684
- delay([this, callback = std::move(callback), ctx, &item, delay, ambiguity_resolution_mode, cas_zero_mode](
685
- const std::exception_ptr& exc) mutable {
686
- if (exc) {
687
- callback(exc);
688
- return;
689
- }
690
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying commit_doc");
691
- commit_doc(ctx, item, delay, std::move(callback), ambiguity_resolution_mode, cas_zero_mode);
692
- });
693
- } catch (const transaction_operation_failed&) {
694
- callback(std::current_exception());
782
+ ambiguity_resolution_mode = true;
783
+ cas_zero_mode = true;
784
+ throw retry_operation("FAIL_DOC_ALREADY_EXISTS in commit_doc");
785
+ default:
786
+ throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
695
787
  }
788
+ } catch (const retry_operation&) {
789
+ delay([this,
790
+ callback = std::move(callback),
791
+ ctx,
792
+ &item,
793
+ delay,
794
+ ambiguity_resolution_mode,
795
+ cas_zero_mode](const std::exception_ptr& exc) mutable {
796
+ if (exc) {
797
+ callback(exc);
798
+ return;
799
+ }
800
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying commit_doc");
801
+ commit_doc(ctx, item, delay, std::move(callback), ambiguity_resolution_mode, cas_zero_mode);
802
+ });
803
+ } catch (const transaction_operation_failed&) {
804
+ callback(std::current_exception());
805
+ }
696
806
  }
697
807
 
698
808
  void
699
- staged_mutation_queue::handle_remove_doc_error(const client_error& e,
700
- attempt_context_impl* ctx,
701
- const staged_mutation& item,
702
- async_constant_delay& delay,
703
- utils::movable_function<void(std::exception_ptr)> callback)
809
+ staged_mutation_queue::handle_remove_doc_error(
810
+ const client_error& e,
811
+ std::shared_ptr<attempt_context_impl> ctx,
812
+ const staged_mutation& item,
813
+ async_constant_delay& delay,
814
+ utils::movable_function<void(std::exception_ptr)> callback)
704
815
  {
705
- auto ec = e.ec();
706
- try {
707
- if (ctx->expiry_overtime_mode_.load()) {
708
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "remove_doc for {} error while in overtime mode {}", item.doc().id(), e.what());
709
- throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
710
- }
711
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "remove_doc for {} error {}", item.doc().id(), e.what());
712
- switch (ec) {
713
- case FAIL_AMBIGUOUS:
714
- throw retry_operation("remove_doc got FAIL_AMBIGUOUS");
715
- default:
716
- throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
717
- }
718
- } catch (const retry_operation&) {
719
- delay([this, callback = std::move(callback), ctx, &item, delay](const std::exception_ptr& exc) mutable {
720
- if (exc) {
721
- callback(exc);
722
- return;
723
- }
724
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying remove_doc");
725
- remove_doc(ctx, item, delay, std::move(callback));
726
- });
727
- } catch (const transaction_operation_failed&) {
728
- callback(std::current_exception());
816
+ auto ec = e.ec();
817
+ try {
818
+ if (ctx->expiry_overtime_mode_.load()) {
819
+ CB_ATTEMPT_CTX_LOG_TRACE(
820
+ ctx, "remove_doc for {} error while in overtime mode {}", item.doc().id(), e.what());
821
+ throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
822
+ }
823
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "remove_doc for {} error {}", item.doc().id(), e.what());
824
+ switch (ec) {
825
+ case FAIL_AMBIGUOUS:
826
+ throw retry_operation("remove_doc got FAIL_AMBIGUOUS");
827
+ default:
828
+ throw transaction_operation_failed(ec, e.what()).no_rollback().failed_post_commit();
729
829
  }
830
+ } catch (const retry_operation&) {
831
+ delay([this, callback = std::move(callback), ctx, &item, delay](
832
+ const std::exception_ptr& exc) mutable {
833
+ if (exc) {
834
+ callback(exc);
835
+ return;
836
+ }
837
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying remove_doc");
838
+ remove_doc(ctx, item, delay, std::move(callback));
839
+ });
840
+ } catch (const transaction_operation_failed&) {
841
+ callback(std::current_exception());
842
+ }
730
843
  }
731
844
 
732
845
  void
733
- staged_mutation_queue::handle_rollback_insert_error(const client_error& e,
734
- attempt_context_impl* ctx,
735
- const staged_mutation& item,
736
- async_exp_delay& delay,
737
- utils::movable_function<void(std::exception_ptr)> callback)
846
+ staged_mutation_queue::handle_rollback_insert_error(
847
+ const client_error& e,
848
+ std::shared_ptr<attempt_context_impl> ctx,
849
+ const staged_mutation& item,
850
+ async_exp_delay& delay,
851
+ utils::movable_function<void(std::exception_ptr)> callback)
738
852
  {
739
- auto ec = e.ec();
740
- try {
741
- if (ctx->expiry_overtime_mode_.load()) {
742
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback_insert for {} error while in overtime mode {}", item.doc().id(), e.what());
743
- throw transaction_operation_failed(FAIL_EXPIRY, std::string("expired while rolling back insert with {} ") + e.what())
744
- .no_rollback()
745
- .expired();
746
- }
747
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback_insert for {} error {}", item.doc().id(), e.what());
748
- switch (ec) {
749
- case FAIL_HARD:
750
- case FAIL_CAS_MISMATCH:
751
- throw transaction_operation_failed(ec, e.what()).no_rollback();
752
- case FAIL_EXPIRY:
753
- ctx->expiry_overtime_mode_ = true;
754
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback_insert in expiry overtime mode, retrying...");
755
- throw retry_operation("retry rollback_insert");
756
- case FAIL_DOC_NOT_FOUND:
757
- case FAIL_PATH_NOT_FOUND:
758
- // already cleaned up?
759
- callback({});
760
- return;
761
- default:
762
- throw retry_operation("retry rollback insert");
763
- }
764
- } catch (const retry_operation&) {
765
- delay([this, callback = std::move(callback), ctx, &item, delay](const std::exception_ptr& exc) mutable {
766
- if (exc) {
767
- callback(exc);
768
- return;
769
- }
770
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying rollback_insert");
771
- rollback_insert(ctx, item, delay, std::move(callback));
772
- });
773
- } catch (const transaction_operation_failed&) {
774
- callback(std::current_exception());
853
+ auto ec = e.ec();
854
+ try {
855
+ if (ctx->expiry_overtime_mode_.load()) {
856
+ CB_ATTEMPT_CTX_LOG_TRACE(
857
+ ctx, "rollback_insert for {} error while in overtime mode {}", item.doc().id(), e.what());
858
+ throw transaction_operation_failed(
859
+ FAIL_EXPIRY, std::string("expired while rolling back insert with {} ") + e.what())
860
+ .no_rollback()
861
+ .expired();
862
+ }
863
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback_insert for {} error {}", item.doc().id(), e.what());
864
+ switch (ec) {
865
+ case FAIL_HARD:
866
+ case FAIL_CAS_MISMATCH:
867
+ throw transaction_operation_failed(ec, e.what()).no_rollback();
868
+ case FAIL_EXPIRY:
869
+ ctx->expiry_overtime_mode_ = true;
870
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback_insert in expiry overtime mode, retrying...");
871
+ throw retry_operation("retry rollback_insert");
872
+ case FAIL_DOC_NOT_FOUND:
873
+ case FAIL_PATH_NOT_FOUND:
874
+ // already cleaned up?
875
+ callback({});
876
+ return;
877
+ default:
878
+ throw retry_operation("retry rollback insert");
775
879
  }
880
+ } catch (const retry_operation&) {
881
+ delay([this, callback = std::move(callback), ctx, &item, delay](
882
+ const std::exception_ptr& exc) mutable {
883
+ if (exc) {
884
+ callback(exc);
885
+ return;
886
+ }
887
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying rollback_insert");
888
+ rollback_insert(ctx, item, delay, std::move(callback));
889
+ });
890
+ } catch (const transaction_operation_failed&) {
891
+ callback(std::current_exception());
892
+ }
776
893
  }
777
894
 
778
895
  void
779
- staged_mutation_queue::handle_rollback_remove_or_replace_error(const client_error& e,
780
- attempt_context_impl* ctx,
781
- const staged_mutation& item,
782
- async_exp_delay& delay,
783
- utils::movable_function<void(std::exception_ptr)> callback)
896
+ staged_mutation_queue::handle_rollback_remove_or_replace_error(
897
+ const client_error& e,
898
+ std::shared_ptr<attempt_context_impl> ctx,
899
+ const staged_mutation& item,
900
+ async_exp_delay& delay,
901
+ utils::movable_function<void(std::exception_ptr)> callback)
784
902
  {
785
- auto ec = e.ec();
786
- try {
787
- if (ctx->expiry_overtime_mode_.load()) {
788
- CB_ATTEMPT_CTX_LOG_TRACE(
789
- ctx, "rollback_remove_or_replace_error for {} error while in overtime mode {}", item.doc().id(), e.what());
790
- throw transaction_operation_failed(FAIL_EXPIRY, std::string("expired while handling ") + e.what()).no_rollback();
791
- }
792
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "rollback_remove_or_replace_error for {} error {}", item.doc().id(), e.what());
793
- switch (ec) {
794
- case FAIL_HARD:
795
- case FAIL_DOC_NOT_FOUND:
796
- case FAIL_CAS_MISMATCH:
797
- throw transaction_operation_failed(ec, e.what()).no_rollback();
798
- case FAIL_EXPIRY:
799
- ctx->expiry_overtime_mode_ = true;
800
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "setting expiry overtime mode in {}", STAGE_ROLLBACK_DOC);
801
- throw retry_operation("retry rollback_remove_or_replace");
802
- case FAIL_PATH_NOT_FOUND:
803
- // already cleaned up?
804
- callback({});
805
- return;
806
- default:
807
- throw retry_operation("retry rollback_remove_or_replace");
808
- }
809
- } catch (const retry_operation&) {
810
- delay([this, callback = std::move(callback), ctx, &item, delay](const std::exception_ptr& exc) mutable {
811
- if (exc) {
812
- callback(exc);
813
- return;
814
- }
815
- CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying rollback_remove_or_replace");
816
- rollback_remove_or_replace(ctx, item, delay, std::move(callback));
817
- });
818
- } catch (const transaction_operation_failed&) {
819
- callback(std::current_exception());
903
+ auto ec = e.ec();
904
+ try {
905
+ if (ctx->expiry_overtime_mode_.load()) {
906
+ CB_ATTEMPT_CTX_LOG_TRACE(
907
+ ctx,
908
+ "rollback_remove_or_replace_error for {} error while in overtime mode {}",
909
+ item.doc().id(),
910
+ e.what());
911
+ throw transaction_operation_failed(FAIL_EXPIRY,
912
+ std::string("expired while handling ") + e.what())
913
+ .no_rollback();
820
914
  }
915
+ CB_ATTEMPT_CTX_LOG_TRACE(
916
+ ctx, "rollback_remove_or_replace_error for {} error {}", item.doc().id(), e.what());
917
+ switch (ec) {
918
+ case FAIL_HARD:
919
+ case FAIL_DOC_NOT_FOUND:
920
+ case FAIL_CAS_MISMATCH:
921
+ throw transaction_operation_failed(ec, e.what()).no_rollback();
922
+ case FAIL_EXPIRY:
923
+ ctx->expiry_overtime_mode_ = true;
924
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "setting expiry overtime mode in {}", STAGE_ROLLBACK_DOC);
925
+ throw retry_operation("retry rollback_remove_or_replace");
926
+ case FAIL_PATH_NOT_FOUND:
927
+ // already cleaned up?
928
+ callback({});
929
+ return;
930
+ default:
931
+ throw retry_operation("retry rollback_remove_or_replace");
932
+ }
933
+ } catch (const retry_operation&) {
934
+ delay([this, callback = std::move(callback), ctx, &item, delay](
935
+ const std::exception_ptr& exc) mutable {
936
+ if (exc) {
937
+ callback(exc);
938
+ return;
939
+ }
940
+ CB_ATTEMPT_CTX_LOG_TRACE(ctx, "retrying rollback_remove_or_replace");
941
+ rollback_remove_or_replace(ctx, item, delay, std::move(callback));
942
+ });
943
+ } catch (const transaction_operation_failed&) {
944
+ callback(std::current_exception());
945
+ }
946
+ }
947
+
948
+ auto
949
+ staged_mutation::is_staged_binary() const -> bool
950
+ {
951
+ return codec::codec_flags::has_common_flags(content_.flags,
952
+ codec::codec_flags::binary_common_flags);
821
953
  }
822
954
  } // namespace couchbase::core::transactions