couchbase 3.8.1 → 3.9.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.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/ext/CMakeLists.txt +16 -1
- data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
- data/ext/cache/extconf_include.rb +6 -6
- data/ext/cache/mozilla-ca-bundle.crt +214 -155
- data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
- data/ext/couchbase/CMakeLists.txt +130 -21
- data/ext/couchbase/cmake/APKBUILD.in +25 -4
- data/ext/couchbase/cmake/Bundler.cmake +143 -34
- data/ext/couchbase/cmake/CPM.cmake +126 -12
- data/ext/couchbase/cmake/Cache.cmake +7 -1
- data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
- data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
- data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
- data/ext/couchbase/cmake/OpenSSL.cmake +10 -3
- data/ext/couchbase/cmake/Packaging.cmake +519 -65
- data/ext/couchbase/cmake/Protostellar.cmake +250 -0
- data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
- data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
- data/ext/couchbase/cmake/TestFramework.cmake +283 -0
- data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
- data/ext/couchbase/cmake/Testing.cmake +27 -9
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
- data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
- data/ext/couchbase/cmake/build_config.hxx.in +2 -1
- data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
- data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
- data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
- data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
- data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
- data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
- data/ext/couchbase/cmake/tarball_glob.txt +49 -0
- data/ext/couchbase/core/agent_group.cxx +0 -8
- data/ext/couchbase/core/agent_group.hxx +0 -4
- data/ext/couchbase/core/analytics_stream.cxx +314 -0
- data/ext/couchbase/core/analytics_stream.hxx +129 -0
- data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
- data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
- data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
- data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
- data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
- data/ext/couchbase/core/bucket.cxx +381 -87
- data/ext/couchbase/core/bucket.hxx +105 -25
- data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
- data/ext/couchbase/core/capella.hxx +91 -0
- data/ext/couchbase/core/cluster.cxx +1554 -398
- data/ext/couchbase/core/cluster.hxx +39 -8
- data/ext/couchbase/core/cluster_agent.cxx +0 -8
- data/ext/couchbase/core/cluster_agent.hxx +0 -4
- data/ext/couchbase/core/cluster_options.hxx +26 -3
- data/ext/couchbase/core/collections_component.cxx +39 -15
- data/ext/couchbase/core/config_profiles.cxx +1 -1
- data/ext/couchbase/core/crud_component.cxx +2 -2
- data/ext/couchbase/core/crud_options.hxx +34 -0
- data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
- data/ext/couchbase/core/document_id_redaction.hxx +81 -0
- data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
- data/ext/couchbase/core/error_context/key_value.cxx +25 -2
- data/ext/couchbase/core/error_context/key_value.hxx +60 -33
- data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
- data/ext/couchbase/core/error_context/search.hxx +5 -0
- data/ext/couchbase/core/error_context/search_json.hxx +3 -0
- data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
- data/ext/couchbase/core/error_context/view.hxx +5 -0
- data/ext/couchbase/core/free_form_http_request.cxx +237 -4
- data/ext/couchbase/core/free_form_http_request.hxx +41 -8
- data/ext/couchbase/core/http_component.cxx +300 -284
- data/ext/couchbase/core/http_component.hxx +0 -4
- data/ext/couchbase/core/impl/analytics.cxx +38 -5
- data/ext/couchbase/core/impl/analytics.hxx +34 -0
- data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
- data/ext/couchbase/core/impl/collection.cxx +215 -202
- data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
- data/ext/couchbase/core/impl/error.cxx +22 -2
- data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
- data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
- data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
- data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
- data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
- data/ext/couchbase/core/impl/node_id.cxx +49 -13
- data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
- data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
- data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
- data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
- data/ext/couchbase/core/impl/public_cluster.cxx +325 -25
- data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
- data/ext/couchbase/core/impl/query.cxx +76 -7
- data/ext/couchbase/core/impl/query.hxx +36 -0
- data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
- data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
- data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
- data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
- data/ext/couchbase/core/impl/scope.cxx +70 -0
- data/ext/couchbase/core/impl/search.cxx +31 -1
- data/ext/couchbase/core/impl/transactions.cxx +130 -0
- data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
- data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
- data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
- data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
- data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +66 -0
- data/ext/couchbase/core/io/dns_client.cxx +122 -45
- data/ext/couchbase/core/io/dns_codec.hxx +21 -21
- data/ext/couchbase/core/io/dns_config.cxx +21 -6
- data/ext/couchbase/core/io/http_command.hxx +149 -121
- data/ext/couchbase/core/io/http_error.hxx +107 -0
- data/ext/couchbase/core/io/http_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_session.cxx +606 -154
- data/ext/couchbase/core/io/http_session.hxx +147 -30
- data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
- data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
- data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
- data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
- data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
- data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
- data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
- data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
- data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
- data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
- data/ext/couchbase/core/io/mcbp_session.cxx +316 -317
- data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
- data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
- data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
- data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
- data/ext/couchbase/core/io/streams.cxx +275 -14
- data/ext/couchbase/core/io/streams.hxx +53 -0
- data/ext/couchbase/core/logger/logger.cxx +36 -0
- data/ext/couchbase/core/logger/logger.hxx +46 -6
- data/ext/couchbase/core/logger/redaction.hxx +503 -0
- data/ext/couchbase/core/management/eventing_status.hxx +10 -0
- data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
- data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
- data/ext/couchbase/core/mcbp/codec.cxx +27 -18
- data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
- data/ext/couchbase/core/mcbp/packet.hxx +2 -2
- data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
- data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
- data/ext/couchbase/core/meta/features.hxx +13 -0
- data/ext/couchbase/core/meta/version.cxx +6 -3
- data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
- data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
- data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
- data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
- data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
- data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
- data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
- data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
- data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
- data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
- data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
- data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
- data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
- data/ext/couchbase/core/operations/document_query.cxx +108 -221
- data/ext/couchbase/core/operations/document_query.hxx +18 -4
- data/ext/couchbase/core/operations/document_search.cxx +52 -8
- data/ext/couchbase/core/operations/document_search.hxx +3 -0
- data/ext/couchbase/core/operations/document_view.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
- data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
- data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
- data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
- data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
- data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
- data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
- data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
- data/ext/couchbase/core/operations/management/bucket_create.cxx +37 -38
- data/ext/couchbase/core/operations/management/bucket_update.cxx +26 -28
- data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
- data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/error_utils.cxx +59 -5
- data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
- data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
- data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
- data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
- data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
- data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
- data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
- data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
- data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
- data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
- data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
- data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
- data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
- data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
- data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
- data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
- data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
- data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
- data/ext/couchbase/core/operations_fwd.hxx +3 -3
- data/ext/couchbase/core/origin.cxx +54 -26
- data/ext/couchbase/core/origin.hxx +12 -0
- data/ext/couchbase/core/orphan_reporter.cxx +2 -1
- data/ext/couchbase/core/platform/random.cc +7 -7
- data/ext/couchbase/core/protocol/client_request.cxx +2 -2
- data/ext/couchbase/core/protocol/client_request.hxx +38 -21
- data/ext/couchbase/core/protocol/client_response.cxx +11 -3
- data/ext/couchbase/core/protocol/client_response.hxx +27 -6
- data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
- data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
- data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
- data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
- data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
- data/ext/couchbase/core/protocol/datatype.hxx +118 -1
- data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
- data/ext/couchbase/core/protocol/magic.hxx +4 -0
- data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
- data/ext/couchbase/core/protocol/server_request.hxx +3 -1
- data/ext/couchbase/core/protocol/status.cxx +1 -1
- data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
- data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
- data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
- data/ext/couchbase/core/protostellar/component.cxx +2445 -0
- data/ext/couchbase/core/protostellar/component.hxx +391 -0
- data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
- data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
- data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
- data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
- data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
- data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
- data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
- data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
- data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
- data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
- data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
- data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
- data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
- data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
- data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
- data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
- data/ext/couchbase/core/query_stream.cxx +447 -0
- data/ext/couchbase/core/query_stream.hxx +141 -0
- data/ext/couchbase/core/query_stream_component.cxx +243 -0
- data/ext/couchbase/core/query_stream_component.hxx +68 -0
- data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
- data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
- data/ext/couchbase/core/response_handler.hxx +41 -4
- data/ext/couchbase/core/row_streamer.cxx +332 -46
- data/ext/couchbase/core/row_streamer.hxx +31 -1
- data/ext/couchbase/core/row_streamer_options.hxx +55 -0
- data/ext/couchbase/core/sasl/client.h +3 -0
- data/ext/couchbase/core/search_scoring.hxx +66 -0
- data/ext/couchbase/core/stream_error_details.hxx +69 -0
- data/ext/couchbase/core/timeout_defaults.hxx +0 -1
- data/ext/couchbase/core/topology/capabilities.hxx +6 -0
- data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
- data/ext/couchbase/core/topology/configuration.cxx +21 -6
- data/ext/couchbase/core/topology/configuration.hxx +29 -8
- data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
- data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
- data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
- data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
- data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +362 -241
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +24 -3
- data/ext/couchbase/core/transactions/error_list.hxx +2 -2
- data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
- data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
- data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
- data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
- data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
- data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
- data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
- data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
- data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
- data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
- data/ext/couchbase/core/transactions/transactions.cxx +3 -55
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +194 -66
- data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
- data/ext/couchbase/core/transactions/utils.cxx +10 -0
- data/ext/couchbase/core/transactions/waitable_op_list.hxx +15 -4
- data/ext/couchbase/core/transactions.hxx +9 -9
- data/ext/couchbase/core/utils/byteswap.hxx +166 -9
- data/ext/couchbase/core/utils/connection_string.cxx +50 -85
- data/ext/couchbase/core/utils/connection_string.hxx +15 -0
- data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
- data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
- data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
- data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
- data/ext/couchbase/core/utils/movable_function.hxx +301 -52
- data/ext/couchbase/core/utils/name_codec.hxx +154 -11
- data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
- data/ext/couchbase/core/utils/url_codec.cxx +12 -51
- data/ext/couchbase/core/websocket_codec.cxx +3 -29
- data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
- data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
- data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
- data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
- data/ext/couchbase/couchbase/bucket.hxx +57 -0
- data/ext/couchbase/couchbase/cluster.hxx +216 -5
- data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
- data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
- data/ext/couchbase/couchbase/collection.hxx +234 -14
- data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
- data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
- data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
- data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
- data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/error.hxx +32 -0
- data/ext/couchbase/couchbase/error_codes.hxx +32 -0
- data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
- data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
- data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
- data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
- data/ext/couchbase/couchbase/get_result.hxx +1 -0
- data/ext/couchbase/couchbase/increment_options.hxx +1 -1
- data/ext/couchbase/couchbase/insert_options.hxx +1 -1
- data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/match_query.hxx +1 -1
- data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
- data/ext/couchbase/couchbase/network_options.hxx +1 -1
- data/ext/couchbase/couchbase/node_id.hxx +42 -14
- data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
- data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
- data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
- data/ext/couchbase/couchbase/query_options.hxx +23 -12
- data/ext/couchbase/couchbase/query_row.hxx +111 -0
- data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
- data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
- data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
- data/ext/couchbase/couchbase/replace_options.hxx +3 -3
- data/ext/couchbase/couchbase/result.hxx +14 -3
- data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
- data/ext/couchbase/couchbase/scope.hxx +85 -2
- data/ext/couchbase/couchbase/search_options.hxx +58 -8
- data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
- data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
- data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
- data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
- data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
- data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
- data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
- data/ext/couchbase/couchbase/transactions.hxx +27 -18
- data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
- data/ext/couchbase/couchbase/vector_query.hxx +1 -1
- data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
- data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
- data/ext/extconf.rb +15 -10
- data/ext/rcb_analytics.cxx +82 -102
- data/ext/rcb_backend.cxx +42 -36
- data/ext/rcb_backend.hxx +2 -0
- data/ext/rcb_buckets.cxx +47 -59
- data/ext/rcb_collections.cxx +42 -52
- data/ext/rcb_crud.cxx +345 -224
- data/ext/rcb_diagnostics.cxx +117 -27
- data/ext/rcb_exceptions.cxx +152 -99
- data/ext/rcb_exceptions.hxx +25 -0
- data/ext/rcb_extras.cxx +18 -19
- data/ext/rcb_hdr_histogram.cxx +19 -4
- data/ext/rcb_logger.cxx +202 -27
- data/ext/rcb_logger.hxx +12 -0
- data/ext/rcb_multi.cxx +40 -40
- data/ext/rcb_observability.cxx +7 -5
- data/ext/rcb_query.cxx +99 -142
- data/ext/rcb_range_scan.cxx +41 -35
- data/ext/rcb_search.cxx +98 -99
- data/ext/rcb_users.cxx +36 -56
- data/ext/rcb_utils.cxx +100 -37
- data/ext/rcb_utils.hxx +287 -33
- data/ext/rcb_version.cxx +1 -1
- data/ext/rcb_views.cxx +55 -51
- data/lib/active_support/cache/couchbase_store.rb +77 -12
- data/lib/couchbase/bucket.rb +20 -0
- data/lib/couchbase/cluster.rb +33 -14
- data/lib/couchbase/collection.rb +36 -1
- data/lib/couchbase/errors.rb +18 -0
- data/lib/couchbase/fork_hooks.rb +16 -7
- data/lib/couchbase/get_replica_strategy.rb +89 -0
- data/lib/couchbase/logger.rb +1 -1
- data/lib/couchbase/management/analytics_index_manager.rb +15 -15
- data/lib/couchbase/management/bucket_manager.rb +6 -6
- data/lib/couchbase/management/collection_manager.rb +6 -6
- data/lib/couchbase/management/query_index_manager.rb +7 -7
- data/lib/couchbase/management/search_index_manager.rb +13 -13
- data/lib/couchbase/management/user_manager.rb +10 -10
- data/lib/couchbase/management/view_index_manager.rb +5 -5
- data/lib/couchbase/options.rb +181 -44
- data/lib/couchbase/protostellar/bucket.rb +4 -0
- data/lib/couchbase/protostellar/cluster.rb +4 -0
- data/lib/couchbase/protostellar/collection.rb +4 -0
- data/lib/couchbase/protostellar/error_handling.rb +2 -1
- data/lib/couchbase/protostellar/request.rb +1 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
- data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
- data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
- data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
- data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
- data/lib/couchbase/search_options.rb +95 -6
- data/lib/couchbase/version.rb +1 -1
- metadata +92 -33
- data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
- data/ext/couchbase/core/columnar/agent.hxx +0 -71
- data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
- data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
- data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
- data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
- data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
- data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
- data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
- data/ext/couchbase/core/columnar/error.hxx +0 -51
- data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
- data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
- data/ext/couchbase/core/columnar/management_component.cxx +0 -300
- data/ext/couchbase/core/columnar/management_component.hxx +0 -56
- data/ext/couchbase/core/columnar/query_component.cxx +0 -523
- data/ext/couchbase/core/columnar/query_component.hxx +0 -57
- data/ext/couchbase/core/columnar/query_options.hxx +0 -59
- data/ext/couchbase/core/columnar/query_result.cxx +0 -130
- data/ext/couchbase/core/columnar/query_result.hxx +0 -78
- data/ext/couchbase/core/io/config_tracker.cxx +0 -687
- data/ext/couchbase/core/io/config_tracker.hxx +0 -123
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
#include "client_response.hxx"
|
|
24
24
|
#include "core/utils/binary.hxx"
|
|
25
25
|
#include "core/utils/byteswap.hxx"
|
|
26
|
+
#include "datatype.hxx"
|
|
26
27
|
#include "magic.hxx"
|
|
27
28
|
|
|
28
29
|
#include <algorithm>
|
|
@@ -32,8 +33,8 @@
|
|
|
32
33
|
namespace couchbase::core::protocol
|
|
33
34
|
{
|
|
34
35
|
auto
|
|
35
|
-
compress_value(const std::vector<std::byte>& value,
|
|
36
|
-
|
|
36
|
+
compress_value(const std::vector<std::byte>& value, const std::vector<std::byte>::iterator& output)
|
|
37
|
+
-> std::pair<bool, std::uint32_t>;
|
|
37
38
|
|
|
38
39
|
template<typename Body>
|
|
39
40
|
class client_request
|
|
@@ -62,7 +63,7 @@ public:
|
|
|
62
63
|
|
|
63
64
|
void opaque(std::uint32_t val)
|
|
64
65
|
{
|
|
65
|
-
opaque_ = utils::
|
|
66
|
+
opaque_ = utils::host_to_network(val);
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
void datatype(protocol::datatype val)
|
|
@@ -72,12 +73,12 @@ public:
|
|
|
72
73
|
|
|
73
74
|
void cas(couchbase::cas val)
|
|
74
75
|
{
|
|
75
|
-
cas_ = utils::
|
|
76
|
+
cas_ = utils::host_to_network(val.value());
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
[[nodiscard]] auto opaque() const -> std::uint32_t
|
|
79
80
|
{
|
|
80
|
-
return utils::
|
|
81
|
+
return utils::network_to_host(opaque_);
|
|
81
82
|
}
|
|
82
83
|
|
|
83
84
|
void opcode(client_opcode val)
|
|
@@ -116,23 +117,38 @@ public:
|
|
|
116
117
|
private:
|
|
117
118
|
[[nodiscard]] auto generate_payload(bool try_to_compress) -> std::vector<std::byte>
|
|
118
119
|
{
|
|
120
|
+
// Bind the body's four wire regions once. Note that value()/extras() on some bodies (e.g.
|
|
121
|
+
// hello, mutate_in) lazily populate their buffers on first access, so this also materialises
|
|
122
|
+
// them before we measure and copy.
|
|
123
|
+
const auto& framing_extras = body_.framing_extras();
|
|
124
|
+
const auto& extras = body_.extras();
|
|
125
|
+
const auto& key = body_.key();
|
|
126
|
+
const auto& value = body_.value();
|
|
127
|
+
|
|
128
|
+
// Size the buffer from the same regions that get copied into it, rather than from the
|
|
129
|
+
// independent body_.size(). body_.size() is defined as exactly this sum for every body type,
|
|
130
|
+
// so the byte layout is unchanged; deriving the length here makes the buffer provably large
|
|
131
|
+
// enough for the copies below. (Without it GCC folds body_.size() to 0 for zero-length bodies
|
|
132
|
+
// such as noop, decides body_itr is one-past-the-end, and emits a bogus -Warray-bounds.)
|
|
133
|
+
const std::size_t body_size_bytes =
|
|
134
|
+
framing_extras.size() + extras.size() + key.size() + value.size();
|
|
135
|
+
|
|
119
136
|
// SA: for some reason GCC 8.5.0 on CentOS 8 sees here null-pointer dereference
|
|
120
137
|
// JC: BoringSSL changes, noticed the same when building w/ GCC 11.3.0; TODO: is 12 okay?
|
|
121
138
|
#if defined(__GNUC__) && __GNUC__ >= 8 && __GNUC__ < 12
|
|
122
139
|
#pragma GCC diagnostic push
|
|
123
140
|
#pragma GCC diagnostic ignored "-Wnull-dereference"
|
|
124
141
|
#endif
|
|
125
|
-
std::vector<std::byte> payload(header_size +
|
|
142
|
+
std::vector<std::byte> payload(header_size + body_size_bytes, std::byte{});
|
|
126
143
|
payload[0] = static_cast<std::byte>(magic_);
|
|
127
144
|
payload[1] = static_cast<std::byte>(opcode_);
|
|
128
145
|
#if defined(__GNUC__) && __GNUC__ >= 8 && __GNUC__ < 12
|
|
129
146
|
#pragma GCC diagnostic pop
|
|
130
147
|
#endif
|
|
131
|
-
const auto& framing_extras = body_.framing_extras();
|
|
132
148
|
|
|
133
|
-
std::uint16_t key_size = gsl::narrow_cast<std::uint16_t>(
|
|
149
|
+
std::uint16_t key_size = gsl::narrow_cast<std::uint16_t>(key.size());
|
|
134
150
|
if (framing_extras.size() == 0) {
|
|
135
|
-
key_size = utils::
|
|
151
|
+
key_size = utils::host_to_network(key_size);
|
|
136
152
|
memcpy(payload.data() + 2, &key_size, sizeof(key_size));
|
|
137
153
|
} else {
|
|
138
154
|
magic_ = protocol::magic::alt_client_request;
|
|
@@ -141,15 +157,16 @@ private:
|
|
|
141
157
|
payload[3] = gsl::narrow_cast<std::byte>(key_size);
|
|
142
158
|
}
|
|
143
159
|
|
|
144
|
-
std::uint8_t ext_size = gsl::narrow_cast<std::uint8_t>(
|
|
160
|
+
std::uint8_t ext_size = gsl::narrow_cast<std::uint8_t>(extras.size());
|
|
145
161
|
memcpy(payload.data() + 4, &ext_size, sizeof(ext_size));
|
|
146
162
|
|
|
147
163
|
payload[5] = static_cast<std::byte>(datatype_);
|
|
148
164
|
|
|
149
|
-
std::uint16_t vbucket = utils::
|
|
165
|
+
std::uint16_t vbucket = utils::host_to_network(gsl::narrow_cast<std::uint16_t>(partition_));
|
|
150
166
|
memcpy(payload.data() + 6, &vbucket, sizeof(vbucket));
|
|
151
167
|
|
|
152
|
-
std::uint32_t body_size =
|
|
168
|
+
std::uint32_t body_size =
|
|
169
|
+
utils::host_to_network(gsl::narrow_cast<std::uint32_t>(body_size_bytes));
|
|
153
170
|
memcpy(payload.data() + 8, &body_size, sizeof(body_size));
|
|
154
171
|
|
|
155
172
|
memcpy(payload.data() + 12, &opaque_, sizeof(opaque_));
|
|
@@ -159,24 +176,24 @@ private:
|
|
|
159
176
|
if (framing_extras.size() > 0) {
|
|
160
177
|
body_itr = std::copy(framing_extras.begin(), framing_extras.end(), body_itr);
|
|
161
178
|
}
|
|
162
|
-
body_itr = std::copy(
|
|
163
|
-
body_itr = utils::to_binary(
|
|
179
|
+
body_itr = std::copy(extras.begin(), extras.end(), body_itr);
|
|
180
|
+
body_itr = utils::to_binary(key, body_itr);
|
|
164
181
|
|
|
165
182
|
if (static const std::size_t min_size_to_compress = 32;
|
|
166
|
-
try_to_compress &&
|
|
167
|
-
if (auto [compressed, new_value_size] = compress_value(
|
|
183
|
+
try_to_compress && value.size() > min_size_to_compress) {
|
|
184
|
+
if (auto [compressed, new_value_size] = compress_value(value, body_itr); compressed) {
|
|
168
185
|
/* the compressed value meets requirements and was copied to the payload */
|
|
169
|
-
payload[5]
|
|
170
|
-
std::uint32_t new_body_size = utils::
|
|
171
|
-
gsl::narrow_cast<std::uint32_t>(
|
|
186
|
+
protocol::set_flag(payload[5], protocol::datatype::snappy);
|
|
187
|
+
std::uint32_t new_body_size = utils::network_to_host(body_size) -
|
|
188
|
+
gsl::narrow_cast<std::uint32_t>(value.size()) +
|
|
172
189
|
new_value_size;
|
|
173
190
|
payload.resize(header_size + new_body_size);
|
|
174
|
-
new_body_size = utils::
|
|
191
|
+
new_body_size = utils::host_to_network(new_body_size);
|
|
175
192
|
memcpy(payload.data() + 8, &new_body_size, sizeof(new_body_size));
|
|
176
193
|
return payload;
|
|
177
194
|
}
|
|
178
195
|
}
|
|
179
|
-
std::copy(
|
|
196
|
+
std::copy(value.begin(), value.end(), body_itr);
|
|
180
197
|
return payload;
|
|
181
198
|
}
|
|
182
199
|
};
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
#include "core/utils/json.hxx"
|
|
21
21
|
|
|
22
|
+
#include <cstddef>
|
|
22
23
|
#include <cstring>
|
|
23
24
|
#include <gsl/assert>
|
|
24
25
|
#include <tao/json/value.hpp>
|
|
@@ -31,8 +32,15 @@ parse_server_duration_us(const io::mcbp_message& msg) -> double
|
|
|
31
32
|
if (msg.header.magic != static_cast<std::uint8_t>(magic::alt_client_response)) {
|
|
32
33
|
return 0;
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
-
|
|
35
|
+
// Byte 2 of the header, read as a byte. `keylen` holds the wire bytes untouched, so masking it
|
|
36
|
+
// as a native integer reads byte 2 on a little-endian host and byte 3 -- the key length -- on a
|
|
37
|
+
// big-endian one. The mask also truncated the field to its low nibble: four bits is the length
|
|
38
|
+
// of one frame inside the region, not the length of the region, which may exceed 15 bytes.
|
|
39
|
+
const auto framing_extras_size = msg.header.alt_sizes().framing_extras;
|
|
40
|
+
// A region the body cannot hold is a malformed response, not a duration: the loop below walks
|
|
41
|
+
// to framing_extras_size without consulting the body again, and the nibble mask was the only
|
|
42
|
+
// thing that had been keeping it near the front of the buffer.
|
|
43
|
+
if (framing_extras_size == 0 || std::size_t{ framing_extras_size } > msg.body.size()) {
|
|
36
44
|
return 0;
|
|
37
45
|
}
|
|
38
46
|
std::size_t offset = 0;
|
|
@@ -44,7 +52,7 @@ parse_server_duration_us(const io::mcbp_message& msg) -> double
|
|
|
44
52
|
if (frame_size == 2 && framing_extras_size - offset >= frame_size) {
|
|
45
53
|
std::uint16_t encoded_duration{};
|
|
46
54
|
std::memcpy(&encoded_duration, msg.body.data() + offset, sizeof(encoded_duration));
|
|
47
|
-
encoded_duration = utils::
|
|
55
|
+
encoded_duration = utils::network_to_host(encoded_duration);
|
|
48
56
|
return std::pow(encoded_duration, 1.74) / 2;
|
|
49
57
|
}
|
|
50
58
|
}
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
#include "client_opcode.hxx"
|
|
24
24
|
#include "client_opcode_fmt.hxx"
|
|
25
25
|
#include "cmd_info.hxx"
|
|
26
|
+
#include "core/io/mcbp_buffer_pool.hxx"
|
|
26
27
|
#include "core/io/mcbp_message.hxx"
|
|
27
28
|
#include "core/utils/byteswap.hxx"
|
|
28
29
|
#include "datatype.hxx"
|
|
@@ -68,6 +69,9 @@ private:
|
|
|
68
69
|
std::uint32_t opaque_{};
|
|
69
70
|
std::uint64_t cas_{};
|
|
70
71
|
cmd_info info_{};
|
|
72
|
+
// When set, data_ (moved out of the mcbp_message body) is returned to the destroying thread's
|
|
73
|
+
// buffer pool on destruction so its storage can be recycled. See core/io/mcbp_buffer_pool.hxx.
|
|
74
|
+
bool recycle_body_{ false };
|
|
71
75
|
|
|
72
76
|
public:
|
|
73
77
|
client_response() = default;
|
|
@@ -80,11 +84,28 @@ public:
|
|
|
80
84
|
: header_(msg.header_data())
|
|
81
85
|
, data_(std::move(msg.body))
|
|
82
86
|
, info_(info)
|
|
87
|
+
, recycle_body_(msg.recycle_body)
|
|
83
88
|
{
|
|
84
89
|
verify_header();
|
|
85
90
|
parse_body();
|
|
86
91
|
}
|
|
87
92
|
|
|
93
|
+
client_response(const client_response&) = default;
|
|
94
|
+
auto operator=(const client_response&) -> client_response& = default;
|
|
95
|
+
client_response(client_response&&) = default;
|
|
96
|
+
auto operator=(client_response&&) -> client_response& = default;
|
|
97
|
+
|
|
98
|
+
~client_response()
|
|
99
|
+
{
|
|
100
|
+
// Recycle the frame buffer to the destroying thread's own pool. The pool is thread-local, so
|
|
101
|
+
// this is safe on whichever IO thread (read loop or a command strand) destroys the response;
|
|
102
|
+
// std::vector value semantics mean no two responses ever share data_, so a buffer is never
|
|
103
|
+
// returned twice.
|
|
104
|
+
if (recycle_body_) {
|
|
105
|
+
io::tls_response_body_pool().release(std::move(data_));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
88
109
|
[[nodiscard]] auto opcode() const -> client_opcode
|
|
89
110
|
{
|
|
90
111
|
return opcode_;
|
|
@@ -131,7 +152,7 @@ public:
|
|
|
131
152
|
|
|
132
153
|
std::uint16_t status = 0;
|
|
133
154
|
memcpy(&status, header_.data() + 6, sizeof(status));
|
|
134
|
-
status = utils::
|
|
155
|
+
status = utils::network_to_host(status);
|
|
135
156
|
status_ = static_cast<key_value_status_code>(status);
|
|
136
157
|
|
|
137
158
|
extras_size_ = std::to_integer<std::uint8_t>(header_[4]);
|
|
@@ -140,19 +161,19 @@ public:
|
|
|
140
161
|
key_size_ = std::to_integer<std::uint8_t>(header_[3]);
|
|
141
162
|
} else {
|
|
142
163
|
memcpy(&key_size_, header_.data() + 2, sizeof(key_size_));
|
|
143
|
-
key_size_ = utils::
|
|
164
|
+
key_size_ = utils::network_to_host(key_size_);
|
|
144
165
|
}
|
|
145
166
|
|
|
146
167
|
std::uint32_t field = 0;
|
|
147
168
|
memcpy(&field, header_.data() + 8, sizeof(field));
|
|
148
|
-
body_size_ = utils::
|
|
169
|
+
body_size_ = utils::network_to_host(field);
|
|
149
170
|
data_.resize(body_size_);
|
|
150
171
|
|
|
151
172
|
memcpy(&opaque_, header_.data() + 12, sizeof(opaque_));
|
|
152
|
-
opaque_ = utils::
|
|
173
|
+
opaque_ = utils::network_to_host(opaque_);
|
|
153
174
|
|
|
154
175
|
memcpy(&cas_, header_.data() + 16, sizeof(cas_));
|
|
155
|
-
cas_ = utils::
|
|
176
|
+
cas_ = utils::network_to_host(cas_);
|
|
156
177
|
}
|
|
157
178
|
|
|
158
179
|
[[nodiscard]] auto error_info() const -> std::optional<key_value_extended_error_info>
|
|
@@ -200,7 +221,7 @@ public:
|
|
|
200
221
|
frame_size == 2 && framing_extras_size_ - offset >= frame_size) {
|
|
201
222
|
std::uint16_t encoded_duration{};
|
|
202
223
|
std::memcpy(&encoded_duration, data_.data() + offset, sizeof(encoded_duration));
|
|
203
|
-
encoded_duration = utils::
|
|
224
|
+
encoded_duration = utils::network_to_host(encoded_duration);
|
|
204
225
|
info_.server_duration_us = std::pow(encoded_duration, 1.74) / 2;
|
|
205
226
|
}
|
|
206
227
|
offset += frame_size;
|
|
@@ -42,12 +42,12 @@ protocol::append_response_body::parse(key_value_status_code status,
|
|
|
42
42
|
if (extras_size == 16) {
|
|
43
43
|
std::uint64_t partition_uuid{};
|
|
44
44
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
45
|
-
partition_uuid = utils::
|
|
45
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
46
46
|
offset += 8;
|
|
47
47
|
|
|
48
48
|
std::uint64_t sequence_number{};
|
|
49
49
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
50
|
-
sequence_number = utils::
|
|
50
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
51
51
|
|
|
52
52
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
53
53
|
return true;
|
|
@@ -40,11 +40,11 @@ cluster_map_change_notification_request_body::parse(const header_buffer& header,
|
|
|
40
40
|
offset_type offset = ext_size;
|
|
41
41
|
if (ext_size == 4) {
|
|
42
42
|
memcpy(&protocol_revision_, body.data(), sizeof(protocol_revision_));
|
|
43
|
-
protocol_revision_ = utils::
|
|
43
|
+
protocol_revision_ = utils::network_to_host(protocol_revision_);
|
|
44
44
|
}
|
|
45
45
|
std::uint16_t key_size = 0;
|
|
46
46
|
memcpy(&key_size, header.data() + 2, sizeof(key_size));
|
|
47
|
-
key_size = utils::
|
|
47
|
+
key_size = utils::network_to_host(key_size);
|
|
48
48
|
const auto* data_ptr = reinterpret_cast<const char*>(body.data());
|
|
49
49
|
bucket_.assign(data_ptr + offset, data_ptr + offset + key_size);
|
|
50
50
|
offset += key_size;
|
|
@@ -42,19 +42,19 @@ decrement_response_body::parse(key_value_status_code status,
|
|
|
42
42
|
if (extras_size == 16) {
|
|
43
43
|
std::uint64_t partition_uuid{};
|
|
44
44
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
45
|
-
partition_uuid = utils::
|
|
45
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
46
46
|
offset += 8;
|
|
47
47
|
|
|
48
48
|
std::uint64_t sequence_number{};
|
|
49
49
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
50
|
-
sequence_number = utils::
|
|
50
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
51
51
|
|
|
52
52
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
53
53
|
offset += 8;
|
|
54
54
|
}
|
|
55
55
|
offset += key_size;
|
|
56
56
|
memcpy(&content_, body.data() + offset, sizeof(content_));
|
|
57
|
-
content_ = utils::
|
|
57
|
+
content_ = utils::network_to_host(content_);
|
|
58
58
|
return true;
|
|
59
59
|
}
|
|
60
60
|
return false;
|
|
@@ -82,15 +82,15 @@ decrement_request_body::fill_extras()
|
|
|
82
82
|
using offset_type = std::vector<std::byte>::difference_type;
|
|
83
83
|
offset_type offset = 0;
|
|
84
84
|
|
|
85
|
-
std::uint64_t num = utils::
|
|
85
|
+
std::uint64_t num = utils::host_to_network(delta_);
|
|
86
86
|
memcpy(extras_.data() + offset, &num, sizeof(num));
|
|
87
87
|
offset += static_cast<offset_type>(sizeof(delta_));
|
|
88
88
|
|
|
89
|
-
num = utils::
|
|
89
|
+
num = utils::host_to_network(initial_value_);
|
|
90
90
|
memcpy(extras_.data() + offset, &num, sizeof(num));
|
|
91
91
|
offset += static_cast<offset_type>(sizeof(delta_));
|
|
92
92
|
|
|
93
|
-
std::uint32_t ttl = utils::
|
|
93
|
+
std::uint32_t ttl = utils::host_to_network(expiry_);
|
|
94
94
|
memcpy(extras_.data() + offset, &ttl, sizeof(ttl));
|
|
95
95
|
}
|
|
96
96
|
} // namespace couchbase::core::protocol
|
|
@@ -39,7 +39,7 @@ get_response_body::parse(key_value_status_code status,
|
|
|
39
39
|
std::vector<std::uint8_t>::difference_type offset = framing_extras_size;
|
|
40
40
|
if (extras_size == 4) {
|
|
41
41
|
memcpy(&flags_, body.data() + offset, sizeof(flags_));
|
|
42
|
-
flags_ = utils::
|
|
42
|
+
flags_ = utils::network_to_host(flags_);
|
|
43
43
|
offset += 4;
|
|
44
44
|
} else {
|
|
45
45
|
offset += extras_size;
|
|
@@ -38,7 +38,7 @@ get_and_lock_response_body::parse(key_value_status_code status,
|
|
|
38
38
|
std::vector<std::uint8_t>::difference_type offset = framing_extras_size;
|
|
39
39
|
if (extras_size == 4) {
|
|
40
40
|
memcpy(&flags_, body.data() + offset, sizeof(flags_));
|
|
41
|
-
flags_ = utils::
|
|
41
|
+
flags_ = utils::network_to_host(flags_);
|
|
42
42
|
offset += 4;
|
|
43
43
|
} else {
|
|
44
44
|
offset += extras_size;
|
|
@@ -60,7 +60,7 @@ void
|
|
|
60
60
|
get_and_lock_request_body::fill_extras()
|
|
61
61
|
{
|
|
62
62
|
extras_.resize(sizeof(lock_time_));
|
|
63
|
-
std::uint32_t field = utils::
|
|
63
|
+
std::uint32_t field = utils::host_to_network(lock_time_);
|
|
64
64
|
memcpy(extras_.data(), &field, sizeof(field));
|
|
65
65
|
}
|
|
66
66
|
} // namespace couchbase::core::protocol
|
|
@@ -38,7 +38,7 @@ get_and_touch_response_body::parse(key_value_status_code status,
|
|
|
38
38
|
std::vector<std::uint8_t>::difference_type offset = framing_extras_size;
|
|
39
39
|
if (extras_size == 4) {
|
|
40
40
|
memcpy(&flags_, body.data() + offset, sizeof(flags_));
|
|
41
|
-
flags_ = utils::
|
|
41
|
+
flags_ = utils::network_to_host(flags_);
|
|
42
42
|
offset += 4;
|
|
43
43
|
} else {
|
|
44
44
|
offset += extras_size;
|
|
@@ -60,7 +60,7 @@ void
|
|
|
60
60
|
get_and_touch_request_body::fill_extras()
|
|
61
61
|
{
|
|
62
62
|
extras_.resize(sizeof(expiry_));
|
|
63
|
-
std::uint32_t field = utils::
|
|
63
|
+
std::uint32_t field = utils::host_to_network(expiry_);
|
|
64
64
|
memcpy(extras_.data(), &field, sizeof(field));
|
|
65
65
|
}
|
|
66
66
|
} // namespace couchbase::core::protocol
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
#include "cmd_get_cluster_config.hxx"
|
|
19
19
|
|
|
20
20
|
#include "core/logger/logger.hxx"
|
|
21
|
+
#include "core/logger/redaction.hxx"
|
|
21
22
|
#include "core/topology/configuration_json.hxx"
|
|
22
23
|
#include "core/utils/json.hxx"
|
|
23
24
|
|
|
@@ -77,14 +78,15 @@ get_cluster_config_response_body::parse(key_value_status_code status,
|
|
|
77
78
|
if (status == key_value_status_code::success) {
|
|
78
79
|
const std::vector<std::uint8_t>::difference_type offset =
|
|
79
80
|
framing_extras_size + key_size + extras_size;
|
|
80
|
-
std::string_view config_text{ reinterpret_cast<const char*>(body.data()) + offset,
|
|
81
|
-
|
|
81
|
+
const std::string_view config_text{ reinterpret_cast<const char*>(body.data()) + offset,
|
|
82
|
+
body.size() - static_cast<std::size_t>(offset) };
|
|
82
83
|
try {
|
|
83
84
|
config_ = parse_config(config_text, info.endpoint_address, info.endpoint_port);
|
|
84
85
|
config_text_.emplace(config_text);
|
|
85
86
|
} catch (const tao::pegtl::parse_error& e) {
|
|
86
|
-
CB_LOG_DEBUG(
|
|
87
|
-
|
|
87
|
+
CB_LOG_DEBUG("unable to parse cluster configuration as JSON: {}, {}",
|
|
88
|
+
e.message(),
|
|
89
|
+
logger::metadata(config_text));
|
|
88
90
|
}
|
|
89
91
|
return true;
|
|
90
92
|
}
|
|
@@ -41,11 +41,11 @@ get_collection_id_response_body::parse(key_value_status_code status,
|
|
|
41
41
|
std::vector<std::uint8_t>::difference_type offset = framing_extras_size + key_size;
|
|
42
42
|
|
|
43
43
|
std::memcpy(&manifest_uid_, body.data() + offset, sizeof(manifest_uid_));
|
|
44
|
-
manifest_uid_ = utils::
|
|
44
|
+
manifest_uid_ = utils::network_to_host(manifest_uid_);
|
|
45
45
|
offset += 8;
|
|
46
46
|
|
|
47
47
|
std::memcpy(&collection_uid_, body.data() + offset, sizeof(collection_uid_));
|
|
48
|
-
collection_uid_ = utils::
|
|
48
|
+
collection_uid_ = utils::network_to_host(collection_uid_);
|
|
49
49
|
return true;
|
|
50
50
|
}
|
|
51
51
|
return false;
|
|
@@ -56,7 +56,7 @@ get_error_map_response_body::parse(key_value_status_code status,
|
|
|
56
56
|
void
|
|
57
57
|
get_error_map_request_body::fill_body()
|
|
58
58
|
{
|
|
59
|
-
std::uint16_t version = utils::
|
|
59
|
+
std::uint16_t version = utils::host_to_network(version_);
|
|
60
60
|
value_.resize(sizeof(version));
|
|
61
61
|
std::memcpy(value_.data(), &version, sizeof(version));
|
|
62
62
|
}
|
|
@@ -40,19 +40,19 @@ get_meta_response_body::parse(key_value_status_code status,
|
|
|
40
40
|
if (extras_size == sizeof(deleted_) + sizeof(flags_) + sizeof(expiry_) +
|
|
41
41
|
sizeof(sequence_number_) + sizeof(datatype_)) {
|
|
42
42
|
memcpy(&deleted_, body.data() + offset, sizeof(deleted_));
|
|
43
|
-
deleted_ = utils::
|
|
43
|
+
deleted_ = utils::network_to_host(deleted_);
|
|
44
44
|
offset += 4;
|
|
45
45
|
|
|
46
46
|
memcpy(&flags_, body.data() + offset, sizeof(flags_));
|
|
47
|
-
flags_ = utils::
|
|
47
|
+
flags_ = utils::network_to_host(flags_);
|
|
48
48
|
offset += 4;
|
|
49
49
|
|
|
50
50
|
memcpy(&expiry_, body.data() + offset, sizeof(expiry_));
|
|
51
|
-
expiry_ = utils::
|
|
51
|
+
expiry_ = utils::network_to_host(expiry_);
|
|
52
52
|
offset += 4;
|
|
53
53
|
|
|
54
54
|
memcpy(&sequence_number_, body.data() + offset, sizeof(sequence_number_));
|
|
55
|
-
sequence_number_ = utils::
|
|
55
|
+
sequence_number_ = utils::network_to_host(sequence_number_);
|
|
56
56
|
offset += 8;
|
|
57
57
|
|
|
58
58
|
datatype_ = std::to_integer<std::uint8_t>(body[static_cast<std::size_t>(offset)]);
|
|
@@ -45,7 +45,7 @@ get_replica_response_body::parse(key_value_status_code status,
|
|
|
45
45
|
std::vector<std::uint8_t>::difference_type offset = framing_extras_size;
|
|
46
46
|
if (extras_size == 4) {
|
|
47
47
|
memcpy(&flags_, body.data() + offset, sizeof(flags_));
|
|
48
|
-
flags_ = utils::
|
|
48
|
+
flags_ = utils::network_to_host(flags_);
|
|
49
49
|
offset += 4;
|
|
50
50
|
} else {
|
|
51
51
|
offset += extras_size;
|
|
@@ -48,7 +48,7 @@ hello_response_body::parse(key_value_status_code status,
|
|
|
48
48
|
for (size_t i = 0; i < num_features; i++) {
|
|
49
49
|
std::uint16_t field = 0;
|
|
50
50
|
std::memcpy(&field, value + (i * 2), sizeof(std::uint16_t));
|
|
51
|
-
field = utils::
|
|
51
|
+
field = utils::network_to_host(field);
|
|
52
52
|
if (is_valid_hello_feature(field)) {
|
|
53
53
|
supported_features_.push_back(static_cast<hello_feature>(field));
|
|
54
54
|
}
|
|
@@ -43,19 +43,19 @@ increment_response_body::parse(key_value_status_code status,
|
|
|
43
43
|
if (extras_size == 16) {
|
|
44
44
|
std::uint64_t partition_uuid{};
|
|
45
45
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
46
|
-
partition_uuid = utils::
|
|
46
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
47
47
|
offset += 8;
|
|
48
48
|
|
|
49
49
|
std::uint64_t sequence_number{};
|
|
50
50
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
51
|
-
sequence_number = utils::
|
|
51
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
52
52
|
|
|
53
53
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
54
54
|
offset += 8;
|
|
55
55
|
}
|
|
56
56
|
offset += key_size;
|
|
57
57
|
memcpy(&content_, body.data() + offset, sizeof(content_));
|
|
58
|
-
content_ = utils::
|
|
58
|
+
content_ = utils::network_to_host(content_);
|
|
59
59
|
return true;
|
|
60
60
|
}
|
|
61
61
|
return false;
|
|
@@ -84,15 +84,15 @@ increment_request_body::fill_extras()
|
|
|
84
84
|
using offset_type = std::vector<std::byte>::difference_type;
|
|
85
85
|
offset_type offset = 0;
|
|
86
86
|
|
|
87
|
-
std::uint64_t num = utils::
|
|
87
|
+
std::uint64_t num = utils::host_to_network(delta_);
|
|
88
88
|
memcpy(extras_.data() + offset, &num, sizeof(num));
|
|
89
89
|
offset += static_cast<offset_type>(sizeof(delta_));
|
|
90
90
|
|
|
91
|
-
num = utils::
|
|
91
|
+
num = utils::host_to_network(initial_value_);
|
|
92
92
|
memcpy(extras_.data() + offset, &num, sizeof(num));
|
|
93
93
|
offset += static_cast<offset_type>(sizeof(initial_value_));
|
|
94
94
|
|
|
95
|
-
std::uint32_t ttl = utils::
|
|
95
|
+
std::uint32_t ttl = utils::host_to_network(expiry_);
|
|
96
96
|
memcpy(extras_.data() + offset, &ttl, sizeof(ttl));
|
|
97
97
|
}
|
|
98
98
|
} // namespace couchbase::core::protocol
|
|
@@ -42,12 +42,12 @@ insert_response_body::parse(key_value_status_code status,
|
|
|
42
42
|
if (extras_size == 16) {
|
|
43
43
|
std::uint64_t partition_uuid{};
|
|
44
44
|
memcpy(&partition_uuid, body.data() + offset, sizeof(partition_uuid));
|
|
45
|
-
partition_uuid = utils::
|
|
45
|
+
partition_uuid = utils::network_to_host(partition_uuid);
|
|
46
46
|
offset += 8;
|
|
47
47
|
|
|
48
48
|
std::uint64_t sequence_number{};
|
|
49
49
|
memcpy(&sequence_number, body.data() + offset, sizeof(sequence_number));
|
|
50
|
-
sequence_number = utils::
|
|
50
|
+
sequence_number = utils::network_to_host(sequence_number);
|
|
51
51
|
|
|
52
52
|
token_ = couchbase::utils::build_mutation_token(partition_uuid, sequence_number);
|
|
53
53
|
return true;
|
|
@@ -74,10 +74,10 @@ insert_request_body::fill_extras()
|
|
|
74
74
|
{
|
|
75
75
|
extras_.resize(sizeof(flags_) + sizeof(expiry_));
|
|
76
76
|
|
|
77
|
-
std::uint32_t field = utils::
|
|
77
|
+
std::uint32_t field = utils::host_to_network(flags_);
|
|
78
78
|
memcpy(extras_.data(), &field, sizeof(field));
|
|
79
79
|
|
|
80
|
-
field = utils::
|
|
80
|
+
field = utils::host_to_network(expiry_);
|
|
81
81
|
memcpy(extras_.data() + sizeof(flags_), &field, sizeof(field));
|
|
82
82
|
}
|
|
83
83
|
} // namespace couchbase::core::protocol
|
|
@@ -48,14 +48,14 @@ lookup_in_response_body::parse(key_value_status_code status,
|
|
|
48
48
|
|
|
49
49
|
std::uint16_t entry_status = 0;
|
|
50
50
|
memcpy(&entry_status, body.data() + offset, sizeof(entry_status));
|
|
51
|
-
entry_status = utils::
|
|
51
|
+
entry_status = utils::network_to_host(entry_status);
|
|
52
52
|
Expects(is_valid_status(entry_status));
|
|
53
53
|
field.status = static_cast<key_value_status_code>(entry_status);
|
|
54
54
|
offset += static_cast<offset_type>(sizeof(entry_status));
|
|
55
55
|
|
|
56
56
|
std::uint32_t entry_size = 0;
|
|
57
57
|
memcpy(&entry_size, body.data() + offset, sizeof(entry_size));
|
|
58
|
-
entry_size = utils::
|
|
58
|
+
entry_size = utils::network_to_host(entry_size);
|
|
59
59
|
Expects(entry_size < 20 * 1024 * 1024);
|
|
60
60
|
offset += static_cast<offset_type>(sizeof(entry_size));
|
|
61
61
|
|
|
@@ -101,7 +101,8 @@ lookup_in_request_body::fill_value()
|
|
|
101
101
|
++offset;
|
|
102
102
|
value_[offset] = spec.flags_;
|
|
103
103
|
++offset;
|
|
104
|
-
std::uint16_t path_size =
|
|
104
|
+
std::uint16_t path_size =
|
|
105
|
+
utils::host_to_network(gsl::narrow_cast<std::uint16_t>(spec.path_.size()));
|
|
105
106
|
std::memcpy(value_.data() + offset, &path_size, sizeof(path_size));
|
|
106
107
|
offset += sizeof(path_size);
|
|
107
108
|
std::memcpy(value_.data() + offset, spec.path_.data(), spec.path_.size());
|
|
@@ -47,14 +47,14 @@ lookup_in_replica_response_body::parse(key_value_status_code status,
|
|
|
47
47
|
|
|
48
48
|
std::uint16_t entry_status = 0;
|
|
49
49
|
memcpy(&entry_status, body.data() + offset, sizeof(entry_status));
|
|
50
|
-
entry_status = utils::
|
|
50
|
+
entry_status = utils::network_to_host(entry_status);
|
|
51
51
|
Expects(is_valid_status(entry_status));
|
|
52
52
|
field.status = static_cast<key_value_status_code>(entry_status);
|
|
53
53
|
offset += static_cast<offset_type>(sizeof(entry_status));
|
|
54
54
|
|
|
55
55
|
std::uint32_t entry_size = 0;
|
|
56
56
|
memcpy(&entry_size, body.data() + offset, sizeof(entry_size));
|
|
57
|
-
entry_size = utils::
|
|
57
|
+
entry_size = utils::network_to_host(entry_size);
|
|
58
58
|
Expects(entry_size < 20 * 1024 * 1024);
|
|
59
59
|
offset += static_cast<offset_type>(sizeof(entry_size));
|
|
60
60
|
|
|
@@ -100,7 +100,8 @@ lookup_in_replica_request_body::fill_value()
|
|
|
100
100
|
++offset;
|
|
101
101
|
value_[offset] = spec.flags_;
|
|
102
102
|
++offset;
|
|
103
|
-
std::uint16_t path_size =
|
|
103
|
+
std::uint16_t path_size =
|
|
104
|
+
utils::host_to_network(gsl::narrow_cast<std::uint16_t>(spec.path_.size()));
|
|
104
105
|
std::memcpy(value_.data() + offset, &path_size, sizeof(path_size));
|
|
105
106
|
offset += sizeof(path_size);
|
|
106
107
|
std::memcpy(value_.data() + offset, spec.path_.data(), spec.path_.size());
|