couchbase 4.4.2 → 4.4.4

Sign up to get free protection for your applications and to get access to all the features.
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"