couchbase 3.0.0.alpha.5 → 3.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1001) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +76 -5
  3. data/ext/CMakeLists.txt +95 -128
  4. data/ext/build_config.hxx.in +22 -0
  5. data/ext/build_version.hxx.in +10 -6
  6. data/ext/cmake/Backtrace.cmake +35 -0
  7. data/ext/cmake/BuildTracing.cmake +6 -0
  8. data/ext/cmake/Cache.cmake +29 -0
  9. data/ext/cmake/CompilerWarnings.cmake +84 -0
  10. data/ext/cmake/PreventInSourceBuilds.cmake +21 -0
  11. data/ext/cmake/Sanitizers.cmake +66 -0
  12. data/ext/cmake/StandardProjectSettings.cmake +40 -0
  13. data/ext/cmake/StaticAnalyzers.cmake +37 -0
  14. data/ext/cmake/Testing.cmake +49 -0
  15. data/ext/cmake/ThirdPartyDependencies.cmake +20 -0
  16. data/ext/cmake/VersionInfo.cmake +37 -0
  17. data/ext/couchbase/bucket.hxx +295 -18
  18. data/ext/couchbase/capabilities.hxx +117 -0
  19. data/ext/couchbase/cbcrypto/cbcrypto.cc +15 -15
  20. data/ext/couchbase/cbsasl/client.h +1 -1
  21. data/ext/couchbase/cluster.hxx +255 -75
  22. data/ext/couchbase/cluster_options.hxx +54 -0
  23. data/ext/couchbase/configuration.hxx +440 -44
  24. data/ext/couchbase/couchbase.cxx +4312 -1746
  25. data/ext/couchbase/diagnostics.hxx +248 -0
  26. data/ext/couchbase/document_id.hxx +3 -1
  27. data/ext/couchbase/error_context/analytics.hxx +46 -0
  28. data/ext/couchbase/error_context/http.hxx +44 -0
  29. data/ext/couchbase/error_context/key_value.hxx +47 -0
  30. data/ext/couchbase/error_context/query.hxx +46 -0
  31. data/ext/couchbase/error_context/search.hxx +47 -0
  32. data/ext/couchbase/error_context/view.hxx +47 -0
  33. data/ext/couchbase/error_map.hxx +202 -2
  34. data/ext/couchbase/errors.hxx +18 -3
  35. data/ext/couchbase/io/dns_client.hxx +11 -9
  36. data/ext/couchbase/io/dns_codec.hxx +1 -2
  37. data/ext/couchbase/io/http_command.hxx +111 -0
  38. data/ext/couchbase/io/http_context.hxx +37 -0
  39. data/ext/couchbase/io/http_message.hxx +9 -0
  40. data/ext/couchbase/io/http_parser.hxx +2 -0
  41. data/ext/couchbase/io/http_session.hxx +172 -49
  42. data/ext/couchbase/io/http_session_manager.hxx +171 -34
  43. data/ext/couchbase/io/mcbp_command.hxx +249 -0
  44. data/ext/couchbase/io/mcbp_context.hxx +37 -0
  45. data/ext/couchbase/io/mcbp_message.hxx +5 -0
  46. data/ext/couchbase/io/mcbp_session.hxx +585 -166
  47. data/ext/couchbase/io/query_cache.hxx +61 -0
  48. data/ext/couchbase/io/retry_action.hxx +30 -0
  49. data/ext/couchbase/io/retry_context.hxx +38 -0
  50. data/ext/couchbase/io/retry_orchestrator.hxx +112 -0
  51. data/ext/couchbase/io/retry_reason.hxx +235 -0
  52. data/ext/couchbase/io/retry_strategy.hxx +156 -0
  53. data/ext/couchbase/io/streams.hxx +216 -0
  54. data/ext/couchbase/operations.hxx +19 -1
  55. data/ext/couchbase/operations/analytics_dataset_create.hxx +22 -14
  56. data/ext/couchbase/operations/analytics_dataset_drop.hxx +19 -10
  57. data/ext/couchbase/operations/analytics_dataset_get_all.hxx +18 -11
  58. data/ext/couchbase/operations/analytics_dataverse_create.hxx +20 -12
  59. data/ext/couchbase/operations/analytics_dataverse_drop.hxx +19 -12
  60. data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +19 -11
  61. data/ext/couchbase/operations/analytics_index_create.hxx +19 -12
  62. data/ext/couchbase/operations/analytics_index_drop.hxx +18 -11
  63. data/ext/couchbase/operations/analytics_index_get_all.hxx +16 -9
  64. data/ext/couchbase/operations/analytics_link_connect.hxx +17 -10
  65. data/ext/couchbase/operations/analytics_link_disconnect.hxx +19 -12
  66. data/ext/couchbase/operations/bucket_create.hxx +46 -14
  67. data/ext/couchbase/operations/bucket_drop.hxx +12 -8
  68. data/ext/couchbase/operations/bucket_flush.hxx +11 -8
  69. data/ext/couchbase/operations/bucket_get.hxx +18 -10
  70. data/ext/couchbase/operations/bucket_get_all.hxx +17 -7
  71. data/ext/couchbase/operations/bucket_settings.hxx +59 -4
  72. data/ext/couchbase/operations/bucket_update.hxx +45 -14
  73. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +9 -6
  74. data/ext/couchbase/operations/collection_create.hxx +23 -12
  75. data/ext/couchbase/operations/collection_drop.hxx +21 -12
  76. data/ext/couchbase/operations/collections_manifest_get.hxx +66 -0
  77. data/ext/couchbase/operations/document_analytics.hxx +45 -21
  78. data/ext/couchbase/operations/document_append.hxx +72 -0
  79. data/ext/couchbase/operations/document_decrement.hxx +12 -11
  80. data/ext/couchbase/operations/document_exists.hxx +8 -7
  81. data/ext/couchbase/operations/document_get.hxx +9 -7
  82. data/ext/couchbase/operations/document_get_and_lock.hxx +8 -7
  83. data/ext/couchbase/operations/document_get_and_touch.hxx +10 -9
  84. data/ext/couchbase/operations/document_get_projected.hxx +33 -20
  85. data/ext/couchbase/operations/document_increment.hxx +12 -11
  86. data/ext/couchbase/operations/document_insert.hxx +11 -10
  87. data/ext/couchbase/operations/document_lookup_in.hxx +13 -7
  88. data/ext/couchbase/operations/document_mutate_in.hxx +25 -13
  89. data/ext/couchbase/operations/document_prepend.hxx +72 -0
  90. data/ext/couchbase/operations/document_query.hxx +132 -27
  91. data/ext/couchbase/operations/document_remove.hxx +11 -8
  92. data/ext/couchbase/operations/document_replace.hxx +11 -10
  93. data/ext/couchbase/operations/document_search.hxx +59 -23
  94. data/ext/couchbase/operations/document_touch.hxx +10 -9
  95. data/ext/couchbase/operations/document_unlock.hxx +8 -7
  96. data/ext/couchbase/operations/document_upsert.hxx +11 -10
  97. data/ext/couchbase/operations/document_view.hxx +31 -14
  98. data/ext/couchbase/operations/group_drop.hxx +72 -0
  99. data/ext/couchbase/operations/group_get.hxx +80 -0
  100. data/ext/couchbase/operations/group_get_all.hxx +77 -0
  101. data/ext/couchbase/operations/group_upsert.hxx +125 -0
  102. data/ext/couchbase/operations/http_noop.hxx +78 -0
  103. data/ext/couchbase/operations/mcbp_noop.hxx +55 -0
  104. data/ext/couchbase/operations/query_index_build_deferred.hxx +20 -13
  105. data/ext/couchbase/operations/query_index_create.hxx +34 -17
  106. data/ext/couchbase/operations/query_index_drop.hxx +32 -15
  107. data/ext/couchbase/operations/query_index_get_all.hxx +28 -11
  108. data/ext/couchbase/operations/rbac.hxx +276 -0
  109. data/ext/couchbase/operations/role_get_all.hxx +77 -0
  110. data/ext/couchbase/operations/scope_create.hxx +24 -11
  111. data/ext/couchbase/operations/scope_drop.hxx +20 -11
  112. data/ext/couchbase/operations/scope_get_all.hxx +18 -10
  113. data/ext/couchbase/operations/search_get_stats.hxx +60 -0
  114. data/ext/couchbase/operations/search_index_analyze_document.hxx +29 -16
  115. data/ext/couchbase/operations/search_index_control_ingest.hxx +27 -14
  116. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +27 -14
  117. data/ext/couchbase/operations/search_index_control_query.hxx +27 -14
  118. data/ext/couchbase/operations/search_index_drop.hxx +25 -12
  119. data/ext/couchbase/operations/search_index_get.hxx +25 -12
  120. data/ext/couchbase/operations/search_index_get_all.hxx +16 -9
  121. data/ext/couchbase/operations/search_index_get_documents_count.hxx +46 -26
  122. data/ext/couchbase/operations/search_index_get_stats.hxx +88 -0
  123. data/ext/couchbase/operations/search_index_upsert.hxx +26 -13
  124. data/ext/couchbase/operations/user_drop.hxx +73 -0
  125. data/ext/couchbase/operations/user_get.hxx +81 -0
  126. data/ext/couchbase/operations/user_get_all.hxx +78 -0
  127. data/ext/couchbase/operations/user_upsert.hxx +132 -0
  128. data/ext/couchbase/operations/view_index_drop.hxx +9 -8
  129. data/ext/couchbase/operations/view_index_get.hxx +17 -10
  130. data/ext/couchbase/operations/view_index_get_all.hxx +17 -10
  131. data/ext/couchbase/operations/view_index_upsert.hxx +10 -9
  132. data/ext/couchbase/origin.hxx +179 -0
  133. data/ext/couchbase/platform/backtrace.c +189 -0
  134. data/ext/couchbase/platform/backtrace.h +54 -0
  135. data/ext/couchbase/platform/terminate_handler.cc +130 -0
  136. data/ext/couchbase/platform/terminate_handler.h +36 -0
  137. data/ext/couchbase/protocol/client_opcode.hxx +406 -38
  138. data/ext/couchbase/protocol/client_request.hxx +2 -1
  139. data/ext/couchbase/protocol/client_response.hxx +20 -17
  140. data/ext/couchbase/protocol/cmd_append.hxx +145 -0
  141. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +6 -8
  142. data/ext/couchbase/protocol/cmd_decrement.hxx +5 -5
  143. data/ext/couchbase/protocol/cmd_exists.hxx +1 -0
  144. data/ext/couchbase/protocol/cmd_get.hxx +1 -1
  145. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +5 -5
  146. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +9 -7
  147. data/ext/couchbase/protocol/cmd_hello.hxx +1 -0
  148. data/ext/couchbase/protocol/cmd_increment.hxx +5 -5
  149. data/ext/couchbase/protocol/cmd_info.hxx +0 -11
  150. data/ext/couchbase/protocol/cmd_insert.hxx +5 -5
  151. data/ext/couchbase/protocol/cmd_lookup_in.hxx +11 -3
  152. data/ext/couchbase/protocol/cmd_mutate_in.hxx +55 -14
  153. data/ext/couchbase/protocol/cmd_noop.hxx +82 -0
  154. data/ext/couchbase/protocol/cmd_prepend.hxx +145 -0
  155. data/ext/couchbase/protocol/cmd_replace.hxx +5 -5
  156. data/ext/couchbase/protocol/cmd_touch.hxx +1 -1
  157. data/ext/couchbase/protocol/cmd_upsert.hxx +5 -5
  158. data/ext/couchbase/protocol/durability_level.hxx +16 -0
  159. data/ext/couchbase/protocol/enhanced_error_info.hxx +28 -0
  160. data/ext/couchbase/protocol/hello_feature.hxx +9 -0
  161. data/ext/couchbase/protocol/magic.hxx +6 -6
  162. data/ext/couchbase/protocol/server_opcode.hxx +2 -2
  163. data/ext/couchbase/protocol/status.hxx +70 -60
  164. data/ext/couchbase/protocol/unsigned_leb128.h +2 -2
  165. data/ext/couchbase/service_type.hxx +2 -2
  166. data/ext/couchbase/timeout_defaults.hxx +7 -0
  167. data/ext/couchbase/utils/connection_string.hxx +152 -4
  168. data/ext/couchbase/version.hxx +18 -4
  169. data/ext/extconf.rb +77 -26
  170. data/ext/test/CMakeLists.txt +5 -0
  171. data/ext/test/test_helper.hxx +141 -0
  172. data/ext/test/test_helper_native.hxx +56 -0
  173. data/ext/test/test_helper_ruby.hxx +72 -0
  174. data/ext/test/test_native_binary_operations.cxx +186 -0
  175. data/ext/test/test_native_diagnostics.cxx +436 -0
  176. data/ext/test/test_native_trivial_crud.cxx +83 -0
  177. data/ext/test/test_ruby_trivial_crud.cxx +35 -0
  178. data/ext/test/test_ruby_trivial_query.cxx +34 -0
  179. data/ext/third_party/asio/asio/include/asio.hpp +35 -0
  180. data/ext/third_party/asio/asio/include/asio/any_io_executor.hpp +71 -0
  181. data/ext/third_party/asio/asio/include/asio/associated_allocator.hpp +1 -7
  182. data/ext/third_party/asio/asio/include/asio/associated_executor.hpp +36 -19
  183. data/ext/third_party/asio/asio/include/asio/async_result.hpp +1 -8
  184. data/ext/third_party/asio/asio/include/asio/awaitable.hpp +14 -4
  185. data/ext/third_party/asio/asio/include/asio/basic_datagram_socket.hpp +12 -7
  186. data/ext/third_party/asio/asio/include/asio/basic_deadline_timer.hpp +4 -4
  187. data/ext/third_party/asio/asio/include/asio/basic_raw_socket.hpp +11 -7
  188. data/ext/third_party/asio/asio/include/asio/basic_seq_packet_socket.hpp +9 -4
  189. data/ext/third_party/asio/asio/include/asio/basic_serial_port.hpp +6 -6
  190. data/ext/third_party/asio/asio/include/asio/basic_signal_set.hpp +4 -4
  191. data/ext/third_party/asio/asio/include/asio/basic_socket.hpp +5 -5
  192. data/ext/third_party/asio/asio/include/asio/basic_socket_acceptor.hpp +13 -7
  193. data/ext/third_party/asio/asio/include/asio/basic_stream_socket.hpp +7 -3
  194. data/ext/third_party/asio/asio/include/asio/basic_waitable_timer.hpp +52 -4
  195. data/ext/third_party/asio/asio/include/asio/bind_executor.hpp +10 -15
  196. data/ext/third_party/asio/asio/include/asio/buffer.hpp +6 -4
  197. data/ext/third_party/asio/asio/include/asio/co_spawn.hpp +380 -9
  198. data/ext/third_party/asio/asio/include/asio/defer.hpp +4 -1
  199. data/ext/third_party/asio/asio/include/asio/detached.hpp +50 -0
  200. data/ext/third_party/asio/asio/include/asio/detail/atomic_count.hpp +19 -0
  201. data/ext/third_party/asio/asio/include/asio/detail/bind_handler.hpp +144 -26
  202. data/ext/third_party/asio/asio/include/asio/detail/blocking_executor_op.hpp +107 -0
  203. data/ext/third_party/asio/asio/include/asio/detail/buffer_sequence_adapter.hpp +106 -0
  204. data/ext/third_party/asio/asio/include/asio/detail/bulk_executor_op.hpp +88 -0
  205. data/ext/third_party/asio/asio/include/asio/detail/completion_handler.hpp +10 -5
  206. data/ext/third_party/asio/asio/include/asio/detail/conditionally_enabled_event.hpp +8 -0
  207. data/ext/third_party/asio/asio/include/asio/detail/config.hpp +360 -37
  208. data/ext/third_party/asio/asio/include/asio/detail/deadline_timer_service.hpp +17 -2
  209. data/ext/third_party/asio/asio/include/asio/detail/descriptor_ops.hpp +24 -6
  210. data/ext/third_party/asio/asio/include/asio/detail/descriptor_read_op.hpp +32 -14
  211. data/ext/third_party/asio/asio/include/asio/detail/descriptor_write_op.hpp +32 -14
  212. data/ext/third_party/asio/asio/include/asio/detail/executor_function.hpp +133 -34
  213. data/ext/third_party/asio/asio/include/asio/detail/handler_alloc_helpers.hpp +42 -0
  214. data/ext/third_party/asio/asio/include/asio/detail/handler_invoke_helpers.hpp +23 -0
  215. data/ext/third_party/asio/asio/include/asio/detail/handler_tracking.hpp +26 -0
  216. data/ext/third_party/asio/asio/include/asio/detail/handler_work.hpp +370 -45
  217. data/ext/third_party/asio/asio/include/asio/detail/impl/descriptor_ops.ipp +208 -74
  218. data/ext/third_party/asio/asio/include/asio/detail/impl/handler_tracking.ipp +39 -1
  219. data/ext/third_party/asio/asio/include/asio/detail/impl/reactive_serial_port_service.ipp +12 -15
  220. data/ext/third_party/asio/asio/include/asio/detail/impl/scheduler.ipp +37 -0
  221. data/ext/third_party/asio/asio/include/asio/detail/impl/signal_set_service.ipp +2 -1
  222. data/ext/third_party/asio/asio/include/asio/detail/impl/socket_ops.ipp +661 -274
  223. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_executor_service.hpp +210 -4
  224. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.hpp +8 -9
  225. data/ext/third_party/asio/asio/include/asio/detail/impl/strand_service.ipp +5 -4
  226. data/ext/third_party/asio/asio/include/asio/detail/impl/win_iocp_io_context.ipp +15 -6
  227. data/ext/third_party/asio/asio/include/asio/detail/io_object_impl.hpp +32 -50
  228. data/ext/third_party/asio/asio/include/asio/detail/memory.hpp +3 -0
  229. data/ext/third_party/asio/asio/include/asio/detail/null_event.hpp +6 -0
  230. data/ext/third_party/asio/asio/include/asio/detail/pop_options.hpp +1 -1
  231. data/ext/third_party/asio/asio/include/asio/detail/posix_event.hpp +13 -0
  232. data/ext/third_party/asio/asio/include/asio/detail/push_options.hpp +1 -1
  233. data/ext/third_party/asio/asio/include/asio/detail/reactive_descriptor_service.hpp +38 -13
  234. data/ext/third_party/asio/asio/include/asio/detail/reactive_null_buffers_op.hpp +12 -6
  235. data/ext/third_party/asio/asio/include/asio/detail/reactive_serial_port_service.hpp +2 -3
  236. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_accept_op.hpp +36 -24
  237. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_connect_op.hpp +17 -10
  238. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recv_op.hpp +38 -16
  239. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvfrom_op.hpp +36 -14
  240. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_recvmsg_op.hpp +21 -11
  241. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_send_op.hpp +43 -17
  242. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_sendto_op.hpp +39 -17
  243. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service.hpp +44 -21
  244. data/ext/third_party/asio/asio/include/asio/detail/reactive_socket_service_base.hpp +41 -18
  245. data/ext/third_party/asio/asio/include/asio/detail/reactive_wait_op.hpp +12 -6
  246. data/ext/third_party/asio/asio/include/asio/detail/reactor_op.hpp +3 -1
  247. data/ext/third_party/asio/asio/include/asio/detail/resolve_endpoint_op.hpp +10 -8
  248. data/ext/third_party/asio/asio/include/asio/detail/resolve_query_op.hpp +11 -9
  249. data/ext/third_party/asio/asio/include/asio/detail/scheduler.hpp +8 -0
  250. data/ext/third_party/asio/asio/include/asio/detail/signal_handler.hpp +7 -5
  251. data/ext/third_party/asio/asio/include/asio/detail/socket_ops.hpp +46 -0
  252. data/ext/third_party/asio/asio/include/asio/detail/source_location.hpp +45 -0
  253. data/ext/third_party/asio/asio/include/asio/detail/std_event.hpp +12 -0
  254. data/ext/third_party/asio/asio/include/asio/detail/strand_executor_service.hpp +25 -1
  255. data/ext/third_party/asio/asio/include/asio/detail/strand_service.hpp +4 -1
  256. data/ext/third_party/asio/asio/include/asio/detail/thread_info_base.hpp +58 -0
  257. data/ext/third_party/asio/asio/include/asio/detail/type_traits.hpp +59 -0
  258. data/ext/third_party/asio/asio/include/asio/detail/variadic_templates.hpp +144 -1
  259. data/ext/third_party/asio/asio/include/asio/detail/wait_handler.hpp +9 -6
  260. data/ext/third_party/asio/asio/include/asio/detail/win_event.hpp +13 -0
  261. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_read_op.hpp +9 -5
  262. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_handle_write_op.hpp +9 -5
  263. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_io_context.hpp +5 -1
  264. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_null_buffers_op.hpp +10 -6
  265. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_op.hpp +9 -5
  266. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_overlapped_ptr.hpp +18 -6
  267. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_accept_op.hpp +15 -11
  268. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_connect_op.hpp +10 -5
  269. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recv_op.hpp +8 -4
  270. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvfrom_op.hpp +8 -4
  271. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_recvmsg_op.hpp +8 -4
  272. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_socket_send_op.hpp +8 -4
  273. data/ext/third_party/asio/asio/include/asio/detail/win_iocp_wait_op.hpp +10 -5
  274. data/ext/third_party/asio/asio/include/asio/detail/winrt_resolve_op.hpp +8 -4
  275. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_connect_op.hpp +8 -4
  276. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_recv_op.hpp +8 -4
  277. data/ext/third_party/asio/asio/include/asio/detail/winrt_socket_send_op.hpp +8 -4
  278. data/ext/third_party/asio/asio/include/asio/detail/work_dispatcher.hpp +81 -6
  279. data/ext/third_party/asio/asio/include/asio/detail/wrapped_handler.hpp +45 -9
  280. data/ext/third_party/asio/asio/include/asio/dispatch.hpp +4 -1
  281. data/ext/third_party/asio/asio/include/asio/execution.hpp +48 -0
  282. data/ext/third_party/asio/asio/include/asio/execution/allocator.hpp +249 -0
  283. data/ext/third_party/asio/asio/include/asio/execution/any_executor.hpp +2264 -0
  284. data/ext/third_party/asio/asio/include/asio/execution/bad_executor.hpp +47 -0
  285. data/ext/third_party/asio/asio/include/asio/execution/blocking.hpp +1351 -0
  286. data/ext/third_party/asio/asio/include/asio/execution/blocking_adaptation.hpp +1064 -0
  287. data/ext/third_party/asio/asio/include/asio/execution/bulk_execute.hpp +390 -0
  288. data/ext/third_party/asio/asio/include/asio/execution/bulk_guarantee.hpp +1018 -0
  289. data/ext/third_party/asio/asio/include/asio/execution/connect.hpp +486 -0
  290. data/ext/third_party/asio/asio/include/asio/execution/context.hpp +185 -0
  291. data/ext/third_party/asio/asio/include/asio/execution/context_as.hpp +201 -0
  292. data/ext/third_party/asio/asio/include/asio/execution/detail/as_invocable.hpp +152 -0
  293. data/ext/third_party/asio/asio/include/asio/execution/detail/as_operation.hpp +105 -0
  294. data/ext/third_party/asio/asio/include/asio/execution/detail/as_receiver.hpp +128 -0
  295. data/ext/third_party/asio/asio/include/asio/execution/detail/bulk_sender.hpp +261 -0
  296. data/ext/third_party/asio/asio/include/asio/execution/detail/submit_receiver.hpp +233 -0
  297. data/ext/third_party/asio/asio/include/asio/execution/detail/void_receiver.hpp +90 -0
  298. data/ext/third_party/asio/asio/include/asio/execution/execute.hpp +264 -0
  299. data/ext/third_party/asio/asio/include/asio/execution/executor.hpp +238 -0
  300. data/ext/third_party/asio/asio/include/asio/execution/impl/bad_executor.ipp +40 -0
  301. data/ext/third_party/asio/asio/include/asio/execution/impl/receiver_invocation_error.ipp +36 -0
  302. data/ext/third_party/asio/asio/include/asio/execution/invocable_archetype.hpp +71 -0
  303. data/ext/third_party/asio/asio/include/asio/execution/mapping.hpp +917 -0
  304. data/ext/third_party/asio/asio/include/asio/execution/occupancy.hpp +178 -0
  305. data/ext/third_party/asio/asio/include/asio/execution/operation_state.hpp +94 -0
  306. data/ext/third_party/asio/asio/include/asio/execution/outstanding_work.hpp +721 -0
  307. data/ext/third_party/asio/asio/include/asio/execution/prefer_only.hpp +327 -0
  308. data/ext/third_party/asio/asio/include/asio/execution/receiver.hpp +280 -0
  309. data/ext/third_party/asio/asio/include/asio/execution/receiver_invocation_error.hpp +48 -0
  310. data/ext/third_party/asio/asio/include/asio/execution/relationship.hpp +720 -0
  311. data/ext/third_party/asio/asio/include/asio/execution/schedule.hpp +290 -0
  312. data/ext/third_party/asio/asio/include/asio/execution/scheduler.hpp +86 -0
  313. data/ext/third_party/asio/asio/include/asio/execution/sender.hpp +311 -0
  314. data/ext/third_party/asio/asio/include/asio/execution/set_done.hpp +253 -0
  315. data/ext/third_party/asio/asio/include/asio/execution/set_error.hpp +253 -0
  316. data/ext/third_party/asio/asio/include/asio/execution/set_value.hpp +486 -0
  317. data/ext/third_party/asio/asio/include/asio/execution/start.hpp +250 -0
  318. data/ext/third_party/asio/asio/include/asio/execution/submit.hpp +450 -0
  319. data/ext/third_party/asio/asio/include/asio/executor.hpp +7 -1
  320. data/ext/third_party/asio/asio/include/asio/executor_work_guard.hpp +126 -9
  321. data/ext/third_party/asio/asio/include/asio/handler_alloc_hook.hpp +28 -5
  322. data/ext/third_party/asio/asio/include/asio/handler_invoke_hook.hpp +29 -3
  323. data/ext/third_party/asio/asio/include/asio/impl/awaitable.hpp +14 -0
  324. data/ext/third_party/asio/asio/include/asio/impl/buffered_read_stream.hpp +44 -8
  325. data/ext/third_party/asio/asio/include/asio/impl/buffered_write_stream.hpp +44 -8
  326. data/ext/third_party/asio/asio/include/asio/impl/co_spawn.hpp +145 -7
  327. data/ext/third_party/asio/asio/include/asio/impl/compose.hpp +124 -22
  328. data/ext/third_party/asio/asio/include/asio/impl/connect.hpp +52 -8
  329. data/ext/third_party/asio/asio/include/asio/impl/defer.hpp +147 -12
  330. data/ext/third_party/asio/asio/include/asio/impl/dispatch.hpp +142 -12
  331. data/ext/third_party/asio/asio/include/asio/impl/executor.hpp +15 -101
  332. data/ext/third_party/asio/asio/include/asio/impl/executor.ipp +5 -0
  333. data/ext/third_party/asio/asio/include/asio/impl/handler_alloc_hook.ipp +13 -4
  334. data/ext/third_party/asio/asio/include/asio/impl/io_context.hpp +144 -57
  335. data/ext/third_party/asio/asio/include/asio/impl/multiple_exceptions.ipp +49 -0
  336. data/ext/third_party/asio/asio/include/asio/impl/post.hpp +147 -12
  337. data/ext/third_party/asio/asio/include/asio/impl/read.hpp +85 -18
  338. data/ext/third_party/asio/asio/include/asio/impl/read_at.hpp +59 -14
  339. data/ext/third_party/asio/asio/include/asio/impl/read_until.hpp +241 -56
  340. data/ext/third_party/asio/asio/include/asio/impl/redirect_error.hpp +22 -4
  341. data/ext/third_party/asio/asio/include/asio/impl/spawn.hpp +58 -22
  342. data/ext/third_party/asio/asio/include/asio/impl/src.hpp +3 -0
  343. data/ext/third_party/asio/asio/include/asio/impl/system_context.ipp +16 -4
  344. data/ext/third_party/asio/asio/include/asio/impl/system_executor.hpp +113 -12
  345. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.hpp +260 -37
  346. data/ext/third_party/asio/asio/include/asio/impl/thread_pool.ipp +61 -7
  347. data/ext/third_party/asio/asio/include/asio/impl/use_awaitable.hpp +5 -2
  348. data/ext/third_party/asio/asio/include/asio/impl/use_future.hpp +147 -6
  349. data/ext/third_party/asio/asio/include/asio/impl/write.hpp +75 -14
  350. data/ext/third_party/asio/asio/include/asio/impl/write_at.hpp +53 -11
  351. data/ext/third_party/asio/asio/include/asio/io_context.hpp +706 -48
  352. data/ext/third_party/asio/asio/include/asio/io_context_strand.hpp +3 -1
  353. data/ext/third_party/asio/asio/include/asio/ip/basic_resolver.hpp +4 -4
  354. data/ext/third_party/asio/asio/include/asio/is_applicable_property.hpp +61 -0
  355. data/ext/third_party/asio/asio/include/asio/multiple_exceptions.hpp +58 -0
  356. data/ext/third_party/asio/asio/include/asio/posix/basic_descriptor.hpp +4 -4
  357. data/ext/third_party/asio/asio/include/asio/posix/basic_stream_descriptor.hpp +5 -5
  358. data/ext/third_party/asio/asio/include/asio/post.hpp +4 -1
  359. data/ext/third_party/asio/asio/include/asio/prefer.hpp +656 -0
  360. data/ext/third_party/asio/asio/include/asio/query.hpp +296 -0
  361. data/ext/third_party/asio/asio/include/asio/read_until.hpp +6 -6
  362. data/ext/third_party/asio/asio/include/asio/require.hpp +524 -0
  363. data/ext/third_party/asio/asio/include/asio/require_concept.hpp +310 -0
  364. data/ext/third_party/asio/asio/include/asio/spawn.hpp +12 -4
  365. data/ext/third_party/asio/asio/include/asio/ssl/detail/buffered_handshake_op.hpp +5 -0
  366. data/ext/third_party/asio/asio/include/asio/ssl/detail/engine.hpp +5 -0
  367. data/ext/third_party/asio/asio/include/asio/ssl/detail/handshake_op.hpp +5 -0
  368. data/ext/third_party/asio/asio/include/asio/ssl/detail/impl/engine.ipp +16 -3
  369. data/ext/third_party/asio/asio/include/asio/ssl/detail/io.hpp +38 -4
  370. data/ext/third_party/asio/asio/include/asio/ssl/detail/read_op.hpp +5 -0
  371. data/ext/third_party/asio/asio/include/asio/ssl/detail/shutdown_op.hpp +5 -0
  372. data/ext/third_party/asio/asio/include/asio/ssl/detail/stream_core.hpp +36 -2
  373. data/ext/third_party/asio/asio/include/asio/ssl/detail/write_op.hpp +10 -1
  374. data/ext/third_party/asio/asio/include/asio/ssl/stream.hpp +15 -0
  375. data/ext/third_party/asio/asio/include/asio/static_thread_pool.hpp +31 -0
  376. data/ext/third_party/asio/asio/include/asio/strand.hpp +232 -9
  377. data/ext/third_party/asio/asio/include/asio/system_context.hpp +12 -3
  378. data/ext/third_party/asio/asio/include/asio/system_executor.hpp +557 -24
  379. data/ext/third_party/asio/asio/include/asio/thread_pool.hpp +913 -37
  380. data/ext/third_party/asio/asio/include/asio/traits/bulk_execute_free.hpp +114 -0
  381. data/ext/third_party/asio/asio/include/asio/traits/bulk_execute_member.hpp +114 -0
  382. data/ext/third_party/asio/asio/include/asio/traits/connect_free.hpp +112 -0
  383. data/ext/third_party/asio/asio/include/asio/traits/connect_member.hpp +112 -0
  384. data/ext/third_party/asio/asio/include/asio/traits/equality_comparable.hpp +100 -0
  385. data/ext/third_party/asio/asio/include/asio/traits/execute_free.hpp +108 -0
  386. data/ext/third_party/asio/asio/include/asio/traits/execute_member.hpp +108 -0
  387. data/ext/third_party/asio/asio/include/asio/traits/prefer_free.hpp +108 -0
  388. data/ext/third_party/asio/asio/include/asio/traits/prefer_member.hpp +108 -0
  389. data/ext/third_party/asio/asio/include/asio/traits/query_free.hpp +108 -0
  390. data/ext/third_party/asio/asio/include/asio/traits/query_member.hpp +108 -0
  391. data/ext/third_party/asio/asio/include/asio/traits/query_static_constexpr_member.hpp +108 -0
  392. data/ext/third_party/asio/asio/include/asio/traits/require_concept_free.hpp +108 -0
  393. data/ext/third_party/asio/asio/include/asio/traits/require_concept_member.hpp +108 -0
  394. data/ext/third_party/asio/asio/include/asio/traits/require_free.hpp +108 -0
  395. data/ext/third_party/asio/asio/include/asio/traits/require_member.hpp +108 -0
  396. data/ext/third_party/asio/asio/include/asio/traits/schedule_free.hpp +108 -0
  397. data/ext/third_party/asio/asio/include/asio/traits/schedule_member.hpp +108 -0
  398. data/ext/third_party/asio/asio/include/asio/traits/set_done_free.hpp +108 -0
  399. data/ext/third_party/asio/asio/include/asio/traits/set_done_member.hpp +108 -0
  400. data/ext/third_party/asio/asio/include/asio/traits/set_error_free.hpp +112 -0
  401. data/ext/third_party/asio/asio/include/asio/traits/set_error_member.hpp +112 -0
  402. data/ext/third_party/asio/asio/include/asio/traits/set_value_free.hpp +234 -0
  403. data/ext/third_party/asio/asio/include/asio/traits/set_value_member.hpp +234 -0
  404. data/ext/third_party/asio/asio/include/asio/traits/start_free.hpp +108 -0
  405. data/ext/third_party/asio/asio/include/asio/traits/start_member.hpp +108 -0
  406. data/ext/third_party/asio/asio/include/asio/traits/static_query.hpp +108 -0
  407. data/ext/third_party/asio/asio/include/asio/traits/static_require.hpp +123 -0
  408. data/ext/third_party/asio/asio/include/asio/traits/static_require_concept.hpp +123 -0
  409. data/ext/third_party/asio/asio/include/asio/traits/submit_free.hpp +112 -0
  410. data/ext/third_party/asio/asio/include/asio/traits/submit_member.hpp +112 -0
  411. data/ext/third_party/asio/asio/include/asio/ts/executor.hpp +1 -0
  412. data/ext/third_party/asio/asio/include/asio/ts/netfwd.hpp +67 -8
  413. data/ext/third_party/asio/asio/include/asio/use_awaitable.hpp +63 -4
  414. data/ext/third_party/asio/asio/include/asio/version.hpp +1 -1
  415. data/ext/third_party/asio/asio/include/asio/windows/basic_object_handle.hpp +4 -4
  416. data/ext/third_party/asio/asio/include/asio/windows/basic_overlapped_handle.hpp +2 -2
  417. data/ext/third_party/asio/asio/include/asio/windows/basic_random_access_handle.hpp +5 -5
  418. data/ext/third_party/asio/asio/include/asio/windows/basic_stream_handle.hpp +5 -5
  419. data/ext/third_party/asio/asio/include/asio/windows/overlapped_ptr.hpp +4 -2
  420. data/ext/third_party/gsl/CMakeLists.txt +13 -5
  421. data/ext/third_party/gsl/include/gsl/gsl_assert +1 -1
  422. data/ext/third_party/gsl/include/gsl/gsl_byte +3 -3
  423. data/ext/third_party/gsl/include/gsl/gsl_narrow +52 -0
  424. data/ext/third_party/gsl/include/gsl/gsl_util +8 -50
  425. data/ext/third_party/gsl/include/gsl/multi_span +0 -10
  426. data/ext/third_party/gsl/include/gsl/pointers +14 -28
  427. data/ext/third_party/gsl/include/gsl/span +98 -46
  428. data/ext/third_party/gsl/include/gsl/string_span +37 -47
  429. data/ext/third_party/http_parser/http_parser.c +17 -10
  430. data/ext/third_party/http_parser/http_parser.h +4 -2
  431. data/ext/third_party/json/include/tao/json/basic_value.hpp +3 -2
  432. data/ext/third_party/json/include/tao/json/binary.hpp +4 -4
  433. data/ext/third_party/json/include/tao/json/binary_view.hpp +2 -2
  434. data/ext/third_party/json/include/tao/json/binding.hpp +2 -2
  435. data/ext/third_party/json/include/tao/json/binding/factory.hpp +8 -7
  436. data/ext/third_party/json/include/tao/json/binding/internal/array.hpp +2 -1
  437. data/ext/third_party/json/include/tao/json/binding/internal/object.hpp +6 -5
  438. data/ext/third_party/json/include/tao/json/binding/versions.hpp +3 -1
  439. data/ext/third_party/json/include/tao/json/cbor.hpp +1 -0
  440. data/ext/third_party/json/include/tao/json/cbor/consume_file.hpp +7 -7
  441. data/ext/third_party/json/include/tao/json/cbor/events/from_binary.hpp +43 -0
  442. data/ext/third_party/json/include/tao/json/cbor/events/from_file.hpp +4 -4
  443. data/ext/third_party/json/include/tao/json/cbor/events/from_string.hpp +3 -3
  444. data/ext/third_party/json/include/tao/json/cbor/from_binary.hpp +32 -0
  445. data/ext/third_party/json/include/tao/json/cbor/from_file.hpp +5 -5
  446. data/ext/third_party/json/include/tao/json/cbor/internal/grammar.hpp +2 -1
  447. data/ext/third_party/json/include/tao/json/consume_file.hpp +7 -7
  448. data/ext/third_party/json/include/tao/json/contrib/internal/indirect_traits.hpp +13 -6
  449. data/ext/third_party/json/include/tao/json/contrib/position.hpp +15 -15
  450. data/ext/third_party/json/include/tao/json/contrib/reference.hpp +5 -7
  451. data/ext/third_party/json/include/tao/json/contrib/schema.hpp +58 -35
  452. data/ext/third_party/json/include/tao/json/contrib/shared_ptr_traits.hpp +12 -4
  453. data/ext/third_party/json/include/tao/json/contrib/unique_ptr_traits.hpp +12 -4
  454. data/ext/third_party/json/include/tao/json/contrib/unordered_map_traits.hpp +1 -1
  455. data/ext/third_party/json/include/tao/json/contrib/unordered_set_traits.hpp +2 -2
  456. data/ext/third_party/json/include/tao/json/events/compare.hpp +2 -12
  457. data/ext/third_party/json/include/tao/json/events/from_file.hpp +4 -4
  458. data/ext/third_party/json/include/tao/json/events/from_string.hpp +2 -2
  459. data/ext/third_party/json/include/tao/json/events/invalid_string_to_binary.hpp +1 -1
  460. data/ext/third_party/json/include/tao/json/events/key_camel_case_to_snake_case.hpp +3 -3
  461. data/ext/third_party/json/include/tao/json/events/key_snake_case_to_camel_case.hpp +1 -1
  462. data/ext/third_party/json/include/tao/json/events/tee.hpp +2 -2
  463. data/ext/third_party/json/include/tao/json/events/to_pretty_stream.hpp +1 -1
  464. data/ext/third_party/json/include/tao/json/events/to_stream.hpp +1 -1
  465. data/ext/third_party/json/include/tao/json/events/transformer.hpp +3 -3
  466. data/ext/third_party/json/include/tao/json/events/validate_event_order.hpp +3 -3
  467. data/ext/third_party/json/include/tao/json/events/virtual_ref.hpp +6 -0
  468. data/ext/third_party/json/include/tao/json/external/pegtl.hpp +4 -13
  469. data/ext/third_party/json/include/tao/json/external/pegtl/argv_input.hpp +3 -5
  470. data/ext/third_party/json/include/tao/json/external/pegtl/ascii.hpp +5 -18
  471. data/ext/third_party/json/include/tao/json/external/pegtl/buffer_input.hpp +3 -3
  472. data/ext/third_party/json/include/tao/json/external/pegtl/change_action.hpp +2 -2
  473. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_state.hpp +6 -6
  474. data/ext/third_party/json/include/tao/json/external/pegtl/change_action_and_states.hpp +5 -5
  475. data/ext/third_party/json/include/tao/json/external/pegtl/change_control.hpp +2 -2
  476. data/ext/third_party/json/include/tao/json/external/pegtl/change_state.hpp +6 -6
  477. data/ext/third_party/json/include/tao/json/external/pegtl/change_states.hpp +5 -5
  478. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/alphabet.hpp +52 -52
  479. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/analyze.hpp +176 -0
  480. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/analyze_traits.hpp +275 -0
  481. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/control_action.hpp +77 -0
  482. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/coverage.hpp +151 -0
  483. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/forward.hpp +16 -0
  484. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/http.hpp +37 -18
  485. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/internal.hpp +20 -22
  486. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf16.hpp +6 -10
  487. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf32.hpp +6 -10
  488. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/icu/utf8.hpp +2 -4
  489. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/if_then.hpp +11 -10
  490. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/integer.hpp +116 -131
  491. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/endian.hpp +4 -4
  492. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/endian_gcc.hpp +2 -2
  493. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/endian_win.hpp +2 -2
  494. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_mask_uint.hpp +9 -9
  495. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_mask_uint8.hpp +9 -10
  496. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_uint.hpp +9 -9
  497. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_uint8.hpp +9 -10
  498. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_utf16.hpp +10 -10
  499. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/peek_utf32.hpp +9 -9
  500. data/ext/third_party/json/include/tao/json/external/pegtl/{internal → contrib/internal}/read_uint.hpp +3 -3
  501. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/internal/set_stack_guard.hpp +52 -0
  502. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree.hpp +80 -201
  503. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/parse_tree_to_dot.hpp +11 -10
  504. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/print.hpp +75 -0
  505. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/print_coverage.hpp +53 -0
  506. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/raw_string.hpp +45 -36
  507. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/remove_first_state.hpp +33 -50
  508. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/remove_last_states.hpp +117 -0
  509. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_one_min_max.hpp +43 -11
  510. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/rep_string.hpp +1 -2
  511. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/shuffle_states.hpp +193 -0
  512. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/state_control.hpp +118 -0
  513. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/trace.hpp +227 -0
  514. data/ext/third_party/json/include/tao/json/external/pegtl/{uint16.hpp → contrib/uint16.hpp} +5 -5
  515. data/ext/third_party/json/include/tao/json/external/pegtl/{uint32.hpp → contrib/uint32.hpp} +5 -5
  516. data/ext/third_party/json/include/tao/json/external/pegtl/{uint64.hpp → contrib/uint64.hpp} +5 -5
  517. data/ext/third_party/json/include/tao/json/external/pegtl/{uint8.hpp → contrib/uint8.hpp} +5 -5
  518. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/unescape.hpp +14 -14
  519. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/uri.hpp +1 -1
  520. data/ext/third_party/json/include/tao/json/external/pegtl/{utf16.hpp → contrib/utf16.hpp} +5 -5
  521. data/ext/third_party/json/include/tao/json/external/pegtl/{utf32.hpp → contrib/utf32.hpp} +5 -5
  522. data/ext/third_party/json/include/tao/json/external/pegtl/cstream_input.hpp +2 -3
  523. data/ext/third_party/json/include/tao/json/external/pegtl/{internal/demangle.hpp → demangle.hpp} +12 -14
  524. data/ext/third_party/json/include/tao/json/external/pegtl/disable_action.hpp +2 -2
  525. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input.hpp +2 -2
  526. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_failure.hpp +2 -2
  527. data/ext/third_party/json/include/tao/json/external/pegtl/discard_input_on_success.hpp +2 -2
  528. data/ext/third_party/json/include/tao/json/external/pegtl/enable_action.hpp +2 -2
  529. data/ext/third_party/json/include/tao/json/external/pegtl/file_input.hpp +1 -1
  530. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action.hpp +19 -9
  531. data/ext/third_party/json/include/tao/json/external/pegtl/internal/action_input.hpp +7 -8
  532. data/ext/third_party/json/include/tao/json/external/pegtl/internal/any.hpp +14 -14
  533. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply.hpp +9 -9
  534. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply0.hpp +8 -7
  535. data/ext/third_party/json/include/tao/json/external/pegtl/internal/apply_single.hpp +4 -4
  536. data/ext/third_party/json/include/tao/json/external/pegtl/internal/at.hpp +17 -15
  537. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bof.hpp +7 -6
  538. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bol.hpp +8 -8
  539. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump.hpp +4 -4
  540. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bump_help.hpp +3 -3
  541. data/ext/third_party/json/include/tao/json/external/pegtl/internal/bytes.hpp +17 -10
  542. data/ext/third_party/json/include/tao/json/external/pegtl/internal/control.hpp +19 -9
  543. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_crlf_eol.hpp +2 -2
  544. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cr_eol.hpp +2 -2
  545. data/ext/third_party/json/include/tao/json/external/pegtl/internal/crlf_eol.hpp +2 -2
  546. data/ext/third_party/json/include/tao/json/external/pegtl/internal/cstream_reader.hpp +1 -1
  547. data/ext/third_party/json/include/tao/json/external/pegtl/internal/{always_false.hpp → dependent_false.hpp} +3 -8
  548. data/ext/third_party/json/include/tao/json/external/pegtl/internal/disable.hpp +19 -9
  549. data/ext/third_party/json/include/tao/json/external/pegtl/internal/discard.hpp +7 -6
  550. data/ext/third_party/json/include/tao/json/external/pegtl/internal/enable.hpp +19 -9
  551. data/ext/third_party/json/include/tao/json/external/pegtl/internal/{skip_control.hpp → enable_control.hpp} +5 -5
  552. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eof.hpp +7 -6
  553. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eol.hpp +8 -7
  554. data/ext/third_party/json/include/tao/json/external/pegtl/internal/eolf.hpp +8 -7
  555. data/ext/third_party/json/include/tao/json/external/pegtl/internal/failure.hpp +32 -0
  556. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_posix.hpp +61 -10
  557. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_mapper_win32.hpp +27 -33
  558. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_reader.hpp +27 -28
  559. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply.hpp +3 -7
  560. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_apply0.hpp +3 -7
  561. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_match.hpp +4 -20
  562. data/ext/third_party/json/include/tao/json/external/pegtl/internal/has_unwind.hpp +21 -0
  563. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_apply.hpp +8 -7
  564. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must.hpp +8 -9
  565. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_must_else.hpp +2 -0
  566. data/ext/third_party/json/include/tao/json/external/pegtl/internal/if_then_else.hpp +7 -7
  567. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istream_reader.hpp +1 -2
  568. data/ext/third_party/json/include/tao/json/external/pegtl/internal/istring.hpp +11 -11
  569. data/ext/third_party/json/include/tao/json/external/pegtl/internal/iterator.hpp +7 -10
  570. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_crlf_eol.hpp +2 -2
  571. data/ext/third_party/json/include/tao/json/external/pegtl/internal/lf_eol.hpp +2 -2
  572. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail.hpp +4 -2
  573. data/ext/third_party/json/include/tao/json/external/pegtl/internal/list_tail_pad.hpp +1 -1
  574. data/ext/third_party/json/include/tao/json/external/pegtl/internal/marker.hpp +3 -5
  575. data/ext/third_party/json/include/tao/json/external/pegtl/internal/minus.hpp +21 -0
  576. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply.hpp +5 -2
  577. data/ext/third_party/json/include/tao/json/external/pegtl/internal/missing_apply0.hpp +5 -2
  578. data/ext/third_party/json/include/tao/json/external/pegtl/internal/must.hpp +16 -24
  579. data/ext/third_party/json/include/tao/json/external/pegtl/internal/not_at.hpp +17 -15
  580. data/ext/third_party/json/include/tao/json/external/pegtl/internal/one.hpp +23 -12
  581. data/ext/third_party/json/include/tao/json/external/pegtl/internal/opt.hpp +16 -16
  582. data/ext/third_party/json/include/tao/json/external/pegtl/internal/path_to_string.hpp +26 -0
  583. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_char.hpp +5 -5
  584. data/ext/third_party/json/include/tao/json/external/pegtl/internal/peek_utf8.hpp +12 -13
  585. data/ext/third_party/json/include/tao/json/external/pegtl/internal/plus.hpp +18 -11
  586. data/ext/third_party/json/include/tao/json/external/pegtl/internal/raise.hpp +8 -17
  587. data/ext/third_party/json/include/tao/json/external/pegtl/internal/range.hpp +22 -17
  588. data/ext/third_party/json/include/tao/json/external/pegtl/internal/ranges.hpp +28 -18
  589. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rematch.hpp +12 -9
  590. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep.hpp +26 -25
  591. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_min_max.hpp +23 -21
  592. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rep_opt.hpp +24 -9
  593. data/ext/third_party/json/include/tao/json/external/pegtl/internal/require.hpp +10 -10
  594. data/ext/third_party/json/include/tao/json/external/pegtl/internal/rules.hpp +4 -4
  595. data/ext/third_party/json/include/tao/json/external/pegtl/internal/seq.hpp +18 -33
  596. data/ext/third_party/json/include/tao/json/external/pegtl/internal/sor.hpp +24 -17
  597. data/ext/third_party/json/include/tao/json/external/pegtl/internal/star.hpp +13 -8
  598. data/ext/third_party/json/include/tao/json/external/pegtl/internal/state.hpp +21 -11
  599. data/ext/third_party/json/include/tao/json/external/pegtl/internal/string.hpp +11 -11
  600. data/ext/third_party/json/include/tao/json/external/pegtl/internal/success.hpp +32 -0
  601. data/ext/third_party/json/include/tao/json/external/pegtl/internal/try_catch_type.hpp +16 -16
  602. data/ext/third_party/json/include/tao/json/external/pegtl/internal/until.hpp +18 -14
  603. data/ext/third_party/json/include/tao/json/external/pegtl/istream_input.hpp +2 -3
  604. data/ext/third_party/json/include/tao/json/external/pegtl/match.hpp +125 -29
  605. data/ext/third_party/json/include/tao/json/external/pegtl/memory_input.hpp +32 -48
  606. data/ext/third_party/json/include/tao/json/external/pegtl/mmap_input.hpp +16 -16
  607. data/ext/third_party/json/include/tao/json/external/pegtl/must_if.hpp +64 -0
  608. data/ext/third_party/json/include/tao/json/external/pegtl/normal.hpp +25 -25
  609. data/ext/third_party/json/include/tao/json/external/pegtl/nothing.hpp +1 -2
  610. data/ext/third_party/json/include/tao/json/external/pegtl/parse.hpp +6 -8
  611. data/ext/third_party/json/include/tao/json/external/pegtl/parse_error.hpp +80 -35
  612. data/ext/third_party/json/include/tao/json/external/pegtl/position.hpp +18 -10
  613. data/ext/third_party/json/include/tao/json/external/pegtl/read_input.hpp +18 -38
  614. data/ext/third_party/json/include/tao/json/external/pegtl/rules.hpp +6 -5
  615. data/ext/third_party/json/include/tao/json/external/pegtl/string_input.hpp +3 -5
  616. data/ext/third_party/json/include/tao/json/external/pegtl/type_list.hpp +46 -0
  617. data/ext/third_party/json/include/tao/json/external/pegtl/visit.hpp +66 -0
  618. data/ext/third_party/json/include/tao/json/from_file.hpp +5 -5
  619. data/ext/third_party/json/include/tao/json/internal/action.hpp +3 -3
  620. data/ext/third_party/json/include/tao/json/internal/dependent_false.hpp +14 -0
  621. data/ext/third_party/json/include/tao/json/internal/errors.hpp +17 -17
  622. data/ext/third_party/json/include/tao/json/internal/format.hpp +0 -2
  623. data/ext/third_party/json/include/tao/json/internal/grammar.hpp +17 -17
  624. data/ext/third_party/json/include/tao/json/internal/pair.hpp +1 -1
  625. data/ext/third_party/json/include/tao/json/internal/sha256.hpp +8 -8
  626. data/ext/third_party/json/include/tao/json/internal/single.hpp +1 -1
  627. data/ext/third_party/json/include/tao/json/internal/type_traits.hpp +12 -29
  628. data/ext/third_party/json/include/tao/json/jaxn/consume_file.hpp +7 -7
  629. data/ext/third_party/json/include/tao/json/jaxn/events/from_file.hpp +4 -4
  630. data/ext/third_party/json/include/tao/json/jaxn/events/from_string.hpp +2 -2
  631. data/ext/third_party/json/include/tao/json/jaxn/from_file.hpp +5 -5
  632. data/ext/third_party/json/include/tao/json/jaxn/internal/action.hpp +6 -6
  633. data/ext/third_party/json/include/tao/json/jaxn/internal/bunescape_action.hpp +2 -2
  634. data/ext/third_party/json/include/tao/json/jaxn/internal/errors.hpp +43 -43
  635. data/ext/third_party/json/include/tao/json/jaxn/internal/grammar.hpp +36 -36
  636. data/ext/third_party/json/include/tao/json/jaxn/internal/integer.hpp +10 -11
  637. data/ext/third_party/json/include/tao/json/jaxn/is_identifier.hpp +2 -2
  638. data/ext/third_party/json/include/tao/json/jaxn/parts_parser.hpp +1 -3
  639. data/ext/third_party/json/include/tao/json/message_extension.hpp +2 -2
  640. data/ext/third_party/json/include/tao/json/msgpack.hpp +1 -0
  641. data/ext/third_party/json/include/tao/json/msgpack/consume_file.hpp +7 -7
  642. data/ext/third_party/json/include/tao/json/msgpack/events/from_binary.hpp +43 -0
  643. data/ext/third_party/json/include/tao/json/msgpack/events/from_file.hpp +4 -4
  644. data/ext/third_party/json/include/tao/json/msgpack/events/from_string.hpp +4 -4
  645. data/ext/third_party/json/include/tao/json/msgpack/events/to_stream.hpp +4 -4
  646. data/ext/third_party/json/include/tao/json/msgpack/from_binary.hpp +32 -0
  647. data/ext/third_party/json/include/tao/json/msgpack/from_file.hpp +5 -5
  648. data/ext/third_party/json/include/tao/json/msgpack/internal/grammar.hpp +2 -1
  649. data/ext/third_party/json/include/tao/json/operators.hpp +0 -4
  650. data/ext/third_party/json/include/tao/json/parts_parser.hpp +3 -7
  651. data/ext/third_party/json/include/tao/json/self_contained.hpp +6 -18
  652. data/ext/third_party/json/include/tao/json/span.hpp +94 -166
  653. data/ext/third_party/json/include/tao/json/ubjson.hpp +1 -0
  654. data/ext/third_party/json/include/tao/json/ubjson/consume_file.hpp +7 -7
  655. data/ext/third_party/json/include/tao/json/ubjson/events/from_binary.hpp +43 -0
  656. data/ext/third_party/json/include/tao/json/ubjson/events/from_file.hpp +4 -4
  657. data/ext/third_party/json/include/tao/json/ubjson/events/from_string.hpp +3 -3
  658. data/ext/third_party/json/include/tao/json/ubjson/from_binary.hpp +32 -0
  659. data/ext/third_party/json/include/tao/json/ubjson/from_file.hpp +5 -5
  660. data/ext/third_party/json/include/tao/json/ubjson/internal/grammar.hpp +5 -3
  661. data/ext/third_party/json/include/tao/json/utf8.hpp +1 -1
  662. data/ext/third_party/snappy/snappy.cc +6 -2
  663. data/ext/third_party/spdlog/CMakeLists.txt +24 -57
  664. data/ext/third_party/spdlog/cmake/version.rc.in +1 -1
  665. data/ext/third_party/spdlog/include/spdlog/async.h +3 -3
  666. data/ext/third_party/spdlog/include/spdlog/cfg/argv.h +3 -4
  667. data/ext/third_party/spdlog/include/spdlog/cfg/env.h +6 -4
  668. data/ext/third_party/spdlog/include/spdlog/cfg/helpers-inl.h +22 -6
  669. data/ext/third_party/spdlog/include/spdlog/cfg/helpers.h +3 -2
  670. data/ext/third_party/spdlog/include/spdlog/common.h +1 -2
  671. data/ext/third_party/spdlog/include/spdlog/details/fmt_helper.h +9 -1
  672. data/ext/third_party/spdlog/include/spdlog/details/os.h +1 -1
  673. data/ext/third_party/spdlog/include/spdlog/details/registry-inl.h +21 -7
  674. data/ext/third_party/spdlog/include/spdlog/details/registry.h +6 -3
  675. data/ext/third_party/spdlog/include/spdlog/details/synchronous_factory.h +1 -1
  676. data/ext/third_party/spdlog/include/spdlog/details/tcp_client-windows.h +1 -1
  677. data/ext/third_party/spdlog/include/spdlog/details/tcp_client.h +8 -7
  678. data/ext/third_party/spdlog/include/spdlog/fmt/bin_to_hex.h +2 -2
  679. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/chrono.h +66 -62
  680. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/color.h +35 -37
  681. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/compile.h +173 -103
  682. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/core.h +538 -445
  683. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format-inl.h +114 -64
  684. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/format.h +1152 -1071
  685. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/locale.h +16 -16
  686. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/os.h +450 -0
  687. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ostream.h +37 -13
  688. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/posix.h +1 -1
  689. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/printf.h +93 -63
  690. data/ext/third_party/spdlog/include/spdlog/fmt/bundled/ranges.h +35 -36
  691. data/ext/third_party/spdlog/include/spdlog/fmt/chrono.h +20 -0
  692. data/ext/third_party/spdlog/include/spdlog/fmt/fmt.h +2 -0
  693. data/ext/third_party/spdlog/include/spdlog/logger-inl.h +5 -1
  694. data/ext/third_party/spdlog/include/spdlog/logger.h +50 -76
  695. data/ext/third_party/spdlog/include/spdlog/pattern_formatter-inl.h +23 -8
  696. data/ext/third_party/spdlog/include/spdlog/pattern_formatter.h +3 -3
  697. data/ext/third_party/spdlog/include/spdlog/sinks/daily_file_sink.h +1 -1
  698. data/ext/third_party/spdlog/include/spdlog/sinks/msvc_sink.h +5 -5
  699. data/ext/third_party/spdlog/include/spdlog/sinks/ringbuffer_sink.h +6 -4
  700. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks-inl.h +32 -3
  701. data/ext/third_party/spdlog/include/spdlog/sinks/stdout_sinks.h +7 -0
  702. data/ext/third_party/spdlog/include/spdlog/sinks/wincolor_sink-inl.h +4 -14
  703. data/ext/third_party/spdlog/include/spdlog/spdlog-inl.h +11 -1
  704. data/ext/third_party/spdlog/include/spdlog/spdlog.h +23 -68
  705. data/ext/third_party/spdlog/include/spdlog/stopwatch.h +61 -0
  706. data/ext/third_party/spdlog/include/spdlog/version.h +2 -2
  707. data/ext/third_party/spdlog/src/fmt.cpp +21 -147
  708. data/lib/active_support/cache/couchbase_store.rb +362 -0
  709. data/lib/couchbase.rb +2 -0
  710. data/lib/couchbase/analytics_options.rb +1 -59
  711. data/lib/couchbase/authenticator.rb +40 -0
  712. data/lib/couchbase/binary_collection.rb +62 -23
  713. data/lib/couchbase/binary_collection_options.rb +0 -74
  714. data/lib/couchbase/bucket.rb +45 -40
  715. data/lib/couchbase/cluster.rb +250 -138
  716. data/lib/couchbase/collection.rb +324 -93
  717. data/lib/couchbase/collection_options.rb +75 -241
  718. data/lib/couchbase/configuration.rb +57 -0
  719. data/{Gemfile → lib/couchbase/datastructures.rb} +9 -9
  720. data/lib/couchbase/datastructures/couchbase_list.rb +160 -0
  721. data/lib/couchbase/datastructures/couchbase_map.rb +194 -0
  722. data/lib/couchbase/datastructures/couchbase_queue.rb +134 -0
  723. data/lib/couchbase/datastructures/couchbase_set.rb +128 -0
  724. data/lib/couchbase/diagnostics.rb +181 -0
  725. data/lib/couchbase/errors.rb +186 -65
  726. data/lib/couchbase/json_transcoder.rb +3 -3
  727. data/{bin/check-cluster → lib/couchbase/logger.rb} +27 -16
  728. data/lib/couchbase/{common_options.rb → management.rb} +11 -13
  729. data/lib/couchbase/management/analytics_index_manager.rb +37 -37
  730. data/lib/couchbase/management/bucket_manager.rb +70 -30
  731. data/lib/couchbase/management/collection_manager.rb +4 -4
  732. data/lib/couchbase/management/query_index_manager.rb +60 -15
  733. data/lib/couchbase/management/search_index_manager.rb +57 -13
  734. data/lib/couchbase/management/user_manager.rb +176 -50
  735. data/lib/couchbase/management/view_index_manager.rb +11 -5
  736. data/lib/couchbase/mutation_state.rb +13 -0
  737. data/lib/couchbase/options.rb +2104 -0
  738. data/lib/couchbase/query_options.rb +6 -105
  739. data/lib/couchbase/railtie.rb +45 -0
  740. data/lib/couchbase/scope.rb +87 -9
  741. data/lib/couchbase/search_options.rb +98 -103
  742. data/lib/couchbase/subdoc.rb +31 -28
  743. data/{bin/console → lib/couchbase/utils.rb} +6 -6
  744. data/lib/couchbase/utils/time.rb +52 -0
  745. data/lib/couchbase/version.rb +21 -2
  746. data/lib/couchbase/view_options.rb +4 -94
  747. data/{bin/setup → lib/rails/generators/couchbase/config/config_generator.rb} +12 -9
  748. metadata +227 -346
  749. data/.github/workflows/tests-6.0.3.yml +0 -52
  750. data/.github/workflows/tests-dev-preview.yml +0 -55
  751. data/.github/workflows/tests.yml +0 -50
  752. data/.gitignore +0 -20
  753. data/.gitmodules +0 -21
  754. data/.idea/.gitignore +0 -5
  755. data/.idea/dictionaries/gem_terms.xml +0 -18
  756. data/.idea/inspectionProfiles/Project_Default.xml +0 -8
  757. data/.idea/vcs.xml +0 -13
  758. data/.yardopts +0 -1
  759. data/Rakefile +0 -51
  760. data/bin/fetch-stats +0 -19
  761. data/bin/init-cluster +0 -82
  762. data/bin/jenkins/build-extension +0 -35
  763. data/bin/jenkins/install-dependencies +0 -47
  764. data/bin/jenkins/test-with-cbdyncluster +0 -58
  765. data/couchbase.gemspec +0 -73
  766. data/examples/analytics.rb +0 -221
  767. data/examples/crud.rb +0 -20
  768. data/examples/managing_analytics_indexes.rb +0 -72
  769. data/examples/managing_buckets.rb +0 -47
  770. data/examples/managing_collections.rb +0 -58
  771. data/examples/managing_query_indexes.rb +0 -63
  772. data/examples/managing_search_indexes.rb +0 -62
  773. data/examples/managing_view_indexes.rb +0 -54
  774. data/examples/query.rb +0 -18
  775. data/examples/query_with_consistency.rb +0 -76
  776. data/examples/search.rb +0 -187
  777. data/examples/search_with_consistency.rb +0 -84
  778. data/examples/subdocument.rb +0 -51
  779. data/examples/view.rb +0 -50
  780. data/ext/.clang-format +0 -15
  781. data/ext/.clang-tidy +0 -22
  782. data/ext/.cmake-format.yaml +0 -8
  783. data/ext/.gitignore +0 -2
  784. data/ext/.idea/.name +0 -1
  785. data/ext/.idea/dictionaries/couchbase_terms.xml +0 -14
  786. data/ext/.idea/ext.iml +0 -2
  787. data/ext/.idea/misc.xml +0 -4
  788. data/ext/.idea/modules.xml +0 -8
  789. data/ext/.idea/vcs.xml +0 -12
  790. data/ext/couchbase/configuration_monitor.hxx +0 -93
  791. data/ext/couchbase/operations/command.hxx +0 -163
  792. data/ext/test/main.cxx +0 -58
  793. data/ext/third_party/asio/.appveyor.yml +0 -107
  794. data/ext/third_party/asio/.cirrus.yml +0 -16
  795. data/ext/third_party/asio/.gitignore +0 -3
  796. data/ext/third_party/asio/.travis.yml +0 -323
  797. data/ext/third_party/asio/asio/.gitignore +0 -23
  798. data/ext/third_party/asio/asio/COPYING +0 -4
  799. data/ext/third_party/asio/asio/INSTALL +0 -5
  800. data/ext/third_party/asio/asio/LICENSE_1_0.txt +0 -23
  801. data/ext/third_party/asio/asio/Makefile.am +0 -19
  802. data/ext/third_party/asio/asio/README +0 -4
  803. data/ext/third_party/asio/asio/asio.manifest +0 -4865
  804. data/ext/third_party/asio/asio/autogen.sh +0 -55
  805. data/ext/third_party/asio/asio/boost_asio.manifest +0 -5193
  806. data/ext/third_party/asio/asio/boostify.pl +0 -603
  807. data/ext/third_party/asio/asio/configure.ac +0 -182
  808. data/ext/third_party/asio/asio/include/.gitignore +0 -2
  809. data/ext/third_party/asio/asio/include/Makefile.am +0 -484
  810. data/ext/third_party/asio/asio/include/asio/detail/io_object_executor.hpp +0 -167
  811. data/ext/third_party/asio/asio/include/asio/impl/src.cpp +0 -25
  812. data/ext/third_party/asio/asio/release.pl +0 -440
  813. data/ext/third_party/asio/asio/src/.gitignore +0 -11
  814. data/ext/third_party/asio/asio/src/Makefile.am +0 -23
  815. data/ext/third_party/asio/asio/src/Makefile.mgw +0 -204
  816. data/ext/third_party/asio/asio/src/Makefile.msc +0 -497
  817. data/ext/third_party/asio/asio/src/asio.cpp +0 -11
  818. data/ext/third_party/asio/asio/src/asio_ssl.cpp +0 -11
  819. data/ext/third_party/asio/asio/src/doc/.gitignore +0 -5
  820. data/ext/third_party/asio/asio/src/doc/Jamfile.v2 +0 -62
  821. data/ext/third_party/asio/asio/src/doc/asio.png +0 -0
  822. data/ext/third_party/asio/asio/src/doc/asio.qbk +0 -127
  823. data/ext/third_party/asio/asio/src/doc/asioref.sty +0 -90
  824. data/ext/third_party/asio/asio/src/doc/asioref.xsl +0 -94
  825. data/ext/third_party/asio/asio/src/doc/boost_bind_dox.txt +0 -5
  826. data/ext/third_party/asio/asio/src/doc/doxy2qbk.pl +0 -22
  827. data/ext/third_party/asio/asio/src/doc/examples.qbk +0 -564
  828. data/ext/third_party/asio/asio/src/doc/history.qbk +0 -1794
  829. data/ext/third_party/asio/asio/src/doc/index.xml +0 -13
  830. data/ext/third_party/asio/asio/src/doc/makepdf.pl +0 -26
  831. data/ext/third_party/asio/asio/src/doc/net_ts.qbk +0 -479
  832. data/ext/third_party/asio/asio/src/doc/noncopyable_dox.txt +0 -3
  833. data/ext/third_party/asio/asio/src/doc/overview.qbk +0 -103
  834. data/ext/third_party/asio/asio/src/doc/overview/allocation.qbk +0 -89
  835. data/ext/third_party/asio/asio/src/doc/overview/async.qbk +0 -185
  836. data/ext/third_party/asio/asio/src/doc/overview/async_op1.dot +0 -78
  837. data/ext/third_party/asio/asio/src/doc/overview/async_op1.png +0 -0
  838. data/ext/third_party/asio/asio/src/doc/overview/async_op2.dot +0 -78
  839. data/ext/third_party/asio/asio/src/doc/overview/async_op2.png +0 -0
  840. data/ext/third_party/asio/asio/src/doc/overview/basics.qbk +0 -106
  841. data/ext/third_party/asio/asio/src/doc/overview/bsd_sockets.qbk +0 -270
  842. data/ext/third_party/asio/asio/src/doc/overview/buffers.qbk +0 -163
  843. data/ext/third_party/asio/asio/src/doc/overview/concurrency_hint.qbk +0 -88
  844. data/ext/third_party/asio/asio/src/doc/overview/coroutine.qbk +0 -51
  845. data/ext/third_party/asio/asio/src/doc/overview/coroutines_ts.qbk +0 -97
  846. data/ext/third_party/asio/asio/src/doc/overview/cpp2011.qbk +0 -271
  847. data/ext/third_party/asio/asio/src/doc/overview/handler_tracking.qbk +0 -220
  848. data/ext/third_party/asio/asio/src/doc/overview/implementation.qbk +0 -305
  849. data/ext/third_party/asio/asio/src/doc/overview/iostreams.qbk +0 -72
  850. data/ext/third_party/asio/asio/src/doc/overview/line_based.qbk +0 -118
  851. data/ext/third_party/asio/asio/src/doc/overview/other_protocols.qbk +0 -94
  852. data/ext/third_party/asio/asio/src/doc/overview/posix.qbk +0 -152
  853. data/ext/third_party/asio/asio/src/doc/overview/proactor.dot +0 -100
  854. data/ext/third_party/asio/asio/src/doc/overview/proactor.png +0 -0
  855. data/ext/third_party/asio/asio/src/doc/overview/protocols.qbk +0 -149
  856. data/ext/third_party/asio/asio/src/doc/overview/rationale.qbk +0 -54
  857. data/ext/third_party/asio/asio/src/doc/overview/reactor.qbk +0 -44
  858. data/ext/third_party/asio/asio/src/doc/overview/serial_ports.qbk +0 -45
  859. data/ext/third_party/asio/asio/src/doc/overview/signals.qbk +0 -44
  860. data/ext/third_party/asio/asio/src/doc/overview/spawn.qbk +0 -102
  861. data/ext/third_party/asio/asio/src/doc/overview/ssl.qbk +0 -124
  862. data/ext/third_party/asio/asio/src/doc/overview/strands.qbk +0 -114
  863. data/ext/third_party/asio/asio/src/doc/overview/streams.qbk +0 -62
  864. data/ext/third_party/asio/asio/src/doc/overview/sync_op.dot +0 -67
  865. data/ext/third_party/asio/asio/src/doc/overview/sync_op.png +0 -0
  866. data/ext/third_party/asio/asio/src/doc/overview/threads.qbk +0 -67
  867. data/ext/third_party/asio/asio/src/doc/overview/timers.qbk +0 -52
  868. data/ext/third_party/asio/asio/src/doc/overview/windows.qbk +0 -126
  869. data/ext/third_party/asio/asio/src/doc/project-root.jam +0 -1
  870. data/ext/third_party/asio/asio/src/doc/quickref.xml +0 -561
  871. data/ext/third_party/asio/asio/src/doc/reference.dox +0 -264
  872. data/ext/third_party/asio/asio/src/doc/reference.qbk +0 -125973
  873. data/ext/third_party/asio/asio/src/doc/reference.xsl +0 -1831
  874. data/ext/third_party/asio/asio/src/doc/release_checklist.htm +0 -68
  875. data/ext/third_party/asio/asio/src/doc/requirements/AcceptHandler.qbk +0 -72
  876. data/ext/third_party/asio/asio/src/doc/requirements/AcceptableProtocol.qbk +0 -25
  877. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessReadDevice.qbk +0 -56
  878. data/ext/third_party/asio/asio/src/doc/requirements/AsyncRandomAccessWriteDevice.qbk +0 -57
  879. data/ext/third_party/asio/asio/src/doc/requirements/AsyncReadStream.qbk +0 -50
  880. data/ext/third_party/asio/asio/src/doc/requirements/AsyncWriteStream.qbk +0 -48
  881. data/ext/third_party/asio/asio/src/doc/requirements/BufferedHandshakeHandler.qbk +0 -55
  882. data/ext/third_party/asio/asio/src/doc/requirements/CompletionCondition.qbk +0 -42
  883. data/ext/third_party/asio/asio/src/doc/requirements/CompletionHandler.qbk +0 -63
  884. data/ext/third_party/asio/asio/src/doc/requirements/ConnectCondition.qbk +0 -34
  885. data/ext/third_party/asio/asio/src/doc/requirements/ConnectHandler.qbk +0 -72
  886. data/ext/third_party/asio/asio/src/doc/requirements/ConstBufferSequence.qbk +0 -53
  887. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer.qbk +0 -16
  888. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v1.qbk +0 -93
  889. data/ext/third_party/asio/asio/src/doc/requirements/DynamicBuffer_v2.qbk +0 -94
  890. data/ext/third_party/asio/asio/src/doc/requirements/Endpoint.qbk +0 -97
  891. data/ext/third_party/asio/asio/src/doc/requirements/EndpointSequence.qbk +0 -30
  892. data/ext/third_party/asio/asio/src/doc/requirements/ExecutionContext.qbk +0 -36
  893. data/ext/third_party/asio/asio/src/doc/requirements/Executor.qbk +0 -141
  894. data/ext/third_party/asio/asio/src/doc/requirements/GettableSerialPortOption.qbk +0 -33
  895. data/ext/third_party/asio/asio/src/doc/requirements/GettableSocketOption.qbk +0 -67
  896. data/ext/third_party/asio/asio/src/doc/requirements/Handler.qbk +0 -64
  897. data/ext/third_party/asio/asio/src/doc/requirements/HandshakeHandler.qbk +0 -72
  898. data/ext/third_party/asio/asio/src/doc/requirements/InternetProtocol.qbk +0 -47
  899. data/ext/third_party/asio/asio/src/doc/requirements/IoControlCommand.qbk +0 -34
  900. data/ext/third_party/asio/asio/src/doc/requirements/IoObjectService.qbk +0 -62
  901. data/ext/third_party/asio/asio/src/doc/requirements/IteratorConnectHandler.qbk +0 -81
  902. data/ext/third_party/asio/asio/src/doc/requirements/LegacyCompletionHandler.qbk +0 -65
  903. data/ext/third_party/asio/asio/src/doc/requirements/MoveAcceptHandler.qbk +0 -61
  904. data/ext/third_party/asio/asio/src/doc/requirements/MutableBufferSequence.qbk +0 -54
  905. data/ext/third_party/asio/asio/src/doc/requirements/ProtoAllocator.qbk +0 -19
  906. data/ext/third_party/asio/asio/src/doc/requirements/Protocol.qbk +0 -56
  907. data/ext/third_party/asio/asio/src/doc/requirements/RangeConnectHandler.qbk +0 -82
  908. data/ext/third_party/asio/asio/src/doc/requirements/ReadHandler.qbk +0 -79
  909. data/ext/third_party/asio/asio/src/doc/requirements/ResolveHandler.qbk +0 -82
  910. data/ext/third_party/asio/asio/src/doc/requirements/Service.qbk +0 -40
  911. data/ext/third_party/asio/asio/src/doc/requirements/SettableSerialPortOption.qbk +0 -33
  912. data/ext/third_party/asio/asio/src/doc/requirements/SettableSocketOption.qbk +0 -54
  913. data/ext/third_party/asio/asio/src/doc/requirements/ShutdownHandler.qbk +0 -72
  914. data/ext/third_party/asio/asio/src/doc/requirements/SignalHandler.qbk +0 -79
  915. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessReadDevice.qbk +0 -49
  916. data/ext/third_party/asio/asio/src/doc/requirements/SyncRandomAccessWriteDevice.qbk +0 -49
  917. data/ext/third_party/asio/asio/src/doc/requirements/SyncReadStream.qbk +0 -41
  918. data/ext/third_party/asio/asio/src/doc/requirements/SyncWriteStream.qbk +0 -39
  919. data/ext/third_party/asio/asio/src/doc/requirements/TimeTraits.qbk +0 -72
  920. data/ext/third_party/asio/asio/src/doc/requirements/WaitHandler.qbk +0 -72
  921. data/ext/third_party/asio/asio/src/doc/requirements/WaitTraits.qbk +0 -52
  922. data/ext/third_party/asio/asio/src/doc/requirements/WriteHandler.qbk +0 -79
  923. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_operations.qbk +0 -300
  924. data/ext/third_party/asio/asio/src/doc/requirements/asynchronous_socket_operations.qbk +0 -39
  925. data/ext/third_party/asio/asio/src/doc/requirements/read_write_operations.qbk +0 -34
  926. data/ext/third_party/asio/asio/src/doc/requirements/synchronous_socket_operations.qbk +0 -37
  927. data/ext/third_party/asio/asio/src/doc/std_exception_dox.txt +0 -7
  928. data/ext/third_party/asio/asio/src/doc/tutorial.dox +0 -226
  929. data/ext/third_party/asio/asio/src/doc/tutorial.qbk +0 -2387
  930. data/ext/third_party/asio/asio/src/doc/tutorial.xsl +0 -437
  931. data/ext/third_party/asio/asio/src/doc/using.qbk +0 -309
  932. data/ext/third_party/asio/asio/tsify.pl +0 -574
  933. data/ext/third_party/gsl/.clang-format +0 -34
  934. data/ext/third_party/gsl/.github/workflows/main.yml +0 -94
  935. data/ext/third_party/gsl/.gitignore +0 -16
  936. data/ext/third_party/gsl/.travis.yml +0 -551
  937. data/ext/third_party/gsl/CMakeSettings.json +0 -18
  938. data/ext/third_party/gsl/CONTRIBUTING.md +0 -29
  939. data/ext/third_party/gsl/GSL.natvis +0 -98
  940. data/ext/third_party/gsl/README.md +0 -124
  941. data/ext/third_party/gsl/appveyor.yml +0 -128
  942. data/ext/third_party/http_parser/.gitignore +0 -30
  943. data/ext/third_party/http_parser/.mailmap +0 -8
  944. data/ext/third_party/http_parser/.travis.yml +0 -13
  945. data/ext/third_party/http_parser/AUTHORS +0 -68
  946. data/ext/third_party/http_parser/README.md +0 -246
  947. data/ext/third_party/http_parser/bench.c +0 -128
  948. data/ext/third_party/http_parser/http_parser.gyp +0 -111
  949. data/ext/third_party/http_parser/test.c +0 -4600
  950. data/ext/third_party/json/.appveyor.yml +0 -44
  951. data/ext/third_party/json/.clang-format +0 -84
  952. data/ext/third_party/json/.conan/build.py +0 -80
  953. data/ext/third_party/json/.conan/test_package/CMakeLists.txt +0 -12
  954. data/ext/third_party/json/.conan/test_package/conanfile.py +0 -24
  955. data/ext/third_party/json/.conan/test_package/test_package.cpp +0 -16
  956. data/ext/third_party/json/.gitignore +0 -3
  957. data/ext/third_party/json/.travis.yml +0 -173
  958. data/ext/third_party/json/README.md +0 -149
  959. data/ext/third_party/json/conanfile.py +0 -28
  960. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/analyze_cycles.hpp +0 -127
  961. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/counted.hpp +0 -23
  962. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/generic.hpp +0 -31
  963. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/grammar_info.hpp +0 -32
  964. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_guard.hpp +0 -51
  965. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/insert_rules.hpp +0 -25
  966. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_info.hpp +0 -29
  967. data/ext/third_party/json/include/tao/json/external/pegtl/analysis/rule_type.hpp +0 -21
  968. data/ext/third_party/json/include/tao/json/external/pegtl/analyze.hpp +0 -21
  969. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/counter.hpp +0 -54
  970. data/ext/third_party/json/include/tao/json/external/pegtl/contrib/tracer.hpp +0 -158
  971. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alnum.hpp +0 -18
  972. data/ext/third_party/json/include/tao/json/external/pegtl/internal/alpha.hpp +0 -18
  973. data/ext/third_party/json/include/tao/json/external/pegtl/internal/dusel_mode.hpp +0 -23
  974. data/ext/third_party/json/include/tao/json/external/pegtl/internal/duseltronik.hpp +0 -187
  975. data/ext/third_party/json/include/tao/json/external/pegtl/internal/file_opener.hpp +0 -72
  976. data/ext/third_party/json/include/tao/json/external/pegtl/internal/trivial.hpp +0 -32
  977. data/ext/third_party/snappy/.appveyor.yml +0 -36
  978. data/ext/third_party/snappy/.gitignore +0 -8
  979. data/ext/third_party/snappy/.travis.yml +0 -98
  980. data/ext/third_party/snappy/AUTHORS +0 -1
  981. data/ext/third_party/snappy/CONTRIBUTING.md +0 -26
  982. data/ext/third_party/snappy/NEWS +0 -188
  983. data/ext/third_party/snappy/README.md +0 -148
  984. data/ext/third_party/snappy/docs/README.md +0 -72
  985. data/ext/third_party/snappy/format_description.txt +0 -110
  986. data/ext/third_party/snappy/framing_format.txt +0 -135
  987. data/ext/third_party/snappy/snappy-test.cc +0 -613
  988. data/ext/third_party/snappy/snappy-test.h +0 -526
  989. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +0 -60
  990. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +0 -58
  991. data/ext/third_party/snappy/snappy_unittest.cc +0 -1512
  992. data/ext/third_party/spdlog/.clang-format +0 -108
  993. data/ext/third_party/spdlog/.clang-tidy +0 -54
  994. data/ext/third_party/spdlog/.gitattributes +0 -1
  995. data/ext/third_party/spdlog/.gitignore +0 -83
  996. data/ext/third_party/spdlog/.travis.yml +0 -112
  997. data/ext/third_party/spdlog/INSTALL +0 -24
  998. data/ext/third_party/spdlog/README.md +0 -423
  999. data/ext/third_party/spdlog/appveyor.yml +0 -51
  1000. data/ext/third_party/spdlog/include/spdlog/cfg/log_levels.h +0 -47
  1001. data/rbi/couchbase.rbi +0 -79
