couchbase 3.8.2 → 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 +1 -1
- 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 +121 -55
- 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 +229 -42
- 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 +1 -2
- 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 +309 -301
- 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 +151 -21
- data/ext/couchbase/core/io/streams.hxx +48 -1
- 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/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 +108 -63
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +19 -2
- 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 +165 -72
- 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 +2 -2
- 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 +183 -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 +17 -0
- 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 +174 -42
- 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 +91 -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
|
@@ -18,11 +18,14 @@
|
|
|
18
18
|
#pragma once
|
|
19
19
|
|
|
20
20
|
#include "config_listener.hxx"
|
|
21
|
+
#include "document_id_redaction.hxx"
|
|
21
22
|
#include "io/mcbp_command.hxx"
|
|
23
|
+
#include "logger/redaction.hxx"
|
|
22
24
|
#include "operations.hxx"
|
|
23
25
|
#include "tls_context_provider.hxx"
|
|
24
26
|
|
|
25
27
|
#include <asio/bind_executor.hpp>
|
|
28
|
+
#include <asio/dispatch.hpp>
|
|
26
29
|
#include <asio/io_context.hpp>
|
|
27
30
|
#include <asio/post.hpp>
|
|
28
31
|
#include <asio/ssl.hpp>
|
|
@@ -59,6 +62,7 @@ class bootstrap_state_listener;
|
|
|
59
62
|
class app_telemetry_meter;
|
|
60
63
|
|
|
61
64
|
class bucket_impl;
|
|
65
|
+
class bucket_unit_test_api;
|
|
62
66
|
struct origin;
|
|
63
67
|
|
|
64
68
|
class bucket
|
|
@@ -87,8 +91,21 @@ public:
|
|
|
87
91
|
}
|
|
88
92
|
auto cmd = std::make_shared<operations::mcbp_command<bucket, Request>>(
|
|
89
93
|
ctx_, shared_from_this(), request, default_timeout());
|
|
90
|
-
cmd->
|
|
94
|
+
// Capture the command weakly. The completion is stored as cmd->handler_, so a strong capture
|
|
95
|
+
// forms a cmd -> handler_ -> cmd cycle that is only broken when the handler runs. For
|
|
96
|
+
// cancellable (replica fan-out) operations the completion is dispatched onto the command strand
|
|
97
|
+
// and can be discarded by io_context teardown (close() followed by io_context::stop()) before
|
|
98
|
+
// it runs, which would leak the command and everything it transitively holds (the bucket, its
|
|
99
|
+
// topology configuration, error map and session buffers). The command's lifetime is anchored
|
|
100
|
+
// independently by its deadline timer and session registration, so on any real completion the
|
|
101
|
+
// weak pointer still locks; when it does not, the command has already been torn down and the
|
|
102
|
+
// caller's response was going to be dropped regardless.
|
|
103
|
+
cmd->start([weak_cmd = cmd->weak_from_this(), handler = std::forward<Handler>(handler)](
|
|
91
104
|
std::error_code ec, std::optional<io::mcbp_message>&& msg) mutable {
|
|
105
|
+
auto cmd = weak_cmd.lock();
|
|
106
|
+
if (!cmd) {
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
92
109
|
using encoded_response_type = typename Request::encoded_response_type;
|
|
93
110
|
std::uint16_t status_code = msg ? msg->header.status() : 0xffffU;
|
|
94
111
|
auto resp = msg ? encoded_response_type(std::move(*msg)) : encoded_response_type{};
|
|
@@ -106,47 +123,107 @@ public:
|
|
|
106
123
|
});
|
|
107
124
|
}
|
|
108
125
|
|
|
109
|
-
|
|
126
|
+
[[nodiscard]] auto connect_session(std::size_t index) -> bool;
|
|
110
127
|
|
|
111
128
|
template<typename Request>
|
|
112
129
|
void map_and_send(std::shared_ptr<operations::mcbp_command<bucket, Request>> cmd)
|
|
113
130
|
{
|
|
131
|
+
if constexpr (operations::is_cancellable_operation_v<Request>) {
|
|
132
|
+
// Confine the dispatch path of cancellable (replica fan-out) commands to
|
|
133
|
+
// the command strand, so writes to session_/opaque_ here cannot race a
|
|
134
|
+
// sibling-triggered cancellation arriving on an IO thread. This covers
|
|
135
|
+
// both the initial dispatch and retry re-entry via schedule_for_retry.
|
|
136
|
+
if (!cmd->strand_.running_in_this_thread()) {
|
|
137
|
+
return asio::dispatch(cmd->strand_, [self = shared_from_this(), cmd]() {
|
|
138
|
+
self->map_and_send(cmd);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
|
114
142
|
if (is_closed()) {
|
|
115
143
|
return cmd->cancel(retry_reason::do_not_retry);
|
|
116
144
|
}
|
|
117
145
|
std::size_t index;
|
|
118
146
|
if (cmd->request.id.use_any_session()) {
|
|
147
|
+
// An explicit "any node" request is not subject to routing rules of any
|
|
148
|
+
// kind.
|
|
119
149
|
index = next_session_index();
|
|
120
150
|
} else {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
151
|
+
// A request that resolves its own route may still decline to, in which
|
|
152
|
+
// case it takes the vbucket-map routing below like every other request.
|
|
153
|
+
std::optional<std::size_t> self_routed;
|
|
154
|
+
if constexpr (operations::resolves_own_route_v<Request>) {
|
|
155
|
+
auto config = config_snapshot();
|
|
156
|
+
if (!config) {
|
|
157
|
+
return io::retry_orchestrator::maybe_retry(
|
|
158
|
+
cmd->manager_, cmd, retry_reason::node_not_available, errc::common::request_canceled);
|
|
159
|
+
}
|
|
160
|
+
// Resolution happens on every lap, so a topology that changed between
|
|
161
|
+
// attempts is honoured.
|
|
162
|
+
if (const auto decision = cmd->request.resolve_route(*config); decision.has_value()) {
|
|
163
|
+
// Keep the request's partition in step with the latest resolution on
|
|
164
|
+
// every path, not only the one that dispatches.
|
|
165
|
+
cmd->request.partition = decision->partition;
|
|
166
|
+
if (decision->ec) {
|
|
167
|
+
// Terminal, so the completion is invoked directly: the retry
|
|
168
|
+
// orchestrator consults the request's retry strategy first, and a
|
|
169
|
+
// strategy that retries do_not_retry would loop a condition that
|
|
170
|
+
// cannot resolve itself.
|
|
171
|
+
return cmd->invoke_handler(decision->ec);
|
|
172
|
+
}
|
|
173
|
+
if (!decision->server_index.has_value()) {
|
|
174
|
+
CB_LOG_TRACE(R"([{}] unable to map key="{}" to the node, id={}, partition={}, rev={})",
|
|
175
|
+
log_prefix(),
|
|
176
|
+
logger::document(cmd->request.id),
|
|
177
|
+
cmd->id(),
|
|
178
|
+
decision->partition,
|
|
179
|
+
// The snapshot's own revision, not config_rev(): that
|
|
180
|
+
// reads config_ again and can name a configuration this
|
|
181
|
+
// decision was not taken against.
|
|
182
|
+
config->rev_str());
|
|
183
|
+
return io::retry_orchestrator::maybe_retry(
|
|
184
|
+
cmd->manager_, cmd, retry_reason::node_not_available, errc::common::request_canceled);
|
|
185
|
+
}
|
|
186
|
+
self_routed = decision->server_index;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (self_routed.has_value()) {
|
|
190
|
+
index = self_routed.value();
|
|
191
|
+
} else {
|
|
192
|
+
auto [partition, server] = map_id(cmd->request.id);
|
|
193
|
+
if (!server.has_value()) {
|
|
194
|
+
CB_LOG_TRACE(R"([{}] unable to map key="{}" to the node, id={}, partition={}, rev={})",
|
|
195
|
+
log_prefix(),
|
|
196
|
+
logger::document(cmd->request.id),
|
|
197
|
+
cmd->id(),
|
|
198
|
+
partition,
|
|
199
|
+
config_rev());
|
|
200
|
+
return io::retry_orchestrator::maybe_retry(
|
|
201
|
+
cmd->manager_, cmd, retry_reason::node_not_available, errc::common::request_canceled);
|
|
202
|
+
}
|
|
203
|
+
cmd->request.partition = partition;
|
|
204
|
+
index = server.value();
|
|
131
205
|
}
|
|
132
|
-
cmd->request.partition = partition;
|
|
133
|
-
index = server.value();
|
|
134
206
|
}
|
|
135
207
|
auto session = find_session_by_index(index);
|
|
136
208
|
if (!session || !session->has_config()) {
|
|
137
209
|
CB_LOG_TRACE(
|
|
138
210
|
R"([{}] defer operation id="{}", key="{}", partition={}, index={}, session={}, address="{}", has_config={}, rev={})",
|
|
139
211
|
log_prefix(),
|
|
140
|
-
cmd->
|
|
141
|
-
cmd->request.id,
|
|
212
|
+
cmd->id(),
|
|
213
|
+
logger::document(cmd->request.id),
|
|
142
214
|
cmd->request.partition,
|
|
143
215
|
index,
|
|
144
216
|
session.has_value(),
|
|
145
|
-
session.has_value() ? session->bootstrap_address() : "",
|
|
217
|
+
logger::system_data(session.has_value() ? session->bootstrap_address() : ""),
|
|
146
218
|
session.has_value() && session->has_config(),
|
|
147
219
|
config_rev());
|
|
148
|
-
if (!session) {
|
|
149
|
-
|
|
220
|
+
if (!session && !connect_session(index)) {
|
|
221
|
+
// No bootstrap was started for this node, and only a bootstrap
|
|
222
|
+
// completion or a bucket close drains the deferred queue. Deferring
|
|
223
|
+
// the command here would leave it waiting for its deadline, so retry
|
|
224
|
+
// instead: that re-routes against the current configuration.
|
|
225
|
+
return io::retry_orchestrator::maybe_retry(
|
|
226
|
+
cmd->manager_, cmd, retry_reason::node_not_available, errc::common::request_canceled);
|
|
150
227
|
}
|
|
151
228
|
return defer_command([self = shared_from_this(), cmd](std::error_code ec) {
|
|
152
229
|
if (ec == errc::common::request_canceled) {
|
|
@@ -160,11 +237,11 @@ public:
|
|
|
160
237
|
R"([{}] the session has been found for idx={}, but it is stopped, retrying id={}, key="{}", partition={}, session={}, address="{}", rev={})",
|
|
161
238
|
log_prefix(),
|
|
162
239
|
index,
|
|
163
|
-
cmd->
|
|
164
|
-
cmd->request.id,
|
|
240
|
+
cmd->id(),
|
|
241
|
+
logger::document(cmd->request.id),
|
|
165
242
|
cmd->request.partition,
|
|
166
243
|
session->id(),
|
|
167
|
-
session->bootstrap_address(),
|
|
244
|
+
logger::system_data(session->bootstrap_address()),
|
|
168
245
|
config_rev());
|
|
169
246
|
return io::retry_orchestrator::maybe_retry(
|
|
170
247
|
cmd->manager_, cmd, retry_reason::node_not_available, errc::common::request_canceled);
|
|
@@ -174,11 +251,11 @@ public:
|
|
|
174
251
|
CB_LOG_TRACE(
|
|
175
252
|
R"({} send operation id="{}", key="{}", partition={}, index={}, address="{}", rev={})",
|
|
176
253
|
session->log_prefix(),
|
|
177
|
-
cmd->
|
|
178
|
-
cmd->request.id,
|
|
254
|
+
cmd->id(),
|
|
255
|
+
logger::document(cmd->request.id),
|
|
179
256
|
cmd->request.partition,
|
|
180
257
|
index,
|
|
181
|
-
session->bootstrap_address(),
|
|
258
|
+
logger::system_data(session->bootstrap_address()),
|
|
182
259
|
config_rev());
|
|
183
260
|
cmd->send_to(session.value());
|
|
184
261
|
}
|
|
@@ -225,6 +302,8 @@ public:
|
|
|
225
302
|
[[nodiscard]] auto is_closed() const -> bool;
|
|
226
303
|
[[nodiscard]] auto is_configured() const -> bool;
|
|
227
304
|
|
|
305
|
+
[[nodiscard]] auto unit_test_api() -> bucket_unit_test_api;
|
|
306
|
+
|
|
228
307
|
auto direct_dispatch(std::shared_ptr<mcbp::queue_request> req) -> std::error_code;
|
|
229
308
|
auto direct_re_queue(const std::shared_ptr<mcbp::queue_request>& req, bool is_retry)
|
|
230
309
|
-> std::error_code;
|
|
@@ -237,6 +316,7 @@ private:
|
|
|
237
316
|
[[nodiscard]] auto map_id(const document_id& id)
|
|
238
317
|
-> std::pair<std::uint16_t, std::optional<std::size_t>>;
|
|
239
318
|
[[nodiscard]] auto config_rev() const -> std::string;
|
|
319
|
+
[[nodiscard]] auto config_snapshot() const -> std::shared_ptr<topology::configuration>;
|
|
240
320
|
|
|
241
321
|
asio::io_context& ctx_;
|
|
242
322
|
std::shared_ptr<bucket_impl> impl_;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2020-Present 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 "error_context/key_value_error_map_info.hxx"
|
|
21
|
+
|
|
22
|
+
#include <couchbase/retry_reason.hxx>
|
|
23
|
+
|
|
24
|
+
#include <memory>
|
|
25
|
+
#include <optional>
|
|
26
|
+
#include <system_error>
|
|
27
|
+
|
|
28
|
+
namespace couchbase::core
|
|
29
|
+
{
|
|
30
|
+
class bucket_impl;
|
|
31
|
+
|
|
32
|
+
namespace mcbp
|
|
33
|
+
{
|
|
34
|
+
class queue_request;
|
|
35
|
+
class queue_response;
|
|
36
|
+
} // namespace mcbp
|
|
37
|
+
|
|
38
|
+
class bucket_unit_test_api
|
|
39
|
+
{
|
|
40
|
+
public:
|
|
41
|
+
// The response path a session drives once a request has been written. Reachable in a test only
|
|
42
|
+
// through here: it decides between completing a request and handing it to a retry, and both
|
|
43
|
+
// outcomes have to be checkable without a server.
|
|
44
|
+
void resolve_response(const std::shared_ptr<mcbp::queue_request>& request,
|
|
45
|
+
const std::shared_ptr<mcbp::queue_response>& response,
|
|
46
|
+
std::error_code ec,
|
|
47
|
+
retry_reason reason,
|
|
48
|
+
std::optional<key_value_error_map_info> error_info);
|
|
49
|
+
|
|
50
|
+
private:
|
|
51
|
+
friend class bucket;
|
|
52
|
+
|
|
53
|
+
explicit bucket_unit_test_api(std::shared_ptr<bucket_impl> impl);
|
|
54
|
+
|
|
55
|
+
std::shared_ptr<bucket_impl> impl_;
|
|
56
|
+
};
|
|
57
|
+
} // namespace couchbase::core
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2020-Present 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 "core/tls_verify_mode.hxx"
|
|
21
|
+
|
|
22
|
+
#include <cstddef>
|
|
23
|
+
#include <string_view>
|
|
24
|
+
|
|
25
|
+
namespace couchbase::core
|
|
26
|
+
{
|
|
27
|
+
/**
|
|
28
|
+
* Returns true if @p hostname is the bare "cloud.couchbase.com" or a dot-bounded
|
|
29
|
+
* subdomain of it (e.g. "cb.<tenant>.cloud.couchbase.com").
|
|
30
|
+
*
|
|
31
|
+
* The comparison is:
|
|
32
|
+
* - anchored at the END of the string (a trailing match), so
|
|
33
|
+
* "cloud.couchbase.com.evil.example" does NOT match;
|
|
34
|
+
* - tolerant of a single trailing dot (the FQDN root label), so
|
|
35
|
+
* "cloud.couchbase.com." matches -- otherwise a trailing dot would be a way
|
|
36
|
+
* to slip a Capella host past the forced peer verification (the connection
|
|
37
|
+
* string grammar accepts trailing dots and origin preserves them verbatim);
|
|
38
|
+
* - dot-bounded with a non-empty leftmost label, so "mycloud.couchbase.com"
|
|
39
|
+
* does NOT match (no '.' immediately before the suffix) and neither does the
|
|
40
|
+
* malformed ".cloud.couchbase.com" (empty leftmost label), while the bare
|
|
41
|
+
* domain itself does;
|
|
42
|
+
* - ASCII case-insensitive, because DNS hostnames are case-insensitive, so
|
|
43
|
+
* "Tenant.Cloud.Couchbase.Com" is still recognised as Capella.
|
|
44
|
+
*/
|
|
45
|
+
[[nodiscard]] inline auto
|
|
46
|
+
is_capella_host(std::string_view hostname) -> bool
|
|
47
|
+
{
|
|
48
|
+
static constexpr std::string_view suffix = "cloud.couchbase.com"; // lowercase ASCII
|
|
49
|
+
// Ignore a single trailing dot: "host.cloud.couchbase.com." is the same FQDN
|
|
50
|
+
// as the dotless form and must not be a way to bypass Capella enforcement.
|
|
51
|
+
if (!hostname.empty() && hostname.back() == '.') {
|
|
52
|
+
hostname.remove_suffix(1);
|
|
53
|
+
}
|
|
54
|
+
if (hostname.size() < suffix.size()) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
const auto offset = hostname.size() - suffix.size();
|
|
58
|
+
for (std::size_t i = 0; i < suffix.size(); ++i) {
|
|
59
|
+
auto c = hostname[offset + i];
|
|
60
|
+
if (c >= 'A' && c <= 'Z') {
|
|
61
|
+
c = static_cast<char>(c - 'A' + 'a');
|
|
62
|
+
}
|
|
63
|
+
if (c != suffix[i]) {
|
|
64
|
+
return false;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Either the bare apex domain, or a dot-bounded subdomain whose '.' before the
|
|
68
|
+
// suffix is preceded by at least one label character (so the leading-dot form
|
|
69
|
+
// ".cloud.couchbase.com", with an empty leftmost label, is rejected).
|
|
70
|
+
return offset == 0 || (offset > 1 && hostname[offset - 1] == '.');
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Resolve the TLS peer-verification mode that is actually applied to a
|
|
75
|
+
* connection, given the user-requested @p requested mode and whether any target
|
|
76
|
+
* host is Couchbase Capella (@p connecting_to_capella).
|
|
77
|
+
*
|
|
78
|
+
* Connections to Capella are ALWAYS peer-verified: a user-supplied
|
|
79
|
+
* tls_verify=none is ignored for Capella hosts (returning tls_verify_mode::peer)
|
|
80
|
+
* so that certificate verification cannot be silently disabled against the
|
|
81
|
+
* managed service. For every other host the requested mode is honoured verbatim.
|
|
82
|
+
*/
|
|
83
|
+
[[nodiscard]] inline auto
|
|
84
|
+
effective_tls_verify_mode(tls_verify_mode requested, bool connecting_to_capella) -> tls_verify_mode
|
|
85
|
+
{
|
|
86
|
+
if (connecting_to_capella) {
|
|
87
|
+
return tls_verify_mode::peer;
|
|
88
|
+
}
|
|
89
|
+
return requested;
|
|
90
|
+
}
|
|
91
|
+
} // namespace couchbase::core
|