couchbase 4.4.2 → 4.4.4

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 (252) hide show
  1. package/BUILDING.md +182 -0
  2. package/CMakeLists.txt +13 -0
  3. package/CONTRIBUTING.md +1 -1
  4. package/README.md +4 -2
  5. package/deps/couchbase-cxx-cache/boringssl/e31ea00c1ea52052d2d78d44006cc88c80fa24a9/boringssl/src/BUILDING.md +206 -0
  6. package/deps/couchbase-cxx-client/CMakeLists.txt +18 -13
  7. package/deps/couchbase-cxx-client/README.md +2 -2
  8. package/deps/couchbase-cxx-client/cmake/APKBUILD.in +54 -0
  9. package/deps/couchbase-cxx-client/cmake/CompilerWarnings.cmake +0 -5
  10. package/deps/couchbase-cxx-client/cmake/Packaging.cmake +177 -10
  11. package/deps/couchbase-cxx-client/cmake/RPath.cmake +10 -0
  12. package/deps/couchbase-cxx-client/cmake/Testing.cmake +1 -1
  13. package/deps/couchbase-cxx-client/cmake/VersionInfo.cmake +28 -2
  14. package/deps/couchbase-cxx-client/cmake/build_version.hxx.in +1 -0
  15. package/deps/couchbase-cxx-client/cmake/couchbase-cxx-client.spec.in +45 -6
  16. package/deps/couchbase-cxx-client/cmake/couchbase_cxx_client.pc.in +2 -2
  17. package/deps/couchbase-cxx-client/cmake/debian/changelog.in +5 -0
  18. package/deps/couchbase-cxx-client/cmake/debian/compat +1 -0
  19. package/deps/couchbase-cxx-client/cmake/debian/control +40 -0
  20. package/deps/couchbase-cxx-client/cmake/debian/rules +41 -0
  21. package/deps/couchbase-cxx-client/cmake/debian/source/format +1 -0
  22. package/deps/couchbase-cxx-client/core/agent_group.cxx +8 -0
  23. package/deps/couchbase-cxx-client/core/agent_group.hxx +4 -0
  24. package/deps/couchbase-cxx-client/core/bucket.cxx +16 -20
  25. package/deps/couchbase-cxx-client/core/bucket.hxx +12 -12
  26. package/deps/couchbase-cxx-client/core/cluster.cxx +44 -52
  27. package/deps/couchbase-cxx-client/core/cluster_agent.cxx +8 -0
  28. package/deps/couchbase-cxx-client/core/cluster_agent.hxx +4 -0
  29. package/deps/couchbase-cxx-client/core/collections_component.cxx +2 -2
  30. package/deps/couchbase-cxx-client/core/columnar/agent.cxx +2 -2
  31. package/deps/couchbase-cxx-client/core/columnar/agent.hxx +1 -1
  32. package/deps/couchbase-cxx-client/core/columnar/management_component.cxx +3 -3
  33. package/deps/couchbase-cxx-client/core/columnar/query_component.cxx +103 -45
  34. package/deps/couchbase-cxx-client/core/columnar/query_component.hxx +1 -0
  35. package/deps/couchbase-cxx-client/core/free_form_http_request.hxx +8 -0
  36. package/deps/couchbase-cxx-client/core/http_component.cxx +55 -24
  37. package/deps/couchbase-cxx-client/core/http_component.hxx +4 -0
  38. package/deps/couchbase-cxx-client/core/impl/analytics.cxx +1 -0
  39. package/deps/couchbase-cxx-client/core/impl/analytics_index_manager.cxx +15 -15
  40. package/deps/couchbase-cxx-client/core/impl/bootstrap_error.hxx +10 -2
  41. package/deps/couchbase-cxx-client/core/impl/bucket.cxx +1 -1
  42. package/deps/couchbase-cxx-client/core/impl/bucket_manager.cxx +6 -6
  43. package/deps/couchbase-cxx-client/core/impl/cluster.cxx +36 -40
  44. package/deps/couchbase-cxx-client/core/impl/collection.cxx +29 -5
  45. package/deps/couchbase-cxx-client/core/impl/collection_manager.cxx +5 -5
  46. package/deps/couchbase-cxx-client/core/impl/error.cxx +24 -3
  47. package/deps/couchbase-cxx-client/core/impl/get_replica.hxx +2 -0
  48. package/deps/couchbase-cxx-client/core/impl/lookup_in_replica.hxx +2 -0
  49. package/deps/couchbase-cxx-client/core/impl/observe_poll.cxx +13 -5
  50. package/deps/couchbase-cxx-client/core/impl/observe_poll.hxx +1 -3
  51. package/deps/couchbase-cxx-client/core/impl/observe_seqno.hxx +2 -0
  52. package/deps/couchbase-cxx-client/core/impl/query.cxx +1 -0
  53. package/deps/couchbase-cxx-client/core/impl/query_index_manager.cxx +6 -6
  54. package/deps/couchbase-cxx-client/core/impl/scan_result.cxx +1 -1
  55. package/deps/couchbase-cxx-client/core/impl/search.cxx +2 -0
  56. package/deps/couchbase-cxx-client/core/impl/search_index_manager.cxx +12 -12
  57. package/deps/couchbase-cxx-client/core/io/http_command.hxx +31 -20
  58. package/deps/couchbase-cxx-client/core/io/http_session.cxx +5 -0
  59. package/deps/couchbase-cxx-client/core/io/http_session.hxx +17 -4
  60. package/deps/couchbase-cxx-client/core/io/http_session_manager.hxx +97 -49
  61. package/deps/couchbase-cxx-client/core/io/mcbp_command.hxx +15 -14
  62. package/deps/couchbase-cxx-client/core/io/mcbp_session.cxx +48 -33
  63. package/deps/couchbase-cxx-client/core/io/streams.cxx +256 -0
  64. package/deps/couchbase-cxx-client/core/io/streams.hxx +31 -155
  65. package/deps/couchbase-cxx-client/core/logger/configuration.hxx +5 -0
  66. package/deps/couchbase-cxx-client/core/logger/custom_rotating_file_sink.cxx +2 -3
  67. package/deps/couchbase-cxx-client/core/logger/logger.cxx +39 -7
  68. package/deps/couchbase-cxx-client/core/logger/logger.hxx +7 -0
  69. package/deps/couchbase-cxx-client/core/meta/features.hxx +11 -0
  70. package/deps/couchbase-cxx-client/core/meta/version.cxx +47 -6
  71. package/deps/couchbase-cxx-client/core/metrics/meter_wrapper.cxx +188 -0
  72. package/deps/couchbase-cxx-client/core/metrics/meter_wrapper.hxx +73 -0
  73. package/deps/couchbase-cxx-client/core/operations/document_analytics.cxx +23 -17
  74. package/deps/couchbase-cxx-client/core/operations/document_analytics.hxx +1 -0
  75. package/deps/couchbase-cxx-client/core/operations/document_append.hxx +2 -0
  76. package/deps/couchbase-cxx-client/core/operations/document_decrement.hxx +2 -0
  77. package/deps/couchbase-cxx-client/core/operations/document_exists.hxx +2 -0
  78. package/deps/couchbase-cxx-client/core/operations/document_get.hxx +2 -0
  79. package/deps/couchbase-cxx-client/core/operations/document_get_all_replicas.hxx +2 -0
  80. package/deps/couchbase-cxx-client/core/operations/document_get_and_lock.hxx +2 -0
  81. package/deps/couchbase-cxx-client/core/operations/document_get_and_touch.hxx +2 -0
  82. package/deps/couchbase-cxx-client/core/operations/document_get_any_replica.hxx +2 -0
  83. package/deps/couchbase-cxx-client/core/operations/document_get_projected.hxx +2 -0
  84. package/deps/couchbase-cxx-client/core/operations/document_increment.hxx +2 -0
  85. package/deps/couchbase-cxx-client/core/operations/document_insert.hxx +2 -0
  86. package/deps/couchbase-cxx-client/core/operations/document_lookup_in.hxx +2 -0
  87. package/deps/couchbase-cxx-client/core/operations/document_lookup_in_all_replicas.hxx +2 -0
  88. package/deps/couchbase-cxx-client/core/operations/document_lookup_in_any_replica.hxx +2 -0
  89. package/deps/couchbase-cxx-client/core/operations/document_mutate_in.hxx +2 -0
  90. package/deps/couchbase-cxx-client/core/operations/document_prepend.hxx +2 -0
  91. package/deps/couchbase-cxx-client/core/operations/document_query.hxx +1 -0
  92. package/deps/couchbase-cxx-client/core/operations/document_remove.hxx +2 -0
  93. package/deps/couchbase-cxx-client/core/operations/document_replace.hxx +2 -0
  94. package/deps/couchbase-cxx-client/core/operations/document_search.hxx +1 -0
  95. package/deps/couchbase-cxx-client/core/operations/document_touch.hxx +2 -0
  96. package/deps/couchbase-cxx-client/core/operations/document_unlock.hxx +2 -0
  97. package/deps/couchbase-cxx-client/core/operations/document_upsert.hxx +2 -0
  98. package/deps/couchbase-cxx-client/core/operations/document_view.hxx +1 -0
  99. package/deps/couchbase-cxx-client/core/operations/http_noop.hxx +2 -0
  100. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_create.hxx +1 -0
  101. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_drop.hxx +1 -0
  102. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataset_get_all.hxx +1 -0
  103. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_create.hxx +1 -0
  104. package/deps/couchbase-cxx-client/core/operations/management/analytics_dataverse_drop.hxx +1 -0
  105. package/deps/couchbase-cxx-client/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
  106. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_create.hxx +1 -0
  107. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_drop.hxx +1 -0
  108. package/deps/couchbase-cxx-client/core/operations/management/analytics_index_get_all.hxx +1 -0
  109. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_connect.hxx +1 -0
  110. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_create.hxx +1 -0
  111. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_disconnect.hxx +1 -0
  112. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_drop.hxx +1 -0
  113. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_get_all.cxx +23 -15
  114. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_get_all.hxx +4 -3
  115. package/deps/couchbase-cxx-client/core/operations/management/analytics_link_replace.hxx +1 -0
  116. package/deps/couchbase-cxx-client/core/operations/management/bucket_create.hxx +1 -0
  117. package/deps/couchbase-cxx-client/core/operations/management/bucket_describe.cxx +2 -1
  118. package/deps/couchbase-cxx-client/core/operations/management/bucket_describe.hxx +1 -0
  119. package/deps/couchbase-cxx-client/core/operations/management/bucket_drop.cxx +3 -1
  120. package/deps/couchbase-cxx-client/core/operations/management/bucket_drop.hxx +1 -0
  121. package/deps/couchbase-cxx-client/core/operations/management/bucket_flush.cxx +3 -1
  122. package/deps/couchbase-cxx-client/core/operations/management/bucket_flush.hxx +1 -0
  123. package/deps/couchbase-cxx-client/core/operations/management/bucket_get.cxx +3 -1
  124. package/deps/couchbase-cxx-client/core/operations/management/bucket_get.hxx +1 -0
  125. package/deps/couchbase-cxx-client/core/operations/management/bucket_get_all.hxx +1 -0
  126. package/deps/couchbase-cxx-client/core/operations/management/bucket_update.cxx +3 -1
  127. package/deps/couchbase-cxx-client/core/operations/management/bucket_update.hxx +1 -0
  128. package/deps/couchbase-cxx-client/core/operations/management/change_password.hxx +1 -0
  129. package/deps/couchbase-cxx-client/core/operations/management/cluster_describe.hxx +1 -0
  130. package/deps/couchbase-cxx-client/core/operations/management/cluster_developer_preview_enable.hxx +1 -0
  131. package/deps/couchbase-cxx-client/core/operations/management/collection_create.cxx +3 -2
  132. package/deps/couchbase-cxx-client/core/operations/management/collection_create.hxx +2 -0
  133. package/deps/couchbase-cxx-client/core/operations/management/collection_drop.cxx +5 -2
  134. package/deps/couchbase-cxx-client/core/operations/management/collection_drop.hxx +1 -0
  135. package/deps/couchbase-cxx-client/core/operations/management/collection_update.cxx +4 -2
  136. package/deps/couchbase-cxx-client/core/operations/management/collection_update.hxx +2 -0
  137. package/deps/couchbase-cxx-client/core/operations/management/collections_manifest_get.hxx +2 -0
  138. package/deps/couchbase-cxx-client/core/operations/management/eventing_deploy_function.hxx +3 -2
  139. package/deps/couchbase-cxx-client/core/operations/management/eventing_drop_function.hxx +3 -2
  140. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_all_functions.hxx +3 -2
  141. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_function.hxx +3 -2
  142. package/deps/couchbase-cxx-client/core/operations/management/eventing_get_status.hxx +3 -2
  143. package/deps/couchbase-cxx-client/core/operations/management/eventing_pause_function.hxx +3 -2
  144. package/deps/couchbase-cxx-client/core/operations/management/eventing_resume_function.hxx +3 -2
  145. package/deps/couchbase-cxx-client/core/operations/management/eventing_undeploy_function.hxx +3 -2
  146. package/deps/couchbase-cxx-client/core/operations/management/eventing_upsert_function.hxx +3 -2
  147. package/deps/couchbase-cxx-client/core/operations/management/freeform.hxx +2 -0
  148. package/deps/couchbase-cxx-client/core/operations/management/group_drop.hxx +1 -0
  149. package/deps/couchbase-cxx-client/core/operations/management/group_get.hxx +1 -0
  150. package/deps/couchbase-cxx-client/core/operations/management/group_get_all.hxx +1 -0
  151. package/deps/couchbase-cxx-client/core/operations/management/group_upsert.cxx +3 -3
  152. package/deps/couchbase-cxx-client/core/operations/management/group_upsert.hxx +1 -0
  153. package/deps/couchbase-cxx-client/core/operations/management/query_index_build.hxx +2 -0
  154. package/deps/couchbase-cxx-client/core/operations/management/query_index_build_deferred.hxx +3 -0
  155. package/deps/couchbase-cxx-client/core/operations/management/query_index_create.hxx +1 -0
  156. package/deps/couchbase-cxx-client/core/operations/management/query_index_drop.hxx +1 -0
  157. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all.hxx +2 -0
  158. package/deps/couchbase-cxx-client/core/operations/management/query_index_get_all_deferred.hxx +3 -0
  159. package/deps/couchbase-cxx-client/core/operations/management/role_get_all.hxx +1 -0
  160. package/deps/couchbase-cxx-client/core/operations/management/scope_create.cxx +2 -1
  161. package/deps/couchbase-cxx-client/core/operations/management/scope_create.hxx +1 -0
  162. package/deps/couchbase-cxx-client/core/operations/management/scope_drop.cxx +4 -1
  163. package/deps/couchbase-cxx-client/core/operations/management/scope_drop.hxx +1 -0
  164. package/deps/couchbase-cxx-client/core/operations/management/scope_get_all.cxx +3 -1
  165. package/deps/couchbase-cxx-client/core/operations/management/scope_get_all.hxx +1 -0
  166. package/deps/couchbase-cxx-client/core/operations/management/search_get_stats.hxx +1 -0
  167. package/deps/couchbase-cxx-client/core/operations/management/search_index_analyze_document.cxx +3 -2
  168. package/deps/couchbase-cxx-client/core/operations/management/search_index_analyze_document.hxx +1 -0
  169. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_ingest.cxx +3 -2
  170. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_ingest.hxx +1 -0
  171. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_plan_freeze.cxx +3 -2
  172. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_plan_freeze.hxx +1 -0
  173. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_query.cxx +3 -2
  174. package/deps/couchbase-cxx-client/core/operations/management/search_index_control_query.hxx +1 -0
  175. package/deps/couchbase-cxx-client/core/operations/management/search_index_drop.cxx +5 -2
  176. package/deps/couchbase-cxx-client/core/operations/management/search_index_drop.hxx +1 -0
  177. package/deps/couchbase-cxx-client/core/operations/management/search_index_get.cxx +5 -2
  178. package/deps/couchbase-cxx-client/core/operations/management/search_index_get.hxx +1 -0
  179. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_all.cxx +4 -2
  180. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_all.hxx +1 -0
  181. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_documents_count.cxx +3 -2
  182. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_documents_count.hxx +2 -0
  183. package/deps/couchbase-cxx-client/core/operations/management/search_index_get_stats.hxx +1 -0
  184. package/deps/couchbase-cxx-client/core/operations/management/search_index_upsert.cxx +5 -2
  185. package/deps/couchbase-cxx-client/core/operations/management/search_index_upsert.hxx +1 -0
  186. package/deps/couchbase-cxx-client/core/operations/management/user_drop.hxx +1 -0
  187. package/deps/couchbase-cxx-client/core/operations/management/user_get.hxx +1 -0
  188. package/deps/couchbase-cxx-client/core/operations/management/user_get_all.hxx +1 -0
  189. package/deps/couchbase-cxx-client/core/operations/management/user_upsert.cxx +3 -3
  190. package/deps/couchbase-cxx-client/core/operations/management/user_upsert.hxx +1 -0
  191. package/deps/couchbase-cxx-client/core/operations/management/view_index_drop.cxx +2 -1
  192. package/deps/couchbase-cxx-client/core/operations/management/view_index_drop.hxx +1 -0
  193. package/deps/couchbase-cxx-client/core/operations/management/view_index_get.cxx +2 -1
  194. package/deps/couchbase-cxx-client/core/operations/management/view_index_get.hxx +1 -0
  195. package/deps/couchbase-cxx-client/core/operations/management/view_index_get_all.cxx +3 -1
  196. package/deps/couchbase-cxx-client/core/operations/management/view_index_get_all.hxx +2 -0
  197. package/deps/couchbase-cxx-client/core/operations/management/view_index_upsert.cxx +2 -1
  198. package/deps/couchbase-cxx-client/core/operations/management/view_index_upsert.hxx +1 -0
  199. package/deps/couchbase-cxx-client/core/origin.cxx +37 -17
  200. package/deps/couchbase-cxx-client/core/platform/base64.cc +1 -1
  201. package/deps/couchbase-cxx-client/core/platform/random.cc +2 -0
  202. package/deps/couchbase-cxx-client/core/platform/uuid.h +6 -6
  203. package/deps/couchbase-cxx-client/core/row_streamer.cxx +1 -1
  204. package/deps/couchbase-cxx-client/core/sasl/scram-sha/stringutils.cc +1 -1
  205. package/deps/couchbase-cxx-client/core/sasl/scram-sha/stringutils.h +4 -4
  206. package/deps/couchbase-cxx-client/core/topology/configuration.hxx +2 -0
  207. package/deps/couchbase-cxx-client/core/topology/configuration_json.hxx +8 -0
  208. package/deps/couchbase-cxx-client/core/tracing/constants.hxx +3 -0
  209. package/deps/couchbase-cxx-client/core/tracing/tracer_wrapper.cxx +87 -0
  210. package/deps/couchbase-cxx-client/core/tracing/tracer_wrapper.hxx +57 -0
  211. package/deps/couchbase-cxx-client/core/transactions/async_attempt_context.hxx +9 -21
  212. package/deps/couchbase-cxx-client/core/transactions/attempt_context.hxx +6 -33
  213. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.cxx +57 -56
  214. package/deps/couchbase-cxx-client/core/transactions/attempt_context_impl.hxx +17 -18
  215. package/deps/couchbase-cxx-client/core/transactions/staged_mutation.cxx +2 -2
  216. package/deps/couchbase-cxx-client/core/transactions/transaction_context.cxx +2 -2
  217. package/deps/couchbase-cxx-client/core/transactions/transaction_get_result.hxx +0 -20
  218. package/deps/couchbase-cxx-client/core/transactions/transactions.cxx +2 -2
  219. package/deps/couchbase-cxx-client/core/utils/connection_string.cxx +128 -52
  220. package/deps/couchbase-cxx-client/couchbase/analytics_options.hxx +4 -3
  221. package/deps/couchbase-cxx-client/couchbase/codec/tao_json_serializer.hxx +1 -1
  222. package/deps/couchbase-cxx-client/couchbase/common_options.hxx +16 -1
  223. package/deps/couchbase-cxx-client/couchbase/metrics/otel_meter.hxx +16 -20
  224. package/deps/couchbase-cxx-client/couchbase/mutate_in_specs.hxx +2 -2
  225. package/deps/couchbase-cxx-client/couchbase/query_options.hxx +4 -3
  226. package/deps/couchbase-cxx-client/couchbase/search_options.hxx +1 -1
  227. package/dist/analyticsindexmanager.d.ts +98 -14
  228. package/dist/analyticsindexmanager.js +452 -411
  229. package/dist/binding.d.ts +53 -4
  230. package/dist/bindingutilities.d.ts +26 -1
  231. package/dist/bindingutilities.js +108 -1
  232. package/dist/couchbase.d.ts +3 -1
  233. package/dist/couchbase.js +2 -0
  234. package/dist/rangeScan.d.ts +1 -1
  235. package/dist/rangeScan.js +1 -1
  236. package/dist/transactions.d.ts +34 -3
  237. package/dist/transactions.js +25 -18
  238. package/dist/transcoders.d.ts +68 -0
  239. package/dist/transcoders.js +194 -1
  240. package/dist/usermanager.d.ts +14 -14
  241. package/dist/usermanager.js +178 -228
  242. package/dist/utilities.js +4 -6
  243. package/dist/utilities_internal.js +1 -2
  244. package/package.json +9 -8
  245. package/src/binding.cpp +13 -13
  246. package/src/connection.cpp +22 -0
  247. package/src/connection.hpp +12 -0
  248. package/src/connection_autogen.cpp +100 -0
  249. package/src/jstocbpp_autogen.hpp +315 -8
  250. package/src/jstocbpp_transactions.hpp +1 -2
  251. package/tools/gen-bindings-js.js +38 -3
  252. package/tools/gen-bindings-json.py +575 -328