@@ -0,0 +1,37 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <vector>
21
+ #include <configuration.hxx>
22
+ #include <protocol/hello_feature.hxx>
23
+
24
+ namespace couchbase
25
+ {
26
+
27
+ struct mcbp_context {
28
+ const std::optional<configuration>& config;
29
+ const std::vector<protocol::hello_feature>& supported_features;
30
+
31
+ [[nodiscard]] bool supports_feature(protocol::hello_feature feature)
32
+ {
33
+ return std::find(supported_features.begin(), supported_features.end(), feature) != supported_features.end();
34
+ }
35
+ };
36
+
37
+ } // namespace couchbase
@@ -41,6 +41,11 @@ struct binary_header {
41
41
  std::uint32_t bodylen;
42
42
  std::uint32_t opaque;
43
43
  std::uint64_t cas;
44
+
45
+ std::uint16_t status()
46
+ {
47
+ return htons(specific);
48
+ }
44
49
  };
45
50
 
46
51
  struct mcbp_message {
@@ -27,6 +27,9 @@
27
27
 
28
28
  #include <io/mcbp_message.hxx>
29
29
  #include <io/mcbp_parser.hxx>
30
+ #include <io/streams.hxx>
31
+ #include <io/retry_orchestrator.hxx>
32
+ #include <io/mcbp_context.hxx>
30
33
 
31
34
  #include <timeout_defaults.hxx>
32
35
 
@@ -34,6 +37,7 @@
34
37
  #include <protocol/client_request.hxx>
35
38
  #include <protocol/client_response.hxx>
36
39
  #include <protocol/server_request.hxx>
40
+ #include <protocol/cmd_noop.hxx>
37
41
  #include <protocol/cmd_hello.hxx>
38
42
  #include <protocol/cmd_sasl_list_mechs.hxx>
39
43
  #include <protocol/cmd_sasl_auth.hxx>
@@ -48,8 +52,10 @@
48
52
 
49
53
  #include <spdlog/fmt/bin_to_hex.h>
50
54
 
55
+ #include <origin.hxx>
51
56
  #include <errors.hxx>
52
57
  #include <version.hxx>
58
+ #include <diagnostics.hxx>
53
59
 
54
60
  namespace couchbase::io
55
61
  {
@@ -118,15 +124,13 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
118
124
 
119
125
  explicit bootstrap_handler(std::shared_ptr<mcbp_session> session)
120
126
  : session_(session)
121
- , sasl_([this]() -> std::string { return session_->username_; },
122
- [this]() -> std::string { return session_->password_; },
123
- { "SCRAM-SHA512", "SCRAM-SHA256", "SCRAM-SHA1", "PLAIN" })
127
+ , sasl_([origin = session_->origin_]() -> std::string { return origin.username(); },
128
+ [origin = session_->origin_]() -> std::string { return origin.password(); },
129
+ session_->origin_.credentials().allowed_sasl_mechanisms)
124
130
  {
125
131
  tao::json::value user_agent{
126
- { "a",
127
- fmt::format(
128
- "ruby/{}.{}.{}/{}", BACKEND_VERSION_MAJOR, BACKEND_VERSION_MINOR, BACKEND_VERSION_PATCH, BACKEND_GIT_REVISION) },
129
- { "i", fmt::format("{}/{}", session_->client_id_, session_->id_) }
132
+ { "a", couchbase::sdk_id() },
133
+ { "i", fmt::format("{}/{}", session_->client_id_, session_->id_) },
130
134
  };
131
135
  protocol::client_request<protocol::hello_request_body> hello_req;
132
136
  hello_req.opaque(session_->next_opaque());
@@ -137,28 +141,28 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
137
141
  fmt::join(hello_req.body().features(), ", "));
138
142
  session_->write(hello_req.data());
139
143
 
140
- protocol::client_request<protocol::sasl_list_mechs_request_body> list_req;
141
- list_req.opaque(session_->next_opaque());
142
- session_->write(list_req.data());
143
-
144
- protocol::client_request<protocol::sasl_auth_request_body> auth_req;
145
- sasl::error sasl_code;
146
- std::string_view sasl_payload;
147
- std::tie(sasl_code, sasl_payload) = sasl_.start();
148
- auth_req.opaque(session_->next_opaque());
149
- auth_req.body().mechanism(sasl_.get_name());
150
- auth_req.body().sasl_data(sasl_payload);
151
- session_->write(auth_req.data());
144
+ if (!session->origin_.credentials().uses_certificate()) {
145
+ protocol::client_request<protocol::sasl_list_mechs_request_body> list_req;
146
+ list_req.opaque(session_->next_opaque());
147
+ session_->write(list_req.data());
148
+
149
+ protocol::client_request<protocol::sasl_auth_request_body> auth_req;
150
+ sasl::error sasl_code;
151
+ std::string_view sasl_payload;
152
+ std::tie(sasl_code, sasl_payload) = sasl_.start();
153
+ auth_req.opaque(session_->next_opaque());
154
+ auth_req.body().mechanism(sasl_.get_name());
155
+ auth_req.body().sasl_data(sasl_payload);
156
+ session_->write(auth_req.data());
157
+ }
152
158
 
153
159
  session_->flush();
154
160
  }
155
161
 
156
162
  void complete(std::error_code ec)
157
163
  {
164
+ stopped_ = true;
158
165
  session_->invoke_bootstrap_handler(ec);
159
- if (!ec) {
160
- session_->handler_ = std::make_unique<normal_handler>(session_);
161
- }
162
166
  }
163
167
 
164
168
  void auth_success()
@@ -194,15 +198,25 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
194
198
  if (resp.status() == protocol::status::success) {
195
199
  session_->supported_features_ = resp.body().supported_features();
196
200
  spdlog::debug("{} supported_features=[{}]", session_->log_prefix_, fmt::join(session_->supported_features_, ", "));
201
+ if (session_->origin_.credentials().uses_certificate()) {
202
+ spdlog::debug("{} skip SASL authentication, because TLS certificate was specified", session_->log_prefix_);
203
+ return auth_success();
204
+ }
197
205
  } else {
198
- spdlog::warn("{} unexpected message status during bootstrap: {}", session_->log_prefix_, resp.error_message());
206
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opaque={})",
207
+ session_->log_prefix_,
208
+ resp.error_message(),
209
+ resp.opaque());
199
210
  return complete(std::make_error_code(error::network_errc::handshake_failure));
