couchbase 3.0.0.beta.1 → 3.1.0

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