@@ -25,11 +25,13 @@
25
25
  #include "core/io/mcbp_message.hxx"
26
26
  #include "core/logger/logger.hxx"
27
27
  #include "core/mcbp/codec.hxx"
28
+ #include "core/metrics/meter_wrapper.hxx"
28
29
  #include "core/protocol/client_opcode.hxx"
29
30
  #include "core/protocol/client_request.hxx"
30
31
  #include "core/protocol/hello_feature.hxx"
31
32
  #include "core/response_handler.hxx"
32
33
  #include "core/service_type.hxx"
34
+ #include "core/tracing/tracer_wrapper.hxx"
33
35
  #include "core/utils/movable_function.hxx"
34
36
  #include "dispatcher.hxx"
35
37
  #include "impl/bootstrap_state_listener.hxx"
@@ -42,10 +44,8 @@
42
44
  #include "retry_orchestrator.hxx"
43
45
 
44
46
  #include <couchbase/error_codes.hxx>
45
- #include <couchbase/metrics/meter.hxx>
46
47
  #include <couchbase/retry_reason.hxx>
47
48
  #include <couchbase/retry_strategy.hxx>
48
- #include <couchbase/tracing/request_tracer.hxx>
49
49
 
50
50
  #include <asio/bind_executor.hpp>
51
51
  #include <asio/error.hpp>