200
211
  }
201
212
  } break;
202
213
  case protocol::client_opcode::sasl_list_mechs: {
203
214
  protocol::client_response<protocol::sasl_list_mechs_response_body> resp(msg);
204
215
  if (resp.status() != protocol::status::success) {
205
- spdlog::warn("{} unexpected message status during bootstrap: {}", session_->log_prefix_, resp.error_message());
216
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opaque={})",
217
+ session_->log_prefix_,
218
+ resp.error_message(),
219
+ resp.opaque());
206
220
  return complete(std::make_error_code(error::common_errc::authentication_failure));
207
221
  }
208
222
  } break;
@@ -225,14 +239,15 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
225
239
  req.body().sasl_data(sasl_payload);
226
240
  session_->write_and_flush(req.data());
227
241
  } else {
228
- spdlog::error("{} unable to authenticate: sasl_code={}", session_->log_prefix_, sasl_code);
242
+ spdlog::error(
243
+ "{} unable to authenticate: (sasl_code={}, opaque={})", session_->log_prefix_, sasl_code, resp.opaque());
229
244
  return complete(std::make_error_code(error::common_errc::authentication_failure));
230
245
  }
231
246
  } else {
232
- spdlog::warn("{} unexpected message status during bootstrap: {} (opcode={})",
247
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opaque={})",
233
248
  session_->log_prefix_,
234
249
  resp.error_message(),
235
- opcode);
250
+ resp.opaque());
236
251
  return complete(std::make_error_code(error::common_errc::authentication_failure));
