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
@@ -19,13 +19,15 @@
19
19
 
20
20
  #include <couchbase/build_config.hxx>
21
21
 
22
+ #include "core/impl/bootstrap_error.hxx"
23
+ #include "core/metrics/meter_wrapper.hxx"
22
24
  #include "core/service_type_fmt.hxx"
23
25
  #include "core/tracing/constants.hxx"
26
+ #include "core/tracing/tracer_wrapper.hxx"
24
27
  #include "core/utils/movable_function.hxx"
25
28
  #include "http_session.hxx"
26
29
  #include "http_traits.hxx"
27
30
 
28
- #include <couchbase/metrics/meter.hxx>
29
31
  #include <couchbase/tracing/request_tracer.hxx>
30
32
 
31
33
  #include <utility>
@@ -33,7 +35,11 @@
33
35
  namespace couchbase::core::operations
34
36
  {
35
37
 
38
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
39
+ using http_command_handler = utils::movable_function<void(error_union, io::http_response&&)>;
40
+ #else
36
41
  using http_command_handler = utils::movable_function<void(std::error_code, io::http_response&&)>;
42
+ #endif
37
43
 
38
44
  template<typename Request>
39
45
  struct http_command : public std::enable_shared_from_this<http_command<Request>> {
@@ -43,9 +49,9 @@ struct http_command : public std::enable_shared_from_this<http_command<Request>>
43
49
  asio::steady_timer deadline;
44
50
  Request request;
45
51
  encoded_request_type encoded;
46
- std::shared_ptr<couchbase::tracing::request_tracer> tracer_;
52
+ std::shared_ptr<tracing::tracer_wrapper> tracer_;
47
53
  std::shared_ptr<couchbase::tracing::request_span> span_{ nullptr };
48
- std::shared_ptr<couchbase::metrics::meter> meter_{};
54
+ std::shared_ptr<metrics::meter_wrapper> meter_{};
49
55
  std::shared_ptr<io::http_session> session_{};
50
56
  http_command_handler handler_{};
51
57
  std::chrono::milliseconds timeout_{};
@@ -57,8 +63,8 @@ struct http_command : public std::enable_shared_from_this<http_command<Request>>
57
63
 
58
64
  http_command(asio::io_context& ctx,
59
65
  Request req,
60
- std::shared_ptr<couchbase::tracing::request_tracer> tracer,
61
- std::shared_ptr<couchbase::metrics::meter> meter,
66
+ std::shared_ptr<tracing::tracer_wrapper> tracer,
67
+ std::shared_ptr<metrics::meter_wrapper> meter,
62
68
  std::chrono::milliseconds default_timeout,
63
69
  std::chrono::milliseconds dispatch_timeout)
64
70
  : deadline(ctx)
@@ -77,8 +83,8 @@ struct http_command : public std::enable_shared_from_this<http_command<Request>>
77
83
  #else
78
84
  http_command(asio::io_context& ctx,
79
85
  Request req,
80
- std::shared_ptr<couchbase::tracing::request_tracer> tracer,
81
- std::shared_ptr<couchbase::metrics::meter> meter,
86
+ std::shared_ptr<tracing::tracer_wrapper> tracer,
87
+ std::shared_ptr<metrics::meter_wrapper> meter,
82
88
  std::chrono::milliseconds default_timeout)
83
89
  : deadline(ctx)
84
90
  , request(req)
@@ -108,12 +114,13 @@ struct http_command : public std::enable_shared_from_this<http_command<Request>>
108
114
 
109
115
  void start(http_command_handler&& handler)
110
116
  {
111
- span_ = tracer_->start_span(tracing::span_name_for_http_service(request.type), parent_span);
112
- if (span_->uses_tags())
117
+ span_ = tracer_->create_span(tracing::span_name_for_http_service(request.type), parent_span);
118
+ if (span_->uses_tags()) {
113
119
  span_->add_tag(tracing::attributes::service,
114
120
  tracing::service_name_for_http_service(request.type));
115
- if (span_->uses_tags())
116
121
  span_->add_tag(tracing::attributes::operation_id, client_context_id_);
122
+ }
123
+
117
124
  handler_ = std::move(handler);
118
125
  #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
119
126
  dispatch_deadline_.expires_after(dispatch_timeout_);
@@ -158,17 +165,24 @@ struct http_command : public std::enable_shared_from_this<http_command<Request>>
158
165
  }
159
166
  }
160
167
 
168
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
169
+ void invoke_handler(error_union error, io::http_response&& msg)
170
+ #else
161
171
  void invoke_handler(std::error_code ec, io::http_response&& msg)
172
+ #endif
162
173
  {
163
174
  if (span_ != nullptr) {
164
175
  span_->end();
165
176
  span_ = nullptr;
166
177
  }
167
178
  if (auto handler = std::move(handler_); handler) {
168
- handler(ec, std::move(msg));
169
- }
170
179
  #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
180
+ handler(error, std::move(msg));
181
+ }
171
182
  dispatch_deadline_.cancel();
183
+ #else
184
+ handler(ec, std::move(msg));
185
+ }
172
186
  #endif