@@ -82,8 +82,8 @@ public:
82
82
  bucket_impl(std::string client_id,
83
83
  std::string name,
84
84
  couchbase::core::origin origin,
85
- std::shared_ptr<couchbase::tracing::request_tracer> tracer,
86
- std::shared_ptr<couchbase::metrics::meter> meter,
85
+ std::shared_ptr<tracing::tracer_wrapper> tracer,
86
+ std::shared_ptr<metrics::meter_wrapper> meter,
87
87
  std::vector<protocol::hello_feature> known_features,
88
88
  std::shared_ptr<impl::bootstrap_state_listener> state_listener,
89
89
  asio::io_context& ctx,
@@ -114,15 +114,11 @@ public:
114
114
  std::optional<key_value_error_map_info> error_info)
115
115
  {
116
116
  // TODO(SA): copy from mcbp_command, subject to refactor later
117
- static const std::string meter_name = "db.couchbase.operations";
118
- static const std::map<std::string, std::string> tags = {
119
- { "db.couchbase.service", "kv" },
120
- { "db.operation", fmt::format("{}", req->command_) },
117
+ metrics::metric_attributes attrs{
118
+ service_type::key_value, fmt::format("{}", req->command_), ec, name_, req->scope_name_,
119
+ req->collection_name_,
121
120
  };
122
- meter_->get_value_recorder(meter_name, tags)
123
- ->record_value(std::chrono::duration_cast<std::chrono::microseconds>(
124
- std::chrono::steady_clock::now() - req->dispatched_time_)
125
- .count());
121
+ meter_->record_value(std::move(attrs), req->dispatched_time_);
126
122
 
127
123
  if (ec == asio::error::operation_aborted) {
128
124
  // TODO(SA): fix tracing
@@ -894,12 +890,12 @@ public:
894
890
  return configured_;
895
891
  }
896
892
 
897
- [[nodiscard]] auto tracer() const -> std::shared_ptr<couchbase::tracing::request_tracer>
893
+ [[nodiscard]] auto tracer() const -> std::shared_ptr<tracing::tracer_wrapper>
898
894
  {
899
895
  return tracer_;
900
896
  }
901
897
 
902
- [[nodiscard]] auto meter() const -> std::shared_ptr<couchbase::metrics::meter>
898
+ [[nodiscard]] auto meter() const -> std::shared_ptr<metrics::meter_wrapper>
903
899
  {
904
900
  return meter_;
905
901
  }
@@ -952,8 +948,8 @@ private:
952
948
  const std::string name_;
953
949
  const std::string log_prefix_;
954
950
  const origin origin_;
955
- const std::shared_ptr<couchbase::tracing::request_tracer> tracer_;
956
- const std::shared_ptr<couchbase::metrics::meter> meter_;
951
+ const std::shared_ptr<tracing::tracer_wrapper> tracer_;
952
+ const std::shared_ptr<metrics::meter_wrapper> meter_;
957
953
  const std::vector<protocol::hello_feature> known_features_;
958
954
  const std::shared_ptr<impl::bootstrap_state_listener> state_listener_;
959
955
  mcbp::codec codec_;
@@ -985,8 +981,8 @@ private:
985
981
  bucket::bucket(std::string client_id,
986
982
  asio::io_context& ctx,
987
983
  asio::ssl::context& tls,
988
- std::shared_ptr<couchbase::tracing::request_tracer> tracer,
989
- std::shared_ptr<couchbase::metrics::meter> meter,
984
+ std::shared_ptr<tracing::tracer_wrapper> tracer,
985
+ std::shared_ptr<metrics::meter_wrapper> meter,
990
986
  std::string name,
991
987
  couchbase::core::origin origin,
992
988
  std::vector<protocol::hello_feature> known_features,
@@ -1054,13 +1050,13 @@ bucket::log_prefix() const -> const std::string&
1054
1050
  }
1055
1051
 
1056
1052
  auto
1057
- bucket::tracer() const -> std::shared_ptr<couchbase::tracing::request_tracer>
1053
+ bucket::tracer() const -> std::shared_ptr<tracing::tracer_wrapper>
1058
1054
  {
1059
1055
  return impl_->tracer();
1060
1056
  }
1061
1057
 
1062
1058
  auto
1063
- bucket::meter() const -> std::shared_ptr<couchbase::metrics::meter>
1059
+ bucket::meter() const -> std::shared_ptr<metrics::meter_wrapper>
1064
1060
  {
1065
1061
  return impl_->meter();
1066
1062
  }
@@ -33,14 +33,6 @@
33
33
 
34
34
  namespace couchbase
35
35
  {
36
- namespace metrics
37
- {
38
- class meter;
39
- } // namespace metrics
40
- namespace tracing
41
- {
42
- class request_tracer;
43
- } // namespace tracing
44
36
  namespace core
45
37
  {
46
38
  namespace mcbp
@@ -52,6 +44,14 @@ namespace diag
52
44
  class ping_collector;
53
45
  struct diagnostics_result;
54
46
  } // namespace diag
47
+ namespace tracing
48
+ {
49
+ class tracer_wrapper;
50
+ } // namespace tracing
51
+ namespace metrics
52
+ {
53
+ class meter_wrapper;
54
+ } // namespace metrics
55
55
  namespace impl
56
56
  {
57
57
  class bootstrap_state_listener;
@@ -68,8 +68,8 @@ public:
68
68
  bucket(std::string client_id,
69
69
  asio::io_context& ctx,
70
70
  asio::ssl::context& tls,
71
- std::shared_ptr<couchbase::tracing::request_tracer> tracer,
72
- std::shared_ptr<couchbase::metrics::meter> meter,
71
+ std::shared_ptr<tracing::tracer_wrapper> tracer,
72
+ std::shared_ptr<metrics::meter_wrapper> meter,
73
73
  std::string name,
74
74
  couchbase::core::origin origin,
75
75
  std::vector<protocol::hello_feature> known_features,
@@ -200,8 +200,8 @@ public:
200
200
 
201
201
  [[nodiscard]] auto name() const -> const std::string&;
202
202
  [[nodiscard]] auto log_prefix() const -> const std::string&;
203
- [[nodiscard]] auto tracer() const -> std::shared_ptr<couchbase::tracing::request_tracer>;
204
- [[nodiscard]] auto meter() const -> std::shared_ptr<couchbase::metrics::meter>;
203
+ [[nodiscard]] auto tracer() const -> std::shared_ptr<tracing::tracer_wrapper>;
204
+ [[nodiscard]] auto meter() const -> std::shared_ptr<metrics::meter_wrapper>;
205
205
  [[nodiscard]] auto default_retry_strategy() const -> std::shared_ptr<couchbase::retry_strategy>;
206
206
  [[nodiscard]] auto is_closed() const -> bool;
207
207
  [[nodiscard]] auto is_configured() const -> bool;
@@ -39,6 +39,7 @@
39
39
  #include "core/mcbp/queue_request.hxx"
40
40
  #include "core/meta/version.hxx"
41
41
  #include "core/metrics/logging_meter.hxx"
42
+ #include "core/metrics/meter_wrapper.hxx"
42
43
  #include "core/metrics/noop_meter.hxx"
43
44
  #include "core/operations/document_analytics.hxx"
44
45
  #include "core/operations/document_append.hxx"
@@ -145,6 +146,7 @@
145
146
  #include "core/topology/capabilities.hxx"
146
147
  #include "core/tracing/noop_tracer.hxx"
147
148
  #include "core/tracing/threshold_logging_tracer.hxx"
149
+ #include "core/tracing/tracer_wrapper.hxx"
148
150
  #include "core/utils/join_strings.hxx"
149
151
  #include "core/utils/movable_function.hxx"
150
152
  #include "crud_component.hxx"
@@ -352,30 +354,7 @@ public:
352
354
  id_,
353
355
  couchbase::core::meta::sdk_semver(),
354
356
  origin_.to_json());
355
- // ignore the enable_tracing flag if a tracer was passed in
356
- if (nullptr != origin_.options().tracer) {
357
- tracer_ = origin_.options().tracer;
358
- } else {
359
- if (origin_.options().enable_tracing) {
360
- tracer_ = std::make_shared<tracing::threshold_logging_tracer>(
361
- ctx_, origin_.options().tracing_options);
362
- } else {
363
- tracer_ = std::make_shared<tracing::noop_tracer>();
364
- }
365
- }
366
- tracer_->start();
367
- // ignore the metrics options if a meter was passed in.
368
- if (nullptr != origin_.options().meter) {
369
- meter_ = origin_.options().meter;
370
- } else {
371
- if (origin_.options().enable_metrics) {
372
- meter_ = std::make_shared<metrics::logging_meter>(ctx_, origin_.options().metrics_options);
373
- } else {
374
- meter_ = std::make_shared<metrics::noop_meter>();
375
- }
376
- }
377
- meter_->start();
378
- session_manager_->set_tracer(tracer_);
357
+ setup_observability();
379
358
  if (origin_.options().enable_dns_srv) {
380
359
  std::string hostname;
381
360
  std::string port;
@@ -433,30 +412,7 @@ public:
433
412
  id_,
434
413
  couchbase::core::meta::sdk_semver(),
435
414
  origin_.to_json());
436
- // ignore the enable_tracing flag if a tracer was passed in
437
- if (nullptr != origin_.options().tracer) {
438
- tracer_ = origin_.options().tracer;
439
- } else {
440
- if (origin_.options().enable_tracing) {
441
- tracer_ = std::make_shared<tracing::threshold_logging_tracer>(
442
- ctx_, origin_.options().tracing_options);
443
- } else {
444
- tracer_ = std::make_shared<tracing::noop_tracer>();
445
- }
446
- }
447
- tracer_->start();
448
- // ignore the metrics options if a meter was passed in.
449
- if (nullptr != origin_.options().meter) {
450
- meter_ = origin_.options().meter;
451
- } else {
452
- if (origin_.options().enable_metrics) {
453
- meter_ = std::make_shared<metrics::logging_meter>(ctx_, origin_.options().metrics_options);
454
- } else {
455
- meter_ = std::make_shared<metrics::noop_meter>();
456
- }
457
- }
458
- meter_->start();
459
- session_manager_->set_tracer(tracer_);
415
+ setup_observability();
460
416
  session_manager_->set_dispatch_timeout(origin_.options().dispatch_timeout);
461
417
  // at this point we will infinitely try to connect
462
418
  if (origin_.options().enable_dns_srv) {
@@ -493,6 +449,10 @@ public:
493
449
  b = std::make_shared<bucket>(
494
450
  id_, ctx_, tls_, tracer_, meter_, bucket_name, origin, known_features, dns_srv_tracker_);
495
451
  buckets_.try_emplace(bucket_name, b);
452
+
453
+ // Register the tracer & the meter for config updates to track Cluster name & UUID
454
+ b->on_configuration_update(tracer_);
455
+ b->on_configuration_update(meter_);
496
456
  }
497
457
  }
498
458
  if (b == nullptr) {
@@ -1092,7 +1052,7 @@ public:
1092
1052
  if (cluster->session_) {
1093
1053
  cluster->session_->ping(collector->build_reporter(), timeout);
1094
1054
  }
1095
- cluster->for_each_bucket([&collector, &timeout](auto bucket) {
1055
+ cluster->for_each_bucket([&collector, &timeout](const auto& bucket) {
1096
1056
  bucket->ping(collector, timeout);
1097
1057
  });
1098
1058
  }
@@ -1145,7 +1105,7 @@ public:
1145
1105
  }
1146
1106
  self->retry_backoff_.cancel();
1147
1107
  #endif
1148
- self->for_each_bucket([](auto bucket) {
1108
+ self->for_each_bucket([](const auto& bucket) {
1149
1109
  bucket->close();
1150
1110
  });
1151
1111
  self->session_manager_->close();
@@ -1221,6 +1181,38 @@ public:
1221
1181
  }
1222
1182
 
1223
1183
  private:
1184
+ void setup_observability()
1185
+ {
1186
+ // ignore the enable_tracing flag if a tracer was passed in
1187
+ if (nullptr != origin_.options().tracer) {
1188
+ tracer_ = tracing::tracer_wrapper::create(origin_.options().tracer);
1189
+ } else {
1190
+ if (origin_.options().enable_tracing) {
1191
+ tracer_ =
1192
+ tracing::tracer_wrapper::create(std::make_shared<tracing::threshold_logging_tracer>(
1193
+ ctx_, origin_.options().tracing_options));
1194
+ } else {
1195
+ tracer_ = tracing::tracer_wrapper::create(std::make_shared<tracing::noop_tracer>());
1196
+ }
1197
+ }
1198
+ tracer_->start();
1199
+ // ignore the metrics options if a meter was passed in.
1200
+ if (nullptr != origin_.options().meter) {
1201
+ meter_ = metrics::meter_wrapper::create(origin_.options().meter);
1202
+ } else {
1203
+ if (origin_.options().enable_metrics) {
1204
+ meter_ = metrics::meter_wrapper::create(
1205
+ std::make_shared<metrics::logging_meter>(ctx_, origin_.options().metrics_options));
1206
+ } else {
1207
+ meter_ = metrics::meter_wrapper::create(std::make_shared<metrics::noop_meter>());
1208
+ }
1209
+ }
1210
+ meter_->start();
1211
+
1212
+ session_manager_->set_tracer(tracer_);
1213
+ session_manager_->set_meter(meter_);
1214
+ }
1215
+
1224
1216
  std::string id_{ uuid::to_string(uuid::random()) };
1225
1217
  asio::io_context& ctx_;
1226
1218
  asio::executor_work_guard<asio::io_context::executor_type> work_;
@@ -1231,8 +1223,8 @@ private:
1231
1223
  std::mutex buckets_mutex_{};
1232
1224
  std::map<std::string, std::shared_ptr<bucket>> buckets_{};
1233
1225
  couchbase::core::origin origin_{};
1234
- std::shared_ptr<couchbase::tracing::request_tracer> tracer_{ nullptr };
1235
- std::shared_ptr<couchbase::metrics::meter> meter_{ nullptr };
1226
+ std::shared_ptr<tracing::tracer_wrapper> tracer_{ nullptr };
1227
+ std::shared_ptr<metrics::meter_wrapper> meter_{ nullptr };
1236
1228
  std::atomic_bool stopped_{ false };
1237
1229
  #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
1238
1230
  std::shared_ptr<couchbase::core::io::cluster_config_tracker> config_tracker_{};
@@ -42,7 +42,11 @@ public:
42
42
 
43
43
  auto free_form_http_request(const http_request& request,
44
44
  free_form_http_request_callback&& callback)
45
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
46
+ -> tl::expected<std::shared_ptr<pending_operation>, error_union>
47
+ #else
45
48
  -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>
49
+ #endif
46
50
  {
47
51
  return http_.do_http_request(request, std::move(callback));
48
52
  }
@@ -61,7 +65,11 @@ cluster_agent::cluster_agent(asio::io_context& io, cluster_agent_config config)
61
65
  auto
62
66
  cluster_agent::free_form_http_request(const couchbase::core::http_request& request,
63
67
  couchbase::core::free_form_http_request_callback&& callback)
68
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
69
+ -> tl::expected<std::shared_ptr<pending_operation>, error_union>
70
+ #else
64
71
  -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>
72
+ #endif
65
73
  {
66
74
  return impl_->free_form_http_request(request, std::move(callback));
67
75
  }
@@ -40,7 +40,11 @@ public:
40
40
 
41
41
  auto free_form_http_request(const http_request& request,
42
42
  free_form_http_request_callback&& callback)
43
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
44
+ -> tl::expected<std::shared_ptr<pending_operation>, error_union>;
45
+ #else
43
46
  -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>;
47
+ #endif
44
48
 
45
49
  private:
46
50
  std::shared_ptr<cluster_agent_impl> impl_;
@@ -430,7 +430,7 @@ collection_id_cache_entry_impl::refresh_collection_id(
430
430
  self->manager_.lock()->remove(req->scope_name_, req->collection_name_);
431
431
  auto queue = self->swap_queue();
432
432
  queue->close();
433
- return queue->drain([ec](auto r) {
433
+ return queue->drain([ec](const auto& r) {
434
434
  r->try_callback({}, ec);
435
435
  });
436
436
  }
@@ -443,7 +443,7 @@ collection_id_cache_entry_impl::refresh_collection_id(
443
443
  res.collection_id);
444
444
  auto queue = self->swap_queue();
445
445
  queue->close();
446
- return queue->drain([self](auto r) {
446
+ return queue->drain([self](const auto& r) {
447
447
  if (auto ec = self->assign_collection_id(r); ec) {
448
448
  CB_LOG_DEBUG("failed to set collection ID \"{}.{}\" on request (OP={}): {}",
449
449
  r->scope_name_,
@@ -49,7 +49,7 @@ public:
49
49
 
50
50
  auto free_form_http_request(const http_request& request,
51
51
  free_form_http_request_callback&& callback)
52
- -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>
52
+ -> tl::expected<std::shared_ptr<pending_operation>, error_union>
53
53
  {
54
54
  return http_.do_http_request(request, std::move(callback));
55
55
  }
@@ -102,7 +102,7 @@ agent::agent(asio::io_context& io, couchbase::core::columnar::agent_config confi
102
102
  auto
103
103
  agent::free_form_http_request(const http_request& request,
104
104
  free_form_http_request_callback&& callback)
105
- -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>
105
+ -> tl::expected<std::shared_ptr<pending_operation>, error_union>
106
106
  {
107
107
  return impl_->free_form_http_request(request, std::move(callback));
108
108
  }
@@ -46,7 +46,7 @@ public:
46
46
 
47
47
  auto free_form_http_request(const http_request& request,
48
48
  free_form_http_request_callback&& callback)
49
- -> tl::expected<std::shared_ptr<pending_operation>, std::error_code>;
49
+ -> tl::expected<std::shared_ptr<pending_operation>, error_union>;
50
50
 
51
51
  auto free_form_http_request_buffered(const http_request& request,
52
52
  buffered_free_form_http_request_callback&& callback)
@@ -189,7 +189,7 @@ public:
189
189
  "SELECT d.* FROM `System`.`Metadata`.`Database` AS d",
190
190
  options.timeout,
191
191
  };
192
- return execute(std::move(req), [cb = std::move(callback)](auto raw_res, auto err) {
192
+ return execute(std::move(req), [cb = std::move(callback)](const auto& raw_res, auto err) {
193
193
  if (err) {
194
194
  cb({}, std::move(err));
195
195
  return;
@@ -216,7 +216,7 @@ public:
216
216
  if (options.ignore_if_exists) {
217
217
  req.statement += " IF NOT EXISTS";
218
218
  }
219
- return execute(std::move(req), [cb = std::move(callback)](auto /*raw_res*/, auto err) {
219
+ return execute(std::move(req), [cb = std::move(callback)](const auto& /*raw_res*/, auto err) {
220
220
  cb(std::move(err));
221
221
  });
222
222
  }
@@ -231,7 +231,7 @@ public:
231
231
  if (options.ignore_if_not_exists) {
232
232
  req.statement += " IF EXISTS";
233
233
  }
234
- return execute(std::move(req), [cb = std::move(callback)](auto /*raw_res*/, auto err) {
234
+ return execute(std::move(req), [cb = std::move(callback)](const auto& /*raw_res*/, auto err) {
235
235
  cb(std::move(err));
236
236
  });
237
237
  }
@@ -79,17 +79,28 @@ public:
79
79
 
80
80
  auto dispatch() -> error
81
81
  {
82
- auto op =
83
- http_.do_http_request(http_req_, [self = shared_from_this()](auto resp, auto ec) mutable {
82
+ auto op = http_.do_http_request(
83
+ http_req_, [self = shared_from_this()](auto resp, error_union err) mutable {
84
84
  std::shared_ptr<pending_operation> op;
85
85
  {
86
86
  const std::scoped_lock lock{ self->pending_op_mutex_ };
87
87
  std::swap(op, self->pending_op_);
88
88
  }
89
- if (ec) {
90
- self->invoke_callback(
91
- {},
92
- { maybe_convert_error_code(ec), "Failed to execute the HTTP request for the query" });
89
+ if (!std::holds_alternative<std::monostate>(err)) {
90
+ if (std::holds_alternative<impl::bootstrap_error>(err)) {
91
+ auto bootstrap_error = std::get<impl::bootstrap_error>(err);
92
+ auto message = fmt::format(
93
+ "Failed to execute the HTTP request for the query due to a bootstrap error. "
94
+ "See logs for further details. bootstrap_error.message={}",
95
+ bootstrap_error.error_message);
96
+ self->invoke_callback({}, { maybe_convert_error_code(bootstrap_error.ec), message });
97
+ } else {
98
+ auto ec = maybe_convert_error_code(std::get<std::error_code>(err));
99
+ if (ec == errc::timeout) {
100
+ return self->trigger_timeout();
101
+ }
102
+ self->invoke_callback({}, { ec, "Failed to execute the HTTP request for the query" });
103
+ }
93
104
  return;
94
105
  }
95
106
  // op can be null if the pending_query_operation was cancelled.
@@ -101,7 +112,7 @@ public:
101
112
  }
102
113
  auto streamer = std::make_shared<row_streamer>(self->io_, resp.body(), "/results/^");
103
114
  return streamer->start(
104
- [self, streamer, resp = std::move(resp)](auto metadata_header, auto ec) mutable {
115
+ [self, streamer, resp = std::move(resp)](const auto& metadata_header, auto ec) mutable {
105
116
  if (ec) {
106
117
  self->invoke_callback({}, { maybe_convert_error_code(ec) });
107
118
  return;
@@ -127,7 +138,27 @@ public:
127
138
  pending_op_ = op.value();
128
139
  return {};
129
140
  }
130
- return error{ op.error() };
141
+ retry_timer_.cancel();
142
+ deadline_.cancel();
143
+ error return_error{};
144
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
145
+ if (std::holds_alternative<impl::bootstrap_error>(op.error())) {
146
+ auto bootstrap_error = std::get<impl::bootstrap_error>(op.error());
147
+ auto message =
148
+ fmt::format("Failed to create the HTTP pending operation due to a bootstrap error. "
149
+ "See logs for further details. bootstrap_error.message={}",
150
+ bootstrap_error.error_message);
151
+ return_error.ec = bootstrap_error.ec;
152
+ return_error.message = message;
153
+ } else {
154
+ return_error.ec = std::get<std::error_code>(op.error());
155
+ return_error.message = "Failed to create the HTTP pending operation.";
156
+ }
157
+ #else
158
+ return_error.ec = op.error();
159
+ #endif
160
+ invoke_callback({}, return_error);
161
+ return return_error;
131
162
  }
132
163
 
133
164
  auto start(query_callback&& callback) -> error
@@ -252,11 +283,13 @@ private:
252
283
  break;
253
284
  }
254
285
  }
286
+
287
+ const std::chrono::milliseconds server_timeout = timeout_ + std::chrono::seconds(5);
288
+ payload["timeout"] = fmt::format("{}ms", server_timeout.count());
289
+
255
290
  for (const auto& [key, val] : options.raw) {
256
291
  payload[key] = utils::json::parse(val);
257
292
  }
258
- const std::chrono::milliseconds server_timeout = timeout_ + std::chrono::seconds(5);
259
- payload["timeout"] = fmt::format("{}ms", server_timeout.count());
260
293
 
261
294
  return payload;
262
295
  }
@@ -296,7 +329,7 @@ private:
296
329
  // retryable errors should be listed.
297
330
  if (err.ec == errc::timeout && retry_info_.last_error) {
298
331
  if (const auto* e = retry_info_.last_error.ctx.find("errors"); e != nullptr) {
299
- err.ctx["last_errors"] = e;
332
+ err.ctx["last_errors"] = e->get_array();
300
333
  }
301
334
  }
302
335
  }
@@ -334,53 +367,71 @@ private:
334
367
  std::int32_t first_error_code{ 0 };
335
368
  std::string first_error_msg{};
336
369
 
370
+ std::int32_t first_non_retr_error_code{ 0 };
371
+ std::string first_non_retr_error_msg{};
372
+
337
373
  for (auto error_json : errors_json->get_array()) {
338
- auto* retr = error_json.find("retriable");
339
- if (retr == nullptr) {
340
- // An error is assumed to not be retriable if the field is missing
341
- res.retriable = false;
342
- } else if (!retr->is_boolean()) {
343
- return { { errc::generic,
344
- "Could not parse error from server response - 'retriable' was not boolean" } };
345
- } else {
346
- // Operation is retriable iff all errors are retriable
347
- res.retriable = res.retriable && retr->get_boolean();
374
+ bool retr{ false }; // An error is assumed to not be retriable if the field is missing
375
+ {
376
+ auto* r = error_json.find("retriable");
377
+ if (r != nullptr) {
378
+ if (!r->is_boolean()) {
379
+ return {
380
+ { errc::generic,
381
+ "Could not parse error from server response - 'retriable' was not boolean" }
382
+ };
383
+ }
384
+ retr = r->get_boolean();
385
+ }
348
386
  }
349
387
 
350
- auto* msg = error_json.find("msg");
351
- if (msg == nullptr) {
352
- return { { errc::generic,
353
- "Could not parse error from server response - could not find 'msg' field" } };
354
- }
355
- if (!msg->is_string()) {
356
- return { { errc::generic,
357
- "Could not parse error from server response - 'msg' field was not string" } };
358
- }
388
+ // Operation is retriable iff all errors are retriable
389
+ res.retriable = res.retriable && retr;
359
390
 
360
- auto* c = error_json.find("code");
361
- if (c == nullptr) {
362
- return { { errc::generic,
363
- "Could not parse error from server response - could not find 'code' field" } };
364
- }
365
- if (!(c->is_unsigned() || c->is_signed())) {
366
- return {
367
- { errc::generic,
368
- "Could not parse error from server response - 'code' field was not an integer" }
369
- };
391
+ std::string msg{};
392
+ {
393
+ auto* m = error_json.find("msg");
394
+ if (m == nullptr) {
395
+ return { { errc::generic,
396
+ "Could not parse error from server response - could not find 'msg' field" } };
397
+ }
398
+ if (!m->is_string()) {
399
+ return { { errc::generic,
400
+ "Could not parse error from server response - 'msg' field was not string" } };
401
+ }
402
+ msg = m->get_string();
370
403
  }
371
404
 
372
- std::int32_t code = c->is_signed() ? gsl::narrow_cast<std::int32_t>(c->get_signed())
373
- : gsl::narrow_cast<std::int32_t>(c->get_unsigned());
405
+ std::int32_t code{};
406
+ {
407
+ auto* c = error_json.find("code");
408
+ if (c == nullptr) {
409
+ return { { errc::generic,
410
+ "Could not parse error from server response - could not find 'code' field" } };
411
+ }
412
+ if (!(c->is_unsigned() || c->is_signed())) {
413
+ return {
414
+ { errc::generic,
415
+ "Could not parse error from server response - 'code' field was not an integer" }
416
+ };
417
+ }
418
+ code = c->is_signed() ? gsl::narrow_cast<std::int32_t>(c->get_signed())
419
+ : gsl::narrow_cast<std::int32_t>(c->get_unsigned());
420
+ }
374
421
 
375
422
  tao::json::value error = {
376
423
  { "code", code },
377
- { "msg", msg->get_string() },
424
+ { "msg", msg },
378
425
  };
379
426
  res.err.ctx["errors"].get_array().emplace_back(std::move(error));
380
427
 
381
428
  if (first_error_code == 0) {
382
429
  first_error_code = code;
383
- first_error_msg = msg->get_string();
430
+ first_error_msg = msg;
431
+ }
432
+ if (!retr && first_non_retr_error_code == 0) {
433
+ first_non_retr_error_code = code;
434
+ first_non_retr_error_msg = msg;
384
435
  }
385
436
 
386
437
  switch (code) {
@@ -396,7 +447,14 @@ private:
396
447
  }
397
448
 
398
449
  if (res.err.ec == errc::query_error) {
399
- res.err.properties = query_error_properties{ first_error_code, first_error_msg };
450
+ // If any of the errors is not retriable, report the first non-retriable code/message in the
451
+ // error properties
452
+ if (first_non_retr_error_code != 0) {
453
+ res.err.properties =
454
+ query_error_properties{ first_non_retr_error_code, first_non_retr_error_msg };
455
+ } else {
456
+ res.err.properties = query_error_properties{ first_error_code, first_error_msg };
457
+ }
400
458
  }
401
459
 
402
460
  return res;
@@ -17,6 +17,7 @@
17
17
 
18
18
  #pragma once
19
19
 
20
+ #include "core/impl/bootstrap_error.hxx"
20
21
  #include "core/pending_operation.hxx"
21
22
  #include "error.hxx"
22
23
  #include "query_options.hxx"