237
252
  }
238
253
  } break;
@@ -246,12 +261,13 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
246
261
  case protocol::client_opcode::get_error_map: {
247
262
  protocol::client_response<protocol::get_error_map_response_body> resp(msg);
248
263
  if (resp.status() == protocol::status::success) {
249
- session_->errmap_.emplace(resp.body().errmap());
264
+ session_->error_map_.emplace(resp.body().errmap());
250
265
  } else {
251
- spdlog::warn("{} unexpected message status during bootstrap: {} (opcode={})",
266
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opaque={}, {:n})",
252
267
  session_->log_prefix_,
253
268
  resp.error_message(),
254
- opcode);
269
+ resp.opaque(),
270
+ spdlog::to_hex(msg.header_data()));
255
271
  return complete(std::make_error_code(error::network_errc::protocol_error));
256
272
  }
257
273
  } break;
@@ -260,6 +276,13 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
260
276
  if (resp.status() == protocol::status::success) {
261
277
  spdlog::debug("{} selected bucket: {}", session_->log_prefix_, session_->bucket_name_.value_or(""));
262
278
  session_->bucket_selected_ = true;
279
+ } else if (resp.status() == protocol::status::not_found) {
280
+ spdlog::debug("{} kv_engine node does not have configuration propagated yet (opcode={}, status={}, opaque={})",
281
+ session_->log_prefix_,
282
+ opcode,
283
+ resp.status(),
284
+ resp.opaque());
285
+ return complete(std::make_error_code(error::network_errc::configuration_not_available));
263
286
  } else if (resp.status() == protocol::status::no_access) {
264
287
  spdlog::debug("{} unable to select bucket: {}, probably the bucket does not exist",
265
288
  session_->log_prefix_,
@@ -267,7 +290,11 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
267
290
  session_->bucket_selected_ = false;
268
291
  return complete(std::make_error_code(error::common_errc::bucket_not_found));
269
292
  } else {
270
- spdlog::warn("{} unexpected message status during bootstrap: {}", session_->log_prefix_, resp.error_message());
293
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opaque={}, {:n})",
294
+ session_->log_prefix_,
295
+ resp.error_message(),
296
+ resp.opaque(),
297
+ spdlog::to_hex(msg.header_data()));
271
298
  return complete(std::make_error_code(error::common_errc::bucket_not_found));