173
187
  deadline.cancel();
174
188
  }
@@ -231,15 +245,12 @@ private:
231
245
  return self->invoke_handler(errc::common::ambiguous_timeout, std::move(msg));
232
246
  }
233
247
  if (self->meter_) {
234
- static std::string meter_name = "db.couchbase.operations";
235
- static std::map<std::string, std::string> tags = {
236
- { "db.couchbase.service", fmt::format("{}", self->request.type) },
237
- { "db.operation", self->encoded.path },
248
+ metrics::metric_attributes attrs{
249
+ self->request.type,
250
+ self->request.observability_identifier,
251
+ ec,
238
252
  };
239
- self->meter_->get_value_recorder(meter_name, tags)
240
- ->record_value(std::chrono::duration_cast<std::chrono::microseconds>(
241
- std::chrono::steady_clock::now() - start)
242
- .count());
253
+ self->meter_->record_value(std::move(attrs), start);
243
254
  }
244
255
  self->deadline.cancel();
245
256
  self->finish_dispatch(self->session_->remote_address(), self->session_->local_address());
@@ -395,7 +395,12 @@ http_session::flush()
395
395
  void
396
396
  http_session::write_and_stream(
397
397
  io::http_request& request,
398
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
399
+ utils::movable_function<void(couchbase::core::error_union, io::http_streaming_response)>
400
+ resp_handler,
401
+ #else
398
402
  utils::movable_function<void(std::error_code, io::http_streaming_response)> resp_handler,
403
+ #endif
399
404
  utils::movable_function<void()> stream_end_handler)
400
405
  {
401
406
  if (stopped_) {
@@ -17,7 +17,10 @@
17
17
 
18
18
  #pragma once
19
19
 
20
+ #include <couchbase/build_config.hxx>
21
+
20
22
  #include "core/diagnostics.hxx"
23
+ #include "core/impl/bootstrap_error.hxx"
21
24
  #include "core/origin.hxx"
22
25
  #include "core/platform/base64.h"
23
26
  #include "core/utils/movable_function.hxx"
@@ -140,10 +143,15 @@ public:
140
143
  flush();
141
144
  }
142
145
 
143
- void write_and_stream(
144
- io::http_request& request,
145
- utils::movable_function<void(std::error_code, io::http_streaming_response)> resp_handler,
146
- utils::movable_function<void()> stream_end_handler);
146
+ void write_and_stream(io::http_request& request,
147
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
148
+ utils::movable_function<void(couchbase::core::error_union,
149
+ io::http_streaming_response)> resp_handler,
150
+ #else
151
+ utils::movable_function<void(std::error_code, io::http_streaming_response)>
152
+ resp_handler,
153
+ #endif
154
+ utils::movable_function<void()> stream_end_handler);
147
155
 
148
156
  void set_idle(std::chrono::milliseconds timeout);
149
157
  auto reset_idle() -> bool;
@@ -155,7 +163,12 @@ public:
155
163
 
156
164
  private:
157
165
  struct streaming_response_context {
166
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
167
+ utils::movable_function<void(couchbase::core::error_union, io::http_streaming_response)>
168
+ resp_handler{};
169
+ #else
158
170
  utils::movable_function<void(std::error_code, io::http_streaming_response)> resp_handler{};
171
+ #endif
159
172
  utils::movable_function<void()> stream_end_handler{};
160
173
  std::optional<io::http_streaming_response> resp{};
161
174
  http_streaming_parser parser{};
@@ -24,10 +24,11 @@
24
24
  #include "core/columnar/bootstrap_notification_subscriber.hxx"
25
25
  #endif
26
26
  #include "core/logger/logger.hxx"
27
+ #include "core/metrics/meter_wrapper.hxx"
27
28
  #include "core/operations/http_noop.hxx"
28
29
  #include "core/service_type.hxx"
29
30
  #include "core/tracing/noop_tracer.hxx"
30
- #include "couchbase/metrics/meter.hxx"
31
+ #include "core/tracing/tracer_wrapper.hxx"
31
32
  #include "http_command.hxx"
32
33
  #include "http_context.hxx"
33
34
  #include "http_session.hxx"
@@ -63,12 +64,12 @@ public:
63
64
  {
64
65
  }
65
66
 
66
- void set_tracer(std::shared_ptr<couchbase::tracing::request_tracer> tracer)
67
+ void set_tracer(std::shared_ptr<tracing::tracer_wrapper> tracer)
67
68
  {
68
69
  tracer_ = std::move(tracer);
69
70
  }
70
71
 
71
- void set_meter(std::shared_ptr<couchbase::metrics::meter> meter)
72
+ void set_meter(std::shared_ptr<metrics::meter_wrapper> meter)
72
73
  {
73
74
  meter_ = std::move(meter);
74
75
  }
@@ -91,6 +92,7 @@ public:
91
92
  if (allow_fast_fail_) {
92
93
  std::scoped_lock bootstrap_error_lock(last_bootstrap_error_mutex_);
93
94
  last_bootstrap_error_ = error;
95
+ drain_deferred_queue(last_bootstrap_error_.value());
94
96
  }
95
97
  }
96
98
 
@@ -222,14 +224,19 @@ public:
222
224
  ctx_, request, tracer_, meter_, options_.default_timeout_for(request.type));
223
225
  #endif
224
226
 
225
- cmd->start(
226
- [start = std::chrono::steady_clock::now(),
227
- self = shared_from_this(),
228
- type,
229
- cmd,
230
- handler = collector->build_reporter()](std::error_code ec, io::http_response&& msg) {
231
- diag::ping_state state = diag::ping_state::ok;
232
- std::optional<std::string> error{};
227
+ cmd->start([start = std::chrono::steady_clock::now(),
228
+ self = shared_from_this(),
229
+ type,
230
+ cmd,
231
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
232
+ handler = collector->build_reporter()](error_union err,
233
+ io::http_response&& msg) {
234
+ diag::ping_state state = diag::ping_state::ok;
235
+ std::optional<std::string> error{};
236
+ if (!std::holds_alternative<std::monostate>(err)) {
237
+ auto ec = std::holds_alternative<impl::bootstrap_error>(err)
238
+ ? std::get<impl::bootstrap_error>(err).ec
239
+ : std::get<std::error_code>(err);
233
240
  if (ec) {
234
241
  if (ec == errc::common::unambiguous_timeout ||
235
242
  ec == errc::common::ambiguous_timeout) {
@@ -240,25 +247,42 @@ public:
240
247
  error.emplace(fmt::format(
241
248
  "code={}, message={}, http_code={}", ec.value(), ec.message(), msg.status_code));
242
249
  }
243
- auto remote_address = cmd->session_->remote_address();
244
- // If not connected, the remote address will be empty. Better to
245
- // give the user some context on the "attempted" remote address.
246
- if (remote_address.empty()) {
247
- remote_address =
248
- fmt::format("{}:{}", cmd->session_->hostname(), cmd->session_->port());
250
+ }
251
+ #else
252
+ handler = collector->build_reporter()](std::error_code ec,
253
+ io::http_response&& msg) {
254
+ diag::ping_state state = diag::ping_state::ok;
255
+ std::optional<std::string> error{};
256
+ if (ec) {
257
+ if (ec == errc::common::unambiguous_timeout ||
258
+ ec == errc::common::ambiguous_timeout) {
259
+ state = diag::ping_state::timeout;
260
+ } else {
261
+ state = diag::ping_state::error;
249
262
  }
250
- handler->report(
251
- diag::endpoint_ping_info{ type,
252
- cmd->session_->id(),
253
- std::chrono::duration_cast<std::chrono::microseconds>(
254
- std::chrono::steady_clock::now() - start),
255
- remote_address,
256
- cmd->session_->local_address(),
257
- state,
258
- {},
259
- error });
260
- self->check_in(type, cmd->session_);
261
- });
263
+ error.emplace(fmt::format(
264
+ "code={}, message={}, http_code={}", ec.value(), ec.message(), msg.status_code));
265
+ }
266
+ #endif
267
+ auto remote_address = cmd->session_->remote_address();
268
+ // If not connected, the remote address will be empty. Better to
269
+ // give the user some context on the "attempted" remote address.
270
+ if (remote_address.empty()) {
271
+ remote_address =
272
+ fmt::format("{}:{}", cmd->session_->hostname(), cmd->session_->port());
273
+ }
274
+ handler->report(
275
+ diag::endpoint_ping_info{ type,
276
+ cmd->session_->id(),
277
+ std::chrono::duration_cast<std::chrono::microseconds>(
278
+ std::chrono::steady_clock::now() - start),
279
+ remote_address,
280
+ cmd->session_->local_address(),
281
+ state,
282
+ {},
283
+ error });
284
+ self->check_in(type, cmd->session_);
285
+ });
262
286
  cmd->set_command_session(session);
263
287
  if (!session->is_connected()) {
264
288
  connect_then_send(session, cmd, {}, true);
@@ -450,18 +474,37 @@ public:
450
474
  meter_,
451
475
  options_.default_timeout_for(request.type),
452
476
  dispatch_timeout_);
477
+ cmd->start([self = shared_from_this(), cmd, handler = std::forward<Handler>(handler)](
478
+ error_union err, io::http_response&& msg) mutable {
453
479
  #else
454
480
  auto cmd = std::make_shared<operations::http_command<Request>>(
455
481
  ctx_, request, tracer_, meter_, options_.default_timeout_for(request.type));
456
- #endif
457
482
  cmd->start([self = shared_from_this(), cmd, handler = std::forward<Handler>(handler)](
458
483
  std::error_code ec, io::http_response&& msg) mutable {
484
+ #endif
459
485
  using command_type = typename decltype(cmd)::element_type;
460
486
  using encoded_response_type = typename command_type::encoded_response_type;
461
487
  using error_context_type = typename command_type::error_context_type;
462
488
  encoded_response_type resp{ std::move(msg) };
463
489
  error_context_type ctx{};
490
+ #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
491
+ if (!std::holds_alternative<std::monostate>(err)) {
492
+ if (std::holds_alternative<impl::bootstrap_error>(err)) {
493
+ auto bootstrap_error = std::get<impl::bootstrap_error>(err);
494
+ if (bootstrap_error.ec == errc::common::unambiguous_timeout) {
495
+ CB_LOG_DEBUG("Timeout caused by bootstrap error. code={}, ec_message={}, message={}.",
496
+ bootstrap_error.ec.value(),
497
+ bootstrap_error.ec.message(),
498
+ bootstrap_error.error_message);
499
+ }
500
+ ctx.ec = bootstrap_error.ec;
501
+ } else {
502
+ ctx.ec = std::get<std::error_code>(err);
503
+ }
504
+ }
505
+ #else
464
506
  ctx.ec = ec;
507
+ #endif
465
508
  ctx.client_context_id = cmd->client_context_id_;
466
509
  ctx.method = cmd->encoded.method;
467
510
  ctx.path = cmd->encoded.path;
@@ -584,7 +627,7 @@ public:
584
627
  }
585
628
 
586
629
  #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
587
- void add_to_deferred_queue(utils::movable_function<void(std::error_code)> command)
630
+ void add_to_deferred_queue(utils::movable_function<void(error_union)> command)
588
631
  {
589
632
  const std::scoped_lock lock_for_deferred_commands(deferred_commands_mutex_);
590
633
  deferred_commands_.emplace(std::move(command));
@@ -723,20 +766,25 @@ private:
723
766
  options_.default_timeout_for(request.type),
724
767
  dispatch_timeout_);
725
768
  cmd->start([self = shared_from_this(), cmd, handler = std::forward<Handler>(handler)](
726
- std::error_code ec, io::http_response&& msg) mutable {
769
+ error_union err, io::http_response&& msg) mutable {
727
770
  using command_type = typename decltype(cmd)::element_type;
728
771
  using encoded_response_type = typename command_type::encoded_response_type;
729
772
  using error_context_type = typename command_type::error_context_type;
730
773
  encoded_response_type resp{ std::move(msg) };
731
774
  error_context_type ctx{};
732
- if (self->last_bootstrap_error_.has_value() && ec == errc::common::unambiguous_timeout) {
733
- CB_LOG_DEBUG("Timeout caused by bootstrap error. code={}, ec_message={}, message={}.",
734
- self->last_bootstrap_error_.value().ec.value(),
735
- self->last_bootstrap_error_.value().ec.message(),
736
- self->last_bootstrap_error_.value().error_message);
737
- ctx.ec = self->last_bootstrap_error_.value().ec;
738
- } else {
739
- ctx.ec = ec;
775
+ if (!std::holds_alternative<std::monostate>(err)) {
776
+ if (std::holds_alternative<impl::bootstrap_error>(err)) {
777
+ auto bootstrap_error = std::get<impl::bootstrap_error>(err);
778
+ if (bootstrap_error.ec == errc::common::unambiguous_timeout) {
779
+ CB_LOG_DEBUG("Timeout caused by bootstrap error. code={}, ec_message={}, message={}.",
780
+ bootstrap_error.ec.value(),
781
+ bootstrap_error.ec.message(),
782
+ bootstrap_error.error_message);
783
+ }
784
+ ctx.ec = bootstrap_error.ec;
785
+ } else {
786
+ ctx.ec = std::get<std::error_code>(err);
787
+ }
740
788
  }
741
789
  ctx.client_context_id = cmd->client_context_id_;
742
790
  ctx.method = cmd->encoded.method;
@@ -756,10 +804,10 @@ private:
756
804
  cmd->request.type,
757
805
  cmd->client_context_id_);
758
806
  add_to_deferred_queue(
759
- [self = shared_from_this(), cmd, request, credentials](std::error_code ec) mutable {
760
- if (ec) {
807
+ [self = shared_from_this(), cmd, request, credentials](error_union err) mutable {
808
+ if (!std::holds_alternative<std::monostate>(err)) {
761
809
  using response_type = typename Request::encoded_response_type;
762
- return cmd->invoke_handler(ec, response_type{});
810
+ return cmd->invoke_handler(err, response_type{});
763
811
  }
764
812
 
765
813
  // don't do anything if the command wasn't dispatched or has already timed out
@@ -787,9 +835,9 @@ private:
787
835
  });
788
836
  }
789
837
 
790
- void drain_deferred_queue(std::error_code ec)
838
+ void drain_deferred_queue(error_union err)
791
839
  {
792
- std::queue<utils::movable_function<void(std::error_code)>> commands{};
840
+ std::queue<utils::movable_function<void(error_union)>> commands{};
793
841
  {
794
842
  const std::scoped_lock lock(deferred_commands_mutex_);
795
843
  std::swap(deferred_commands_, commands);
@@ -798,7 +846,7 @@ private:
798
846
  CB_LOG_TRACE("Draining deferred operation queue, size={}", commands.size());
799
847
  }
800
848
  while (!commands.empty()) {
801
- commands.front()(ec);
849
+ commands.front()(err);
802
850
  commands.pop();
803
851
  }
804
852
  }
@@ -881,8 +929,8 @@ private:
881
929
  std::string client_id_;
882
930
  asio::io_context& ctx_;
883
931
  asio::ssl::context& tls_;
884
- std::shared_ptr<couchbase::tracing::request_tracer> tracer_{ nullptr };
885
- std::shared_ptr<couchbase::metrics::meter> meter_{ nullptr };
932
+ std::shared_ptr<tracing::tracer_wrapper> tracer_{ nullptr };
933
+ std::shared_ptr<metrics::meter_wrapper> meter_{ nullptr };
886
934
  cluster_options options_{};
887
935
 
888
936
  topology::configuration config_{};
@@ -898,7 +946,7 @@ private:
898
946
  std::atomic_bool configured_{ false };
899
947
  std::chrono::milliseconds dispatch_timeout_{};
900
948
  std::atomic_bool allow_fast_fail_{ true };
901
- std::queue<utils::movable_function<void(std::error_code)>> deferred_commands_{};
949
+ std::queue<utils::movable_function<void(error_union)>> deferred_commands_{};
902
950
  std::mutex deferred_commands_mutex_{};
903
951
  std::optional<impl::bootstrap_error> last_bootstrap_error_;
904
952
  std::mutex last_bootstrap_error_mutex_{};
@@ -18,6 +18,8 @@
18
18
  #pragma once
19
19
 
20
20
  #include "core/document_id_fmt.hxx"
21
+ #include "core/error_context/key_value_error_map_info.hxx"
22
+ #include "core/metrics/meter_wrapper.hxx"
21
23
  #include "core/platform/uuid.h"
22
24
  #include "core/protocol/client_request.hxx"
23
25
  #include "core/protocol/client_response.hxx"
@@ -30,7 +32,6 @@
30
32
  #include "mcbp_traits.hxx"
31
33
  #include "retry_orchestrator.hxx"
32
34
 
33
- #include "core/error_context/key_value_error_map_info.hxx"
34
35
  #include <couchbase/durability_level.hxx>
35
36
  #include <couchbase/error_codes.hxx>
36
37
 
@@ -98,12 +99,12 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
98
99
 
99
100
  void start(mcbp_command_handler&& handler)
100
101
  {
101
- span_ = manager_->tracer()->start_span(
102
+ span_ = manager_->tracer()->create_span(
102
103
  tracing::span_name_for_mcbp_command(encoded_request_type::body_type::opcode), parent_span);
103
- if (span_->uses_tags())
104
+ if (span_->uses_tags()) {
104
105
  span_->add_tag(tracing::attributes::service, tracing::service::key_value);
105
- if (span_->uses_tags())
106
106
  span_->add_tag(tracing::attributes::instance, request.id.bucket());
107
+ }
107
108
 
108
109
  handler_ = std::move(handler);
109
110
  deadline.expires_after(timeout_);
@@ -223,8 +224,9 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
223
224
  {
224
225
  opaque_ = session_->next_opaque();
225
226
  request.opaque = *opaque_;
226
- if (span_->uses_tags())
227
+ if (span_->uses_tags()) {
227
228
  span_->add_tag(tracing::attributes::operation_id, fmt::format("0x{:x}", request.opaque));
229
+ }
228
230
  if (request.id.use_collections() && !request.id.is_collection_resolved()) {
229
231
  if (session_->supports_feature(protocol::hello_feature::collections)) {
230
232
  auto collection_id = session_->get_collection_uid(request.id.collection_path());
@@ -265,16 +267,15 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
265
267
  retry_reason reason,
266
268
  io::mcbp_message&& msg,
267
269
  std::optional<key_value_error_map_info> /* error_info */) mutable {
268
- static std::string meter_name = "db.couchbase.operations";
269
- static std::map<std::string, std::string> tags = {
270
- { "db.couchbase.service", "kv" },
271
- { "db.operation", fmt::format("{}", encoded_request_type::body_type::opcode) },
270
+ metrics::metric_attributes attrs{
271
+ service_type::key_value,
272
+ self->request.observability_identifier,
273
+ ec,
274
+ self->request.id.bucket(),
275
+ self->request.id.scope(),
276
+ self->request.id.collection(),
272
277
  };
273
- self->manager_->meter()
274
- ->get_value_recorder(meter_name, tags)
275
- ->record_value(std::chrono::duration_cast<std::chrono::microseconds>(
276
- std::chrono::steady_clock::now() - start)
277
- .count());
278
+ self->manager_->meter()->record_value(std::move(attrs), start);
278
279
 
279
280
  self->retry_backoff.cancel();
280
281
  if (ec == asio::error::operation_aborted) {
@@ -1084,20 +1084,20 @@ public:
1084
1084
  return;
1085
1085
  }
1086
1086
  bootstrapped_ = false;
1087
- if (bootstrap_handler_) {
1088
- last_bootstrap_error_ = std::move(bootstrap_handler_)->last_bootstrap_error();
1087
+ if (auto handler = std::move(bootstrap_handler_); handler) {
1088
+ last_bootstrap_error_ = handler->last_bootstrap_error();
1089
1089
  }
1090
- bootstrap_handler_ = nullptr;
1091
1090
  state_ = diag::endpoint_state::connecting;
1092
1091
  if (stream_->is_open()) {
1093
- std::string old_id = stream_->id();
1094
- stream_->reopen();
1095
- CB_LOG_TRACE(R"({} reopen socket connection "{}" -> "{}", host="{}", port={})",
1096
- log_prefix_,
1097
- old_id,
1098
- stream_->id(),
1099
- bootstrap_hostname_,
1100
- bootstrap_port_);
1092
+ return stream_->close([self = shared_from_this(), old_id = stream_->id()](std::error_code) {
1093
+ CB_LOG_DEBUG(R"({} reopened socket connection "{}" -> "{}", host="{}", port={})",
1094
+ self->log_prefix_,
1095
+ old_id,
1096
+ self->stream_->id(),
1097
+ self->bootstrap_hostname_,
1098
+ self->bootstrap_port_);
1099
+ return self->initiate_bootstrap();
1100
+ });
1101
1101
  }
1102
1102
  if (origin_.exhausted()) {
1103
1103
  #ifdef COUCHBASE_CXX_CLIENT_COLUMNAR
@@ -1174,6 +1174,20 @@ public:
1174
1174
  if (stopped_) {
1175
1175
  return;
1176
1176
  }
1177
+
1178
+ if (reason == retry_reason::socket_closed_while_in_flight && !bootstrapped_) {
1179
+ return stream_->close([self = shared_from_this(), old_id = stream_->id()](std::error_code) {
1180
+ CB_LOG_DEBUG(
1181
+ R"({} reopened socket connection due to IO error, "{}" -> "{}", host="{}", port={})",
1182
+ self->log_prefix_,
1183
+ old_id,
1184
+ self->stream_->id(),
1185
+ self->bootstrap_hostname_,
1186
+ self->bootstrap_port_);
1187
+ return self->initiate_bootstrap();
1188
+ });
1189
+ }
1190
+
1177
1191
  state_ = diag::endpoint_state::disconnecting;
1178
1192
  CB_LOG_DEBUG("{} stop MCBP connection, reason={}", log_prefix_, reason);
1179
1193
  stopped_ = true;
@@ -1653,6 +1667,7 @@ public:
1653
1667
  private:
1654
1668
  void invoke_bootstrap_handler(std::error_code ec)
1655
1669
  {
1670
+ connection_deadline_.cancel();
1656
1671
  retry_backoff_.cancel();
1657
1672
 
1658
1673
  if (ec && state_listener_) {
@@ -1716,6 +1731,7 @@ private:
1716
1731
  if (ec == asio::error::operation_aborted || stopped_) {
1717
1732
  return;
1718
1733
  }
1734
+ connection_deadline_.cancel();
1719
1735
  last_active_ = std::chrono::steady_clock::now();
1720
1736
  if (ec) {
1721
1737
  CB_LOG_ERROR("{} error on resolve: {} ({})", log_prefix_, ec.value(), ec.message());
@@ -1734,9 +1750,7 @@ private:
1734
1750
  if (timer_ec == asio::error::operation_aborted || self->stopped_) {
1735
1751
  return;
1736
1752
  }
1737
- return self->stream_->close([self](std::error_code) {
1738
- self->initiate_bootstrap();
1739
- });
1753
+ self->initiate_bootstrap();
1740
1754
  });
1741
1755
  }
1742
1756
 
@@ -1768,12 +1782,7 @@ private:
1768
1782
  port,
1769
1783
  self->bootstrap_hostname_,
1770
1784
  self->bootstrap_port_);
1771
- return self->stream_->close([self](std::error_code ec) {
1772
- self->last_bootstrap_error_ = {
1773
- ec, ec.message(), self->bootstrap_hostname_, self->bootstrap_port_
1774
- };
1775
- self->initiate_bootstrap();
1776
- });
1785
+ self->initiate_bootstrap();
1777
1786
  });
1778
1787
  stream_->async_connect(it->endpoint(), [capture0 = shared_from_this(), it](auto&& PH1) {
1779
1788
  capture0->on_connect(std::forward<decltype(PH1)>(PH1), it);
@@ -1801,6 +1810,7 @@ private:
1801
1810
  if (ec == asio::error::operation_aborted || stopped_) {
1802
1811
  return;
1803
1812
  }
1813
+ connection_deadline_.cancel();
1804
1814
  last_active_ = std::chrono::steady_clock::now();
1805
1815
  if (!stream_->is_open() || ec) {
1806
1816
  #ifdef COUCHBASE_CXX_CLIENT_STATIC_BORINGSSL
@@ -1853,23 +1863,26 @@ private:
1853
1863
  connection_endpoints_.remote_address,
1854
1864
  connection_endpoints_.remote.port());
1855
1865
  parser_.reset();
1866
+ {
1867
+ const std::scoped_lock lock(output_buffer_mutex_);
1868
+ output_buffer_.clear();
1869
+ }
1856
1870
  bootstrap_handler_ = std::make_shared<bootstrap_handler>(shared_from_this());
1857
- connection_deadline_.cancel();
1858
- }
1859
- }
1860
1871
 
1861
- void check_deadline(std::error_code ec)
1862
- {
1863
- if (ec == asio::error::operation_aborted || stopped_) {
1864
- return;
1865
- }
1866
- if (connection_deadline_.expiry() <= asio::steady_timer::clock_type::now()) {
1867
- stream_->close([](std::error_code) {
1872
+ connection_deadline_.expires_after(origin_.options().key_value_timeout);
1873
+ connection_deadline_.async_wait([self = shared_from_this()](const auto timer_ec) {
1874
+ if (timer_ec == asio::error::operation_aborted || self->stopped_) {
1875
+ return;
1876
+ }
1877
+ CB_LOG_DEBUG("{} unable to boostrap single node at {}:{} (\"{}:{}\") in time, reconnecting",
1878
+ self->log_prefix_,
1879
+ self->connection_endpoints_.remote_address,
1880
+ self->connection_endpoints_.remote.port(),
1881
+ self->bootstrap_hostname_,
1882
+ self->bootstrap_port_);
1883
+ return self->initiate_bootstrap();
1868
1884
  });
1869
1885
  }
1870
- connection_deadline_.async_wait([capture0 = shared_from_this()](auto&& PH1) {
1871
- capture0->check_deadline(std::forward<decltype(PH1)>(PH1));
1872
- });
1873
1886
  }
1874
1887
 
1875
1888
  void do_read()
@@ -1883,6 +1896,7 @@ private:
1883
1896
  [self = shared_from_this(), stream_id = stream_->id()](std::error_code ec,
1884
1897
  std::size_t bytes_transferred) {
1885
1898
  if (ec == asio::error::operation_aborted || self->stopped_) {
1899
+ self->reading_ = false;
1886
1900
  CB_LOG_PROTOCOL("[MCBP, IN] host=\"{}\", port={}, rc={}, bytes_received={}",
1887
1901
  self->connection_endpoints_.remote_address,
1888
1902
  self->connection_endpoints_.remote.port(),
@@ -1901,6 +1915,7 @@ private:
1901
1915
 
1902
1916
  self->last_active_ = std::chrono::steady_clock::now();
1903
1917
  if (ec) {
1918
+ self->reading_ = false;
1904
1919
  if (stream_id != self->stream_->id()) {
1905
1920
  CB_LOG_ERROR(
1906
1921
  R"({} ignore IO error while reading from the socket: {} ({}), old_id="{}", new_id="{}")",