272
299
  }
273
300
  } break;
@@ -276,19 +303,27 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
276
303
  if (resp.status() == protocol::status::success) {
277
304
  session_->update_configuration(resp.body().config());
278
305
  complete({});
306
+ } else if (resp.status() == protocol::status::not_found) {
307
+ spdlog::debug("{} kv_engine node does not have configuration propagated yet (opcode={}, status={}, opaque={})",
308
+ session_->log_prefix_,
309
+ opcode,
310
+ resp.status(),
311
+ resp.opaque());
312
+ return complete(std::make_error_code(error::network_errc::configuration_not_available));
279
313
  } else if (resp.status() == protocol::status::no_bucket && !session_->bucket_name_) {
280
314
  // bucket-less session, but the server wants bucket
281
315
  session_->supports_gcccp_ = false;
282
316
  spdlog::warn("{} this server does not support GCCCP, open bucket before making any cluster-level command",
283
317
  session_->log_prefix_);
284
318
  session_->update_configuration(
285
- make_blank_configuration(session_->endpoint_.address().to_string(), session_->endpoint_.port(), 0));
319
+ make_blank_configuration(session_->endpoint_address_, session_->endpoint_.port(), 0));
286
320
  complete({});
287
321
  } else {
288
- spdlog::warn("{} unexpected message status during bootstrap: {} (opcode={})",
322
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opaque={}, {:n})",
289
323
  session_->log_prefix_,
290
324
  resp.error_message(),
291
- opcode);
325
+ resp.opaque(),
326
+ spdlog::to_hex(msg.header_data()));
292
327
  return complete(std::make_error_code(error::network_errc::protocol_error));
293
328
  }
294
329
  } break;
@@ -346,9 +381,14 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
346
381
  session_->update_configuration(resp.body().config());
347
382
  }
348
383
  } else {
349
- spdlog::warn("{} unexpected message status: {}", session_->log_prefix_, resp.error_message());
384
+ spdlog::warn("{} unexpected message status: {} (opaque={})",
385
+ session_->log_prefix_,
386
+ resp.error_message(),
387
+ resp.opaque());
350
388
  }
351
389
  } break;
390
+ case protocol::client_opcode::noop:
391
+ case protocol::client_opcode::get_collections_manifest:
352
392
  case protocol::client_opcode::get_collection_id:
353
393
  case protocol::client_opcode::get:
354
394
  case protocol::client_opcode::get_and_lock:
@@ -357,6 +397,8 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
357
397
  case protocol::client_opcode::insert:
358
398
  case protocol::client_opcode::replace:
359
399
  case protocol::client_opcode::upsert:
400
+ case protocol::client_opcode::append:
401
+ case protocol::client_opcode::prepend:
360
402
  case protocol::client_opcode::remove:
361
403
  case protocol::client_opcode::observe:
362
404
  case protocol::client_opcode::unlock:
@@ -366,25 +408,36 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
366
408
  case protocol::client_opcode::subdoc_multi_mutation: {
367
409
  std::uint32_t opaque = msg.header.opaque;
368
410
  std::uint16_t status = ntohs(msg.header.specific);
411
+ session_->command_handlers_mutex_.lock();
369
412
  auto handler = session_->command_handlers_.find(opaque);
370
- if (handler != session_->command_handlers_.end()) {
413
+ if (handler != session_->command_handlers_.end() && handler->second) {
371
414
  auto ec = session_->map_status_code(opcode, status);
372
- spdlog::debug("{} MCBP invoke operation handler, opaque={}, status={}, ec={}",
415
+ spdlog::trace("{} MCBP invoke operation handler: opcode={}, opaque={}, status={}, ec={}",
373
416
  session_->log_prefix_,
417
+ opcode,
374
418
  opaque,
375
- status,
419
+ protocol::status_to_string(status),
376
420
  ec.message());
377
- handler->second(ec, std::move(msg));
421
+ auto fun = std::move(handler->second);
378
422
  session_->command_handlers_.erase(handler);
423
+ session_->command_handlers_mutex_.unlock();
424
+ fun(ec, retry_reason::do_not_retry, std::move(msg));
379
425
  } else {
380
- spdlog::debug("{} unexpected orphan response opcode={}, opaque={}",
426
+ session_->command_handlers_mutex_.unlock();
427
+ spdlog::debug("{} unexpected orphan response: opcode={}, opaque={}, status={}",
381
428
  session_->log_prefix_,
382
- msg.header.opcode,
383
- msg.header.opaque);
429
+ opcode,
430
+ msg.header.opaque,
431
+ protocol::status_to_string(status));
384
432
  }
385
433
  } break;
386
434
  default:
387
- spdlog::warn("{} unexpected client response: {}", session_->log_prefix_, opcode);
435
+ spdlog::warn("{} unexpected client response: opcode={}, opaque={}{:a}{:a})",
436
+ session_->log_prefix_,
437
+ opcode,
438
+ msg.header.opaque,
439
+ spdlog::to_hex(msg.header_data()),
440
+ spdlog::to_hex(msg.body));
388
441
  }
389
442
  break;
390
443
  case protocol::magic::server_request:
@@ -392,33 +445,41 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
392
445
  switch (auto opcode = static_cast<protocol::server_opcode>(msg.header.opcode)) {
393
446
  case protocol::server_opcode::cluster_map_change_notification: {
394
447
  protocol::server_request<protocol::cluster_map_change_notification_request_body> req(msg);
395
- if (session_) {
396
- if ((!req.body().config().bucket.has_value() && req.body().bucket().empty()) ||
448
+ std::optional<configuration> config = req.body().config();
449
+ if (session_ && config.has_value()) {
450
+ if ((!config->bucket.has_value() && req.body().bucket().empty()) ||
397
451
  (session_->bucket_name_.has_value() && !req.body().bucket().empty() &&
398
452
  session_->bucket_name_.value() == req.body().bucket())) {
399
- session_->update_configuration(req.body().config());
453
+ session_->update_configuration(std::move(config.value()));
400
454
  }
401
455
  }
402
456
  } break;
403
457
  default:
404
- spdlog::warn("{} unexpected server request: {}", session_->log_prefix_, opcode);
458
+ spdlog::warn("{} unexpected server request: opcode={:x}, opaque={}{:a}{:a}",
459
+ session_->log_prefix_,
460
+ opcode,
461
+ msg.header.opaque,
462
+ spdlog::to_hex(msg.header_data()),
463
+ spdlog::to_hex(msg.body));
405
464
  }
406
465
  break;
407
466
  case protocol::magic::client_request:
408
467
  case protocol::magic::alt_client_request:
409
468
  case protocol::magic::server_response:
410
- spdlog::warn(
411
- "{} unexpected magic: {}, opcode={}, opaque={}", session_->log_prefix_, magic, msg.header.opcode, msg.header.opaque);
469
+ spdlog::warn("{} unexpected magic: {} (opcode={:x}, opaque={}){:a}{:a}",
470
+ session_->log_prefix_,
471
+ magic,
472
+ msg.header.opcode,
473
+ msg.header.opaque,
474
+ spdlog::to_hex(msg.header_data()),
475
+ spdlog::to_hex(msg.body));
412
476
  break;
413
477
  }
414
478
  }
415
479
 
416
480
  void fetch_config(std::error_code ec)
417
481
  {
418
- if (ec == asio::error::operation_aborted) {
419
- return;
420
- }
421
- if (stopped_ || !session_) {
482
+ if (ec == asio::error::operation_aborted || stopped_ || !session_) {
422
483
  return;
423
484
  }
424
485
  protocol::client_request<protocol::get_cluster_config_request_body> req;
@@ -430,39 +491,177 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
430
491
  };
431
492
 
432
493
  public:
494
+ mcbp_session() = delete;
433
495
  mcbp_session(const std::string& client_id,
434
496
  asio::io_context& ctx,
497
+ const couchbase::origin& origin,
435
498
  std::optional<std::string> bucket_name = {},
436
499
  std::vector<protocol::hello_feature> known_features = {})
437
500
  : client_id_(client_id)
438
501
  , id_(uuid::to_string(uuid::random()))
439
502
  , ctx_(ctx)
440
503
  , resolver_(ctx_)
441
- , strand_(asio::make_strand(ctx_))
442
- , socket_(strand_)
443
- , deadline_timer_(ctx_)
504
+ , stream_(std::make_unique<plain_stream_impl>(ctx_))
505
+ , bootstrap_deadline_(ctx_)
506
+ , connection_deadline_(ctx_)
507
+ , retry_backoff_(ctx_)
508
+ , origin_(origin)
444
509
  , bucket_name_(std::move(bucket_name))
445
510
  , supported_features_(known_features)
446
511
  {
447
- log_prefix_ = fmt::format("[{}/{}/{}]", client_id_, id_, bucket_name_.value_or("-"));
512
+ log_prefix_ = fmt::format("[{}/{}/{}/{}]", client_id_, id_, stream_->log_prefix(), bucket_name_.value_or("-"));
513
+ }
514
+
515
+ mcbp_session(const std::string& client_id,
516
+ asio::io_context& ctx,
517
+ asio::ssl::context& tls,
518
+ const couchbase::origin& origin,
519
+ std::optional<std::string> bucket_name = {},
520
+ std::vector<protocol::hello_feature> known_features = {})
521
+ : client_id_(client_id)
522
+ , id_(uuid::to_string(uuid::random()))
523
+ , ctx_(ctx)
524
+ , resolver_(ctx_)
525
+ , stream_(std::make_unique<tls_stream_impl>(ctx_, tls))
526
+ , bootstrap_deadline_(ctx_)
527
+ , connection_deadline_(ctx_)
528
+ , retry_backoff_(ctx_)
529
+ , origin_(origin)
530
+ , bucket_name_(std::move(bucket_name))
531
+ , supported_features_(known_features)
532
+ {
533
+ log_prefix_ = fmt::format("[{}/{}/{}/{}]", client_id_, id_, stream_->log_prefix(), bucket_name_.value_or("-"));
448
534
  }
449
535
 
450
536
  ~mcbp_session()
451
537
  {
452
- stop();
538
+ stop(retry_reason::do_not_retry);
539
+ }
540
+
541
+ [[nodiscard]] const std::string& log_prefix() const
542
+ {
543
+ return log_prefix_;
453
544
  }
454
545
 
455
- void bootstrap(const std::string& hostname,
456
- const std::string& service,
457
- const std::string& username,
458
- const std::string& password,
459
- std::function<void(std::error_code, configuration)>&& handler)
546
+ std::string remote_address() const
460
547
  {
461
- username_ = username;
462
- password_ = password;
548
+ if (endpoint_.protocol() == asio::ip::tcp::v6()) {
549
+ return fmt::format("[{}]:{}", endpoint_address_, endpoint_.port());
550
+ }
551
+ return fmt::format("{}:{}", endpoint_address_, endpoint_.port());
552
+ }
553
+
554
+ std::string local_address() const
555
+ {
556
+ if (endpoint_.protocol() == asio::ip::tcp::v6()) {
557
+ return fmt::format("[{}]:{}", local_endpoint_address_, local_endpoint_.port());
558
+ }
559
+ return fmt::format("{}:{}", local_endpoint_address_, local_endpoint_.port());
560
+ }
561
+
562
+ [[nodiscard]] diag::endpoint_diag_info diag_info() const
563
+ {
564
+ return { service_type::kv,
565
+ id_,
566
+ last_active_.time_since_epoch().count() == 0 ? std::nullopt
567
+ : std::make_optional(std::chrono::duration_cast<std::chrono::microseconds>(
568
+ std::chrono::steady_clock::now() - last_active_)),
569
+ remote_address(),
570
+ local_address(),
571
+ state_,
572
+ bucket_name_ };
573
+ }
574
+
575
+ template<typename Handler>
576
+ void ping(Handler&& handler)
577
+ {
578
+ protocol::client_request<protocol::mcbp_noop_request_body> req;
579
+ req.opaque(next_opaque());
580
+ write_and_subscribe(req.opaque(),
581
+ req.data(false),
582
+ [start = std::chrono::steady_clock::now(), self = shared_from_this(), handler](
583
+ std::error_code ec, retry_reason reason, io::mcbp_message&& /* msg */) {
584
+ diag::ping_state state = diag::ping_state::ok;
585
+ std::optional<std::string> error{};
586
+ if (ec) {
587
+ state = diag::ping_state::error;
588
+ error.emplace(fmt::format("code={}, message={}, reason={}", ec.value(), ec.message(), reason));
589
+ }
590
+ handler(diag::endpoint_ping_info{
591
+ service_type::kv,
592
+ self->id_,
593
+ std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - start),
594
+ self->remote_address(),
595
+ self->local_address(),
596
+ state,
597
+ self->bucket_name_,
598
+ error });
599
+ });
600
+ }
601
+
602
+ [[nodiscard]] mcbp_context context() const
603
+ {
604
+ return { config_, supported_features_ };
605
+ }
606
+
607
+ void bootstrap(std::function<void(std::error_code, configuration)>&& handler, bool retry_on_bucket_not_found = false)
608
+ {
609
+ retry_bootstrap_on_bucket_not_found_ = retry_on_bucket_not_found;
463
610
  bootstrap_handler_ = std::move(handler);
464
- resolver_.async_resolve(
465
- hostname, service, std::bind(&mcbp_session::on_resolve, this, std::placeholders::_1, std::placeholders::_2));
611
+ bootstrap_deadline_.expires_after(timeout_defaults::bootstrap_timeout);
612
+ bootstrap_deadline_.async_wait([self = shared_from_this()](std::error_code ec) {
613
+ if (ec == asio::error::operation_aborted || self->stopped_) {
614
+ return;
615
+ }
616
+ spdlog::warn("{} unable to bootstrap in time", self->log_prefix_);
617
+ self->bootstrap_handler_(std::make_error_code(error::common_errc::unambiguous_timeout), {});
618
+ self->bootstrap_handler_ = nullptr;
619
+ self->stop(retry_reason::socket_closed_while_in_flight);
620
+ });
621
+ initiate_bootstrap();
622
+ }
623
+
624
+ void initiate_bootstrap()
625
+ {
626
+ if (stopped_) {
627
+ return;
628
+ }
629
+ state_ = diag::endpoint_state::connecting;
630
+ if (stream_->is_open()) {
631
+ std::string old_id = stream_->id();
632
+ stream_->reopen();
633
+ spdlog::trace(R"({} reopen socket connection "{}" -> "{}", host="{}", port={})",
634
+ log_prefix_,
635
+ old_id,
636
+ stream_->id(),
637
+ bootstrap_hostname_,
638
+ bootstrap_port_);
639
+ }
640
+ if (origin_.exhausted()) {
641
+ auto backoff = std::chrono::milliseconds(500);
642
+ spdlog::debug("{} reached the end of list of bootstrap nodes, waiting for {}ms before restart", log_prefix_, backoff.count());
643
+ retry_backoff_.expires_after(backoff);
644
+ retry_backoff_.async_wait([self = shared_from_this()](std::error_code ec) mutable {
645
+ if (ec == asio::error::operation_aborted || self->stopped_) {
646
+ return;
647
+ }
648
+ self->origin_.restart();
649
+ self->initiate_bootstrap();
650
+ });
651
+ return;
652
+ }
653
+ std::tie(bootstrap_hostname_, bootstrap_port_) = origin_.next_address();
654
+ log_prefix_ = fmt::format("[{}/{}/{}/{}] <{}:{}>",
655
+ client_id_,
656
+ id_,
657
+ stream_->log_prefix(),
658
+ bucket_name_.value_or("-"),
659
+ bootstrap_hostname_,
660
+ bootstrap_port_);
661
+ spdlog::debug("{} attempt to establish MCBP connection", log_prefix_);
662
+ resolver_.async_resolve(bootstrap_hostname_,
663
+ bootstrap_port_,
664
+ std::bind(&mcbp_session::on_resolve, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
466
665
  }
467
666
 
468
667
  [[nodiscard]] const std::string& id() const
@@ -470,20 +669,57 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
470
669
  return id_;
471
670
  }
472
671
 
473
- void stop()
672
+ [[nodiscard]] bool is_stopped() const
673
+ {
674
+ return stopped_;
675
+ }
676
+
677
+ void on_stop(std::function<void(io::retry_reason)> handler)
678
+ {
679
+ on_stop_handler_ = std::move(handler);
680
+ }
681
+
682
+ void stop(retry_reason reason)
474
683
  {
475
684
  if (stopped_) {
476
685
  return;
477
686
  }
687
+ state_ = diag::endpoint_state::disconnecting;
688
+ spdlog::debug("{} stop MCBP connection, reason={}", log_prefix_, reason);
478
689
  stopped_ = true;
479
- deadline_timer_.cancel();
690
+ bootstrap_deadline_.cancel();
691
+ connection_deadline_.cancel();
692
+ retry_backoff_.cancel();
480
693
  resolver_.cancel();
481
- if (socket_.is_open()) {
482
- socket_.close();
694
+ if (stream_->is_open()) {
695
+ stream_->close();
696
+ }
697
+ auto ec = std::make_error_code(error::common_errc::request_canceled);
698
+ if (!bootstrapped_ && bootstrap_handler_) {
699
+ bootstrap_handler_(ec, {});
700
+ bootstrap_handler_ = nullptr;
483
701
  }
484
702
  if (handler_) {
485
703
  handler_->stop();
486
704
  }
705
+ {
706
+ std::scoped_lock lock(command_handlers_mutex_);
707
+ for (auto& handler : command_handlers_) {
708
+ if (handler.second) {
709
+ spdlog::debug(
710
+ "{} MCBP cancel operation during session close, opaque={}, ec={}", log_prefix_, handler.first, ec.message());
711
+ auto fun = std::move(handler.second);
712
+ fun(ec, reason, {});
713
+ }
714
+ }
715
+ command_handlers_.clear();
716
+ }
717
+ config_listeners_.clear();
718
+ if (on_stop_handler_) {
719
+ on_stop_handler_(reason);
720
+ }
721
+ on_stop_handler_ = nullptr;
722
+ state_ = diag::endpoint_state::disconnected;
487
723
  }
488
724
 
489
725
  void write(const std::vector<uint8_t>& buf)
@@ -491,6 +727,11 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
491
727
  if (stopped_) {
492
728
  return;
493
729
  }
730
+ std::uint32_t opaque{ 0 };
731
+ std::memcpy(&opaque, buf.data() + 12, sizeof(opaque));
732
+ spdlog::trace("{} MCBP send, opaque={}, {:n}", log_prefix_, opaque, spdlog::to_hex(buf.begin(), buf.begin() + 24));
733
+ SPDLOG_TRACE("{} MCBP send, opaque={}{:a}", log_prefix_, opaque, spdlog::to_hex(data));
734
+ std::scoped_lock lock(output_buffer_mutex_);
494
735
  output_buffer_.push_back(buf);
495
736
  }
496
737
 
@@ -513,32 +754,45 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
513
754
 
514
755
  void write_and_subscribe(uint32_t opaque,
515
756
  std::vector<std::uint8_t>& data,
516
- std::function<void(std::error_code, io::mcbp_message&&)> handler)
757
+ std::function<void(std::error_code, retry_reason, io::mcbp_message&&)> handler)
517
758
  {
518
759
  if (stopped_) {
760
+ spdlog::warn("{} MCBP cancel operation, while trying to write to closed session, opaque={}", log_prefix_, opaque);
761
+ handler(std::make_error_code(error::common_errc::request_canceled), retry_reason::socket_closed_while_in_flight, {});
519
762
  return;
520
763
  }
521
- spdlog::trace(
522
- "{} MCBP send, opaque={}{:a}", log_prefix_, endpoint_.address().to_string(), endpoint_.port(), opaque, spdlog::to_hex(data));
523
- command_handlers_.emplace(opaque, std::move(handler));
524
- if (bootstrapped_ && socket_.is_open()) {
764
+ {
765
+ std::scoped_lock lock(command_handlers_mutex_);
766
+ command_handlers_.emplace(opaque, std::move(handler));
767
+ }
768
+ if (bootstrapped_ && stream_->is_open()) {
525
769
  write_and_flush(data);
526
770
  } else {
771
+ spdlog::debug("{} the stream is not ready yet, put the message into pending buffer, opaque={}", log_prefix_, opaque);
772
+ std::scoped_lock lock(pending_buffer_mutex_);
527
773
  pending_buffer_.push_back(data);
528
774
  }
529
775
  }
530
776
 
531
- void cancel(uint32_t opaque, std::error_code ec)
777
+ [[nodiscard]] bool cancel(uint32_t opaque, std::error_code ec, retry_reason reason)
532
778
  {
533
779
  if (stopped_) {
534
- return;
780
+ return false;
535
781
  }
782
+ command_handlers_mutex_.lock();
536
783
  auto handler = command_handlers_.find(opaque);
537
784
  if (handler != command_handlers_.end()) {
538
- spdlog::debug("{} MCBP cancel operation, opaque={}, ec={}", log_prefix_, opaque, ec.message());
539
- handler->second(ec, {});
540
- command_handlers_.erase(handler);
785
+ spdlog::debug("{} MCBP cancel operation, opaque={}, ec={} ({})", log_prefix_, opaque, ec.value(), ec.message());
786
+ if (handler->second) {
787
+ auto fun = std::move(handler->second);
788
+ command_handlers_.erase(handler);
789
+ command_handlers_mutex_.unlock();
790
+ fun(ec, reason, {});
791
+ return true;
792
+ }
541
793
  }
794
+ command_handlers_mutex_.unlock();
795
+ return false;
542
796
  }
543
797
 
544
798
  [[nodiscard]] bool supports_feature(protocol::hello_feature feature)
@@ -551,7 +805,7 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
551
805
  return supported_features_;
552
806
  }
553
807
 
554
- [[nodiscard]] bool supports_gcccp()
808
+ [[nodiscard]] bool supports_gcccp() const
555
809
  {
556
810
  return supports_gcccp_;
557
811
  }
@@ -572,6 +826,16 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
572
826
  return config_->index_for_this_node();
573
827
  }
574
828
 
829
+ [[nodiscard]] const std::string& bootstrap_hostname() const
830
+ {
831
+ return bootstrap_hostname_;
832
+ }
833
+
834
+ [[nodiscard]] const std::string& bootstrap_port() const
835
+ {
836
+ return bootstrap_port_;
837
+ }
838
+
575
839
  [[nodiscard]] uint32_t next_opaque()
576
840
  {
577
841
  return ++opaque_;
@@ -626,7 +890,7 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
626
890
  return std::make_error_code(error::common_errc::internal_server_failure);
627
891
 
628
892
  case protocol::status::busy:
629
- case protocol::status::temp_failure:
893
+ case protocol::status::temporary_failure:
630
894
  case protocol::status::no_memory:
631
895
  case protocol::status::not_initialized:
632
896
  return std::make_error_code(error::common_errc::temporary_failure);
@@ -711,15 +975,100 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
711
975
  break;
712
976
  }
713
977
  // FIXME: use error map here
714
- spdlog::warn("{} unknown status code: {} (opcode={})", log_prefix_, status, opcode);
978
+ spdlog::warn("{} unknown status code: {} (opcode={})", log_prefix_, protocol::status_to_string(status), opcode);
715
979
  return std::make_error_code(error::network_errc::protocol_error);
716
980
  }
717
981
 
982
+ std::optional<error_map::error_info> decode_error_code(std::uint16_t code)
983
+ {
984
+ if (error_map_) {
985
+ auto info = error_map_->errors.find(code);
986
+ if (info != error_map_->errors.end()) {
987
+ return info->second;
988
+ }
989
+ }
990
+ return {};
991
+ }
992
+
993
+ void on_configuration_update(std::function<void(const configuration&)> handler)
994
+ {
995
+ config_listeners_.emplace_back(std::move(handler));
996
+ }
997
+
718
998
  void update_configuration(configuration&& config)
719
999
  {
720
- if (!config_ || config.rev > config_->rev) {
721
- config_.emplace(config);
722
- spdlog::debug("{} received new configuration: {}", log_prefix_, config_.value());
1000
+ if (stopped_) {
1001
+ return;
1002
+ }
1003
+ if (config_) {
1004
+ if (config_->vbmap && config.vbmap && config_->vbmap->size() != config.vbmap->size()) {
1005
+ spdlog::debug("{} received a configuration with a different number of vbuckets, ignoring", log_prefix_);
1006
+ return;
1007
+ }
1008
+ if (config_->rev && config.rev) {
1009
+ if (*config_->rev == *config.rev) {
1010
+ spdlog::trace("{} received a configuration with identical revision (rev={}), ignoring", log_prefix_, *config.rev);
1011
+ return;
1012
+ }
1013
+ if (*config_->rev > *config.rev) {
1014
+ spdlog::debug("{} received a configuration with older revision, ignoring", log_prefix_);
1015
+ return;
1016
+ }
1017
+ }
1018
+ }
1019
+ bool this_node_found = false;
1020
+ for (auto& node : config.nodes) {
1021
+ if (node.hostname.empty()) {
1022
+ node.hostname = bootstrap_hostname_;
1023
+ }
1024
+ if (node.this_node) {
1025
+ this_node_found = true;
1026
+ }
1027
+ }
1028
+ if (!this_node_found) {
1029
+ for (auto& node : config.nodes) {
1030
+ if (node.hostname == bootstrap_hostname_) {
1031
+ if ((node.services_plain.key_value && std::to_string(node.services_plain.key_value.value()) == bootstrap_port_) ||
1032
+ (node.services_tls.key_value && std::to_string(node.services_tls.key_value.value()) == bootstrap_port_)) {
1033
+ node.this_node = true;
1034
+ }
1035
+ }
1036
+ }
1037
+ }
1038
+ config_.emplace(config);
1039
+ spdlog::debug("{} received new configuration: {}", log_prefix_, config_.value());
1040
+ for (auto& listener : config_listeners_) {
1041
+ listener(*config_);
1042
+ }
1043
+ }
1044
+
1045
+ void handle_not_my_vbucket(io::mcbp_message&& msg)
1046
+ {
1047
+ if (stopped_) {
1048
+ return;
1049
+ }
1050
+ Expects(msg.header.magic == static_cast<std::uint8_t>(protocol::magic::alt_client_response) ||
1051
+ msg.header.magic == static_cast<std::uint8_t>(protocol::magic::client_response));
1052
+ if (protocol::has_json_datatype(msg.header.datatype)) {
1053
+ auto magic = static_cast<protocol::magic>(msg.header.magic);
1054
+ uint8_t extras_size = msg.header.extlen;
1055
+ uint8_t framing_extras_size = 0;
1056
+ uint16_t key_size = htons(msg.header.keylen);
1057
+ if (magic == protocol::magic::alt_client_response) {
1058
+ framing_extras_size = static_cast<std::uint8_t>(msg.header.keylen >> 8U);
1059
+ key_size = msg.header.keylen & 0xffU;
1060
+ }
1061
+
1062
+ std::vector<uint8_t>::difference_type offset = framing_extras_size + key_size + extras_size;
1063
+ if (ntohl(msg.header.bodylen) - offset > 0) {
1064
+ auto config = protocol::parse_config(msg.body.begin() + offset, msg.body.end());
1065
+ spdlog::debug("{} received not_my_vbucket status for {}, opaque={} with config rev={} in the payload",
1066
+ log_prefix_,
1067
+ static_cast<protocol::client_opcode>(msg.header.opcode),
1068
+ msg.header.opaque,
1069
+ config.rev_str());
1070
+ update_configuration(std::move(config));
1071
+ }
723
1072
  }
724
1073
  }
725
1074
 
@@ -730,20 +1079,35 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
730
1079
 
731
1080
  void update_collection_uid(const std::string& path, std::uint32_t uid)
732
1081
  {
1082
+ if (stopped_) {
1083
+ return;
1084
+ }
733
1085
  collection_cache_.update(path, uid);
734
1086
  }
735
1087
 
736
1088
  private:
737
1089
  void invoke_bootstrap_handler(std::error_code ec)
738
1090
  {
1091
+ if (ec == std::make_error_code(error::network_errc::configuration_not_available)) {
1092
+ return initiate_bootstrap();
1093
+ }
1094
+ if (retry_bootstrap_on_bucket_not_found_ && ec == std::make_error_code(error::common_errc::bucket_not_found)) {
1095
+ spdlog::debug(R"({} server returned {} ({}), it must be transient condition, retrying)", log_prefix_, ec.value(), ec.message());
1096
+ return initiate_bootstrap();
1097
+ }
1098
+
739
1099
  if (!bootstrapped_ && bootstrap_handler_) {
1100
+ bootstrap_deadline_.cancel();
740
1101
  bootstrap_handler_(ec, config_.value_or(configuration{}));
741
1102
  bootstrap_handler_ = nullptr;
742
1103
  }
743
- bootstrapped_ = true;
744
1104
  if (ec) {
745
- stop();
1105
+ return stop(retry_reason::node_not_available);
746
1106
  }
1107
+ state_ = diag::endpoint_state::connected;
1108
+ bootstrapped_ = true;
1109
+ handler_ = std::make_unique<normal_handler>(shared_from_this());
1110
+ std::scoped_lock lock(pending_buffer_mutex_);
747
1111
  if (!pending_buffer_.empty()) {
748
1112
  for (const auto& buf : pending_buffer_) {
749
1113
  write(buf);
@@ -758,13 +1122,15 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
758
1122
  if (stopped_) {
759
1123
  return;
760
1124
  }
1125
+ last_active_ = std::chrono::steady_clock::now();
761
1126
  if (ec) {
762
- spdlog::error("{} error on resolve: {}", log_prefix_, ec.message());
763
- return invoke_bootstrap_handler(std::make_error_code(error::network_errc::resolve_failure));
1127
+ spdlog::error("{} error on resolve: {} ({})", log_prefix_, ec.value(), ec.message());
1128
+ return initiate_bootstrap();
764
1129
  }
765
1130
  endpoints_ = endpoints;
766
1131
  do_connect(endpoints_.begin());
767
- deadline_timer_.async_wait(std::bind(&mcbp_session::check_deadline, this, std::placeholders::_1));
1132
+ connection_deadline_.expires_after(timeout_defaults::connect_timeout);
1133
+ connection_deadline_.async_wait(std::bind(&mcbp_session::check_deadline, shared_from_this(), std::placeholders::_1));
768
1134
  }
769
1135
 
770
1136
  void do_connect(asio::ip::tcp::resolver::results_type::iterator it)
@@ -772,14 +1138,14 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
772
1138
  if (stopped_) {
773
1139
  return;
774
1140
  }
1141
+ last_active_ = std::chrono::steady_clock::now();
775
1142
  if (it != endpoints_.end()) {
776
1143
  spdlog::debug("{} connecting to {}:{}", log_prefix_, it->endpoint().address().to_string(), it->endpoint().port());
777
- deadline_timer_.expires_after(timeout_defaults::connect_timeout);
778
- socket_.async_connect(it->endpoint(), std::bind(&mcbp_session::on_connect, this, std::placeholders::_1, it));
1144
+ connection_deadline_.expires_after(timeout_defaults::connect_timeout);
1145
+ stream_->async_connect(it->endpoint(), std::bind(&mcbp_session::on_connect, shared_from_this(), std::placeholders::_1, it));
779
1146
  } else {
780
- spdlog::error("{} no more endpoints left to connect", log_prefix_);
781
- invoke_bootstrap_handler(std::make_error_code(error::network_errc::no_endpoints_left));
782
- stop();
1147
+ spdlog::error("{} no more endpoints left to connect, will try another address", log_prefix_);
1148
+ return initiate_bootstrap();
783
1149
  }
784
1150
  }
785
1151
 
@@ -788,83 +1154,117 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
788
1154
  if (stopped_) {
789
1155
  return;
790
1156
  }
791
- if (!socket_.is_open() || ec) {
1157
+ last_active_ = std::chrono::steady_clock::now();
1158
+ if (!stream_->is_open() || ec) {
1159
+ spdlog::warn("{} unable to connect to {}:{}: {} ({}), is_open={}",
1160
+ log_prefix_,
1161
+ it->endpoint().address().to_string(),
1162
+ it->endpoint().port(),
1163
+ ec.value(),
1164
+ ec.message(),
1165
+ stream_->is_open());
792
1166
  do_connect(++it);
793
1167
  } else {
794
- socket_.set_option(asio::ip::tcp::no_delay{ true });
795
- socket_.set_option(asio::socket_base::keep_alive{ true });
1168
+ stream_->set_options();
1169
+ local_endpoint_ = stream_->local_endpoint();
1170
+ local_endpoint_address_ = local_endpoint_.address().to_string();
796
1171
  endpoint_ = it->endpoint();
797
- spdlog::debug("{} connected to {}:{}", log_prefix_, endpoint_.address().to_string(), it->endpoint().port());
798
- log_prefix_ = fmt::format(
799
- "[{}/{}/{}] <{}:{}>", client_id_, id_, bucket_name_.value_or("-"), endpoint_.address().to_string(), endpoint_.port());
1172
+ endpoint_address_ = endpoint_.address().to_string();
1173
+ spdlog::debug("{} connected to {}:{}", log_prefix_, endpoint_address_, it->endpoint().port());
1174
+ log_prefix_ = fmt::format("[{}/{}/{}/{}] <{}/{}:{}>",
1175
+ client_id_,
1176
+ id_,
1177
+ stream_->log_prefix(),
1178
+ bucket_name_.value_or("-"),
1179
+ bootstrap_hostname_,
1180
+ endpoint_address_,
1181
+ endpoint_.port());
800
1182
  handler_ = std::make_unique<bootstrap_handler>(shared_from_this());
801
- deadline_timer_.expires_at(asio::steady_timer::time_point::max());
802
- deadline_timer_.cancel();
1183
+ connection_deadline_.expires_at(asio::steady_timer::time_point::max());
1184
+ connection_deadline_.cancel();
803
1185
  }
804
1186
  }
805
1187
 
806
1188
  void check_deadline(std::error_code ec)
807
1189
  {
808
- if (ec == asio::error::operation_aborted) {
1190
+ if (ec == asio::error::operation_aborted || stopped_) {
809
1191
  return;
810
1192
  }
811
- if (stopped_) {
812
- return;
1193
+ if (connection_deadline_.expiry() <= asio::steady_timer::clock_type::now()) {
1194
+ stream_->close();
1195
+ connection_deadline_.expires_at(asio::steady_timer::time_point::max());
813
1196
  }
814
- if (deadline_timer_.expiry() <= asio::steady_timer::clock_type::now()) {
815
- socket_.close();
816
- deadline_timer_.expires_at(asio::steady_timer::time_point::max());
817
- }
818
- deadline_timer_.async_wait(std::bind(&mcbp_session::check_deadline, this, std::placeholders::_1));
1197
+ connection_deadline_.async_wait(std::bind(&mcbp_session::check_deadline, shared_from_this(), std::placeholders::_1));
819
1198
  }
820
1199
 
821
1200
  void do_read()
822
1201
  {
823
- if (stopped_) {
824
- return;
825
- }
826
- if (reading_) {
1202
+ if (stopped_ || reading_ || !stream_->is_open()) {
827
1203
  return;
828
1204
  }
829
1205
  reading_ = true;
830
- socket_.async_read_some(asio::buffer(input_buffer_),
831
- [self = shared_from_this()](std::error_code ec, std::size_t bytes_transferred) {
832
- if (ec == asio::error::operation_aborted || self->stopped_) {
833
- return;
834
- }
835
- if (ec) {
836
- spdlog::error("{} IO error while reading from the socket: {}", self->log_prefix_, ec.message());
837
- return self->stop();
838
- }
839
- self->parser_.feed(self->input_buffer_.data(), self->input_buffer_.data() + ssize_t(bytes_transferred));
840
-
841
- for (;;) {
842
- mcbp_message msg{};
843
- switch (self->parser_.next(msg)) {
844
- case mcbp_parser::ok:
845
- spdlog::trace("{} MCBP recv, opaque={}{:a}{:a}",
846
- self->log_prefix_,
847
- msg.header.opaque,
848
- spdlog::to_hex(msg.header_data()),
849
- spdlog::to_hex(msg.body));
850
- self->handler_->handle(std::move(msg));
851
- break;
852
- case mcbp_parser::need_data:
853
- self->reading_ = false;
854
- return self->do_read();
855
- case mcbp_parser::failure:
856
- return self->stop();
857
- }
858
- }
859
- });
1206
+ stream_->async_read_some(
1207
+ asio::buffer(input_buffer_),
1208
+ [self = shared_from_this(), stream_id = stream_->id()](std::error_code ec, std::size_t bytes_transferred) {
1209
+ if (ec == asio::error::operation_aborted || self->stopped_) {
1210
+ return;
1211
+ }
1212
+ self->last_active_ = std::chrono::steady_clock::now();
1213
+ if (ec) {
1214
+ if (stream_id != self->stream_->id()) {
1215
+ spdlog::error(R"({} ignore IO error while reading from the socket: {} ({}), old_id="{}", new_id="{}")",
1216
+ self->log_prefix_,
1217
+ ec.value(),
1218
+ ec.message(),
1219
+ stream_id,
1220
+ self->stream_->id());
1221
+ return;
1222
+ }
1223
+ spdlog::error(R"({} IO error while reading from the socket("{}"): {} ({}))",
1224
+ self->log_prefix_,
1225
+ self->stream_->id(),
1226
+ ec.value(),
1227
+ ec.message());
1228
+ return self->stop(retry_reason::socket_closed_while_in_flight);
1229
+ }
1230
+ self->parser_.feed(self->input_buffer_.data(), self->input_buffer_.data() + ssize_t(bytes_transferred));
1231
+
1232
+ for (;;) {
1233
+ mcbp_message msg{};
1234
+ switch (self->parser_.next(msg)) {
1235
+ case mcbp_parser::ok:
1236
+ spdlog::trace(
1237
+ "{} MCBP recv, opaque={}, {:n}", self->log_prefix_, msg.header.opaque, spdlog::to_hex(msg.header_data()));
1238
+ SPDLOG_TRACE("{} MCBP recv, opaque={}{:a}{:a}",
1239
+ self->log_prefix_,
1240
+ msg.header.opaque,
1241
+ spdlog::to_hex(msg.header_data()),
1242
+ spdlog::to_hex(msg.body));
1243
+ self->handler_->handle(std::move(msg));
1244
+ if (self->stopped_) {
1245
+ return;
1246
+ }
1247
+ break;
1248
+ case mcbp_parser::need_data:
1249
+ self->reading_ = false;
1250
+ if (!self->stopped_ && self->stream_->is_open()) {
1251
+ self->do_read();
1252
+ }
1253
+ return;
1254
+ case mcbp_parser::failure:
1255
+ return self->stop(retry_reason::kv_temporary_failure);
1256
+ }
1257
+ }
1258
+ });
860
1259
  }
861
1260
 
862
1261
  void do_write()
863
1262
  {
864
- if (stopped_) {
1263
+ if (stopped_ || !stream_->is_open()) {
865
1264
  return;
866
1265
  }
867
- if (!writing_buffer_.empty()) {
1266
+ std::scoped_lock lock(writing_buffer_mutex_, output_buffer_mutex_);
1267
+ if (!writing_buffer_.empty() || output_buffer_.empty()) {
868
1268
  return;
869
1269
  }
870
1270
  std::swap(writing_buffer_, output_buffer_);
@@ -873,59 +1273,78 @@ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
873
1273
  for (auto& buf : writing_buffer_) {
874
1274
  buffers.emplace_back(asio::buffer(buf));
875
1275
  }
876
- asio::async_write(socket_, buffers, [self = shared_from_this()](std::error_code ec, std::size_t /*unused*/) {
877
- if (self->stopped_) {
1276
+ stream_->async_write(buffers, [self = shared_from_this()](std::error_code ec, std::size_t /*unused*/) {
1277
+ if (ec == asio::error::operation_aborted || self->stopped_) {
878
1278
  return;
879
1279
  }
1280
+ self->last_active_ = std::chrono::steady_clock::now();
880
1281
  if (ec) {
881
- spdlog::error("{} IO error while writing to the socket: {}", self->log_prefix_, ec.message());
882
- return self->stop();
1282
+ spdlog::error(R"({} IO error while writing to the socket("{}"): {} ({}))",
1283
+ self->log_prefix_,
1284
+ self->stream_->id(),
1285
+ ec.value(),
1286
+ ec.message());
1287
+ return self->stop(retry_reason::socket_closed_while_in_flight);
883
1288
  }
884
- self->writing_buffer_.clear();
885
- if (!self->output_buffer_.empty()) {
886
- self->do_write();
1289
+ {
1290
+ std::scoped_lock inner_lock(self->writing_buffer_mutex_);
1291
+ self->writing_buffer_.clear();
887
1292
  }
1293
+ self->do_write();
888
1294
  self->do_read();
889
1295
  });
890
1296
  }
891
1297
 
892
1298
  std::string client_id_;
893
- std::string id_;
1299
+ const std::string id_;
894
1300
  asio::io_context& ctx_;
895
1301
  asio::ip::tcp::resolver resolver_;
896
- asio::strand<asio::io_context::executor_type> strand_;
897
- asio::ip::tcp::socket socket_;
898
- asio::steady_timer deadline_timer_;
1302
+ std::unique_ptr<stream_impl> stream_;
1303
+ asio::steady_timer bootstrap_deadline_;
1304
+ asio::steady_timer connection_deadline_;
1305
+ asio::steady_timer retry_backoff_;
1306
+ couchbase::origin origin_;
899
1307
  std::optional<std::string> bucket_name_;
900
1308
  mcbp_parser parser_;
901
1309
  std::unique_ptr<message_handler> handler_;
902
- std::function<void(std::error_code, configuration)> bootstrap_handler_;
903
- std::map<uint32_t, std::function<void(std::error_code, io::mcbp_message&&)>> command_handlers_{};
1310
+ std::function<void(std::error_code, const configuration&)> bootstrap_handler_{};
1311
+ std::mutex command_handlers_mutex_{};
1312
+ std::map<uint32_t, std::function<void(std::error_code, retry_reason, io::mcbp_message&&)>> command_handlers_{};
1313
+ std::vector<std::function<void(const configuration&)>> config_listeners_{};
1314
+ std::function<void(io::retry_reason)> on_stop_handler_{};
904
1315
 
905
1316
  bool bootstrapped_{ false };
906
1317
  std::atomic_bool stopped_{ false };
907
1318
  bool authenticated_{ false };
908
1319
  bool bucket_selected_{ false };
909
1320
  bool supports_gcccp_{ true };
1321
+ bool retry_bootstrap_on_bucket_not_found_{ false };
910
1322
 
911
1323
  std::atomic<std::uint32_t> opaque_{ 0 };
912
1324
 
913
- std::string username_;
914
- std::string password_;
915
-
916
1325
  std::array<std::uint8_t, 16384> input_buffer_{};
917
1326
  std::vector<std::vector<std::uint8_t>> output_buffer_{};
918
1327
  std::vector<std::vector<std::uint8_t>> pending_buffer_{};
919
1328
  std::vector<std::vector<std::uint8_t>> writing_buffer_{};
1329
+ std::mutex output_buffer_mutex_{};
1330
+ std::mutex pending_buffer_mutex_{};
1331
+ std::mutex writing_buffer_mutex_{};
1332
+ std::string bootstrap_hostname_{};
1333
+ std::string bootstrap_port_{};
920
1334
  asio::ip::tcp::endpoint endpoint_{}; // connected endpoint
1335
+ std::string endpoint_address_{}; // cached string with endpoint address
1336
+ asio::ip::tcp::endpoint local_endpoint_{};
1337
+ std::string local_endpoint_address_{};
921
1338
  asio::ip::tcp::resolver::results_type endpoints_;
922
1339
  std::vector<protocol::hello_feature> supported_features_;
923
1340
  std::optional<configuration> config_;
924
- std::optional<error_map> errmap_;
1341
+ std::optional<error_map> error_map_;
925
1342
  collection_cache collection_cache_;
926
1343
 
927
1344
  std::atomic_bool reading_{ false };
928
1345
 
929
1346
  std::string log_prefix_{};
1347
+ std::chrono::time_point<std::chrono::steady_clock> last_active_{};
1348
+ diag::endpoint_state state_{ diag::endpoint_state::disconnected };
930
1349
  };
931
1350
  } // namespace couchbase::io