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
|
@@ -17,19 +17,24 @@
|
|
|
17
17
|
|
|
18
18
|
#pragma once
|
|
19
19
|
|
|
20
|
+
#include "core/document_id_redaction.hxx"
|
|
20
21
|
#include "core/error_context/key_value.hxx"
|
|
21
22
|
#include "core/impl/lookup_in_replica.hxx"
|
|
22
23
|
#include "core/impl/replica_utils.hxx"
|
|
23
24
|
#include "core/impl/subdoc/command.hxx"
|
|
25
|
+
#include "core/logger/redaction.hxx"
|
|
24
26
|
#include "core/operations/document_lookup_in.hxx"
|
|
25
27
|
#include "core/operations/operation_traits.hxx"
|
|
28
|
+
#include "core/service_type.hxx"
|
|
26
29
|
#include "core/tracing/constants.hxx"
|
|
30
|
+
#include "core/utils/deadline.hxx"
|
|
27
31
|
#include "core/utils/movable_function.hxx"
|
|
28
32
|
|
|
29
33
|
#include <couchbase/codec/encoded_value.hxx>
|
|
30
34
|
#include <couchbase/error_codes.hxx>
|
|
31
35
|
#include <couchbase/node_id.hxx>
|
|
32
36
|
|
|
37
|
+
#include <chrono>
|
|
33
38
|
#include <functional>
|
|
34
39
|
#include <memory>
|
|
35
40
|
#include <mutex>
|
|
@@ -76,231 +81,256 @@ struct lookup_in_all_replicas_request {
|
|
|
76
81
|
template<typename Core, typename Handler>
|
|
77
82
|
void execute(Core core, Handler handler)
|
|
78
83
|
{
|
|
79
|
-
|
|
84
|
+
const auto deadline = std::chrono::steady_clock::now() +
|
|
85
|
+
timeout.value_or(core->default_timeout_for(service_type::key_value));
|
|
86
|
+
core->with_bucket_configuration(
|
|
80
87
|
id.bucket(),
|
|
88
|
+
deadline,
|
|
81
89
|
[core,
|
|
82
90
|
id = id,
|
|
83
|
-
|
|
91
|
+
deadline,
|
|
84
92
|
specs = specs,
|
|
85
93
|
parent_span = parent_span,
|
|
86
94
|
read_preference = read_preference,
|
|
87
95
|
access_deleted = access_deleted,
|
|
88
|
-
h = std::forward<Handler>(handler)](
|
|
96
|
+
h = std::forward<Handler>(handler)](
|
|
97
|
+
std::error_code ec, std::shared_ptr<topology::configuration> config) mutable {
|
|
89
98
|
if (ec) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
first_error_path,
|
|
96
|
-
first_error_index,
|
|
97
|
-
false) });
|
|
99
|
+
return h(response_type{ make_subdocument_error_context(
|
|
100
|
+
make_key_value_error_context(ec, id), ec, {}, {}, false) });
|
|
101
|
+
}
|
|
102
|
+
if (!config->capabilities.supports_subdoc_read_replica()) {
|
|
103
|
+
ec = errc::common::feature_not_available;
|
|
98
104
|
}
|
|
99
|
-
core->with_bucket_configuration(
|
|
100
|
-
id.bucket(),
|
|
101
|
-
[core,
|
|
102
|
-
id,
|
|
103
|
-
timeout,
|
|
104
|
-
specs,
|
|
105
|
-
parent_span,
|
|
106
|
-
read_preference,
|
|
107
|
-
access_deleted,
|
|
108
|
-
h = std::forward<Handler>(h)](std::error_code ec,
|
|
109
|
-
std::shared_ptr<topology::configuration> config) mutable {
|
|
110
|
-
if (!config->capabilities.supports_subdoc_read_replica()) {
|
|
111
|
-
ec = errc::common::feature_not_available;
|
|
112
|
-
}
|
|
113
105
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
106
|
+
const auto [e, origin] = core->origin();
|
|
107
|
+
if (e && !ec) {
|
|
108
|
+
ec = e;
|
|
109
|
+
}
|
|
118
110
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
111
|
+
auto nodes =
|
|
112
|
+
impl::effective_nodes(id, config, read_preference, origin.options().server_group);
|
|
113
|
+
if (nodes.empty()) {
|
|
114
|
+
CB_LOG_DEBUG(
|
|
115
|
+
"Unable to retrieve replicas for \"{}\", server_group={}, number_of_replicas={}",
|
|
116
|
+
logger::document(id),
|
|
117
|
+
logger::metadata(origin.options().server_group),
|
|
118
|
+
config->num_replicas.value_or(0));
|
|
119
|
+
ec = errc::key_value::document_irretrievable;
|
|
120
|
+
}
|
|
129
121
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
122
|
+
if (!ec && specs.empty()) {
|
|
123
|
+
ec = errc::common::invalid_argument;
|
|
124
|
+
}
|
|
133
125
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
126
|
+
if (ec) {
|
|
127
|
+
return h(response_type{ make_subdocument_error_context(
|
|
128
|
+
make_key_value_error_context(ec, id), ec, {}, {}, false) });
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
using handler_type = utils::movable_function<void(response_type)>;
|
|
132
|
+
|
|
133
|
+
struct replica_context {
|
|
134
|
+
replica_context(handler_type handler,
|
|
135
|
+
std::size_t expected_responses,
|
|
136
|
+
std::vector<couchbase::core::impl::subdoc::command> specs)
|
|
137
|
+
: handler_(std::move(handler))
|
|
138
|
+
, expected_responses_(expected_responses)
|
|
139
|
+
, specs_(std::move(specs))
|
|
140
|
+
{
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
void append_synthetic_error_fields(lookup_in_all_replicas_response::entry& entry,
|
|
144
|
+
std::error_code ec,
|
|
145
|
+
std::optional<key_value_status_code> status_code) const
|
|
146
|
+
{
|
|
147
|
+
entry.fields.reserve(specs_.size());
|
|
148
|
+
for (std::size_t i = 0; i < specs_.size(); ++i) {
|
|
149
|
+
const auto& spec = specs_[i];
|
|
150
|
+
lookup_in_all_replicas_response::entry::lookup_in_entry error_field{};
|
|
151
|
+
error_field.path = spec.path_;
|
|
152
|
+
error_field.ec = ec;
|
|
153
|
+
error_field.status = status_code.value_or(key_value_status_code::invalid);
|
|
154
|
+
error_field.original_index = i;
|
|
155
|
+
error_field.exists = false;
|
|
156
|
+
error_field.opcode = static_cast<protocol::subdoc_opcode>(spec.opcode_);
|
|
157
|
+
entry.fields.emplace_back(std::move(error_field));
|
|
137
158
|
}
|
|
159
|
+
}
|
|
138
160
|
|
|
139
|
-
|
|
161
|
+
handler_type handler_;
|
|
162
|
+
std::size_t expected_responses_;
|
|
163
|
+
std::size_t successful_responses_{ 0 };
|
|
164
|
+
bool done_{ false };
|
|
165
|
+
std::mutex mutex_{};
|
|
166
|
+
std::vector<lookup_in_all_replicas_response::entry> result_{};
|
|
167
|
+
std::vector<couchbase::core::impl::subdoc::command> specs_;
|
|
168
|
+
};
|
|
140
169
|
|
|
141
|
-
|
|
142
|
-
replica_context(handler_type handler, std::size_t expected_responses)
|
|
143
|
-
: handler_(std::move(handler))
|
|
144
|
-
, expected_responses_(expected_responses)
|
|
145
|
-
{
|
|
146
|
-
}
|
|
170
|
+
auto ctx = std::make_shared<replica_context>(std::move(h), nodes.size(), specs);
|
|
147
171
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
};
|
|
172
|
+
for (const auto& node : nodes) {
|
|
173
|
+
auto subop_span =
|
|
174
|
+
core->tracer()->create_span(node.is_replica ? tracing::operation::mcbp_lookup_in_replica
|
|
175
|
+
: tracing::operation::mcbp_lookup_in,
|
|
176
|
+
parent_span);
|
|
154
177
|
|
|
155
|
-
|
|
178
|
+
if (subop_span->uses_tags()) {
|
|
179
|
+
subop_span->add_tag(tracing::attributes::op::service, tracing::service::key_value);
|
|
180
|
+
subop_span->add_tag(tracing::attributes::op::operation_name,
|
|
181
|
+
node.is_replica ? tracing::operation::mcbp_lookup_in_replica
|
|
182
|
+
: tracing::operation::mcbp_lookup_in);
|
|
183
|
+
subop_span->add_tag(tracing::attributes::op::bucket_name, id.bucket());
|
|
184
|
+
subop_span->add_tag(tracing::attributes::op::scope_name, id.scope());
|
|
185
|
+
subop_span->add_tag(tracing::attributes::op::collection_name, id.collection());
|
|
186
|
+
}
|
|
156
187
|
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
188
|
+
if (node.is_replica) {
|
|
189
|
+
document_id replica_id{ id };
|
|
190
|
+
replica_id.node_index(node.index);
|
|
191
|
+
auto replica_req = impl::lookup_in_replica_request{
|
|
192
|
+
std::move(replica_id),
|
|
193
|
+
specs,
|
|
194
|
+
utils::remaining_until(deadline),
|
|
195
|
+
subop_span,
|
|
196
|
+
};
|
|
197
|
+
replica_req.access_deleted = access_deleted;
|
|
198
|
+
// CXXCBC-797: Store the requested specs inside replica_context and capture only
|
|
199
|
+
// the ctx shared pointer in the completion handler. This prevents UAF/dangling
|
|
200
|
+
// references and avoids repeated vector allocations, while allowing us to construct
|
|
201
|
+
// synthetic error fields for each requested spec if a node returns a document-level
|
|
202
|
+
// failure.
|
|
203
|
+
core->execute(replica_req, [ctx, subop_span](auto&& resp) {
|
|
204
|
+
{
|
|
205
|
+
if (subop_span->uses_tags()) {
|
|
206
|
+
subop_span->add_tag(tracing::attributes::op::retry_count,
|
|
207
|
+
resp.ctx.retry_attempts());
|
|
208
|
+
}
|
|
209
|
+
subop_span->end();
|
|
210
|
+
}
|
|
211
|
+
handler_type local_handler{};
|
|
212
|
+
{
|
|
213
|
+
const std::scoped_lock lock(ctx->mutex_);
|
|
214
|
+
if (ctx->done_) {
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
--ctx->expected_responses_;
|
|
218
|
+
lookup_in_all_replicas_response::entry top_entry{};
|
|
219
|
+
top_entry.cas = resp.cas;
|
|
220
|
+
top_entry.deleted = resp.deleted;
|
|
221
|
+
top_entry.is_replica = true;
|
|
222
|
+
top_entry.dispatched_to_node_id = resp.ctx.last_dispatched_to_node_id();
|
|
162
223
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
224
|
+
if (resp.ctx.ec() && resp.fields.empty()) {
|
|
225
|
+
// Document-level error for this replica, and no specific field errors.
|
|
226
|
+
// Create synthetic error fields for all requested specs to preserve indices.
|
|
227
|
+
ctx->append_synthetic_error_fields(
|
|
228
|
+
top_entry, resp.ctx.ec(), resp.ctx.status_code());
|
|
229
|
+
} else {
|
|
230
|
+
// Successful response, or response with field-level errors
|
|
231
|
+
++ctx->successful_responses_;
|
|
232
|
+
for (auto& field : resp.fields) {
|
|
233
|
+
lookup_in_all_replicas_response::entry::lookup_in_entry lookup_in_entry{};
|
|
234
|
+
lookup_in_entry.path = field.path;
|
|
235
|
+
lookup_in_entry.value = field.value;
|
|
236
|
+
lookup_in_entry.status = field.status;
|
|
237
|
+
lookup_in_entry.ec = field.ec;
|
|
238
|
+
lookup_in_entry.exists = field.exists;
|
|
239
|
+
lookup_in_entry.original_index = field.original_index;
|
|
240
|
+
lookup_in_entry.opcode = field.opcode;
|
|
241
|
+
top_entry.fields.emplace_back(lookup_in_entry);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
ctx->result_.emplace_back(std::move(top_entry));
|
|
245
|
+
if (ctx->expected_responses_ == 0) {
|
|
246
|
+
ctx->done_ = true;
|
|
247
|
+
if (ctx->successful_responses_ == 0) {
|
|
248
|
+
ctx->result_.clear();
|
|
249
|
+
}
|
|
250
|
+
std::swap(local_handler, ctx->handler_);
|
|
251
|
+
}
|
|
171
252
|
}
|
|
253
|
+
if (local_handler) {
|
|
254
|
+
if (ctx->result_.empty()) {
|
|
255
|
+
// Return an error only when we have no results from any replica.
|
|
256
|
+
return local_handler({ std::move(resp.ctx), {} });
|
|
257
|
+
}
|
|
258
|
+
return local_handler({ {}, std::move(ctx->result_) });
|
|
259
|
+
}
|
|
260
|
+
});
|
|
261
|
+
} else {
|
|
262
|
+
core->execute(
|
|
263
|
+
lookup_in_request{
|
|
264
|
+
document_id{ id },
|
|
265
|
+
{},
|
|
266
|
+
{},
|
|
267
|
+
false,
|
|
268
|
+
specs,
|
|
269
|
+
utils::remaining_until(deadline),
|
|
270
|
+
io::retry_context<false>{}, // Explicit construction to avoid compiler ambiguity
|
|
271
|
+
subop_span,
|
|
272
|
+
},
|
|
273
|
+
[ctx, subop_span](auto&& resp) {
|
|
274
|
+
{
|
|
275
|
+
if (subop_span->uses_tags()) {
|
|
276
|
+
subop_span->add_tag(tracing::attributes::op::retry_count,
|
|
277
|
+
resp.ctx.retry_attempts());
|
|
278
|
+
}
|
|
279
|
+
subop_span->end();
|
|
280
|
+
}
|
|
281
|
+
handler_type local_handler{};
|
|
282
|
+
{
|
|
283
|
+
const std::scoped_lock lock(ctx->mutex_);
|
|
284
|
+
if (ctx->done_) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
--ctx->expected_responses_;
|
|
288
|
+
lookup_in_all_replicas_response::entry top_entry{};
|
|
289
|
+
top_entry.cas = resp.cas;
|
|
290
|
+
top_entry.deleted = resp.deleted;
|
|
291
|
+
top_entry.is_replica = false;
|
|
292
|
+
top_entry.dispatched_to_node_id = resp.ctx.last_dispatched_to_node_id();
|
|
172
293
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
294
|
+
if (resp.ctx.ec() && resp.fields.empty()) {
|
|
295
|
+
// Document-level error for active copy, and no specific field errors.
|
|
296
|
+
// Create synthetic error fields for all requested specs to preserve
|
|
297
|
+
// indices.
|
|
298
|
+
ctx->append_synthetic_error_fields(
|
|
299
|
+
top_entry, resp.ctx.ec(), resp.ctx.status_code());
|
|
300
|
+
} else {
|
|
301
|
+
// Successful response, or response with field-level errors
|
|
302
|
+
++ctx->successful_responses_;
|
|
303
|
+
for (auto& field : resp.fields) {
|
|
304
|
+
lookup_in_all_replicas_response::entry::lookup_in_entry lookup_in_entry{};
|
|
305
|
+
lookup_in_entry.path = field.path;
|
|
306
|
+
lookup_in_entry.value = field.value;
|
|
307
|
+
lookup_in_entry.status = field.status;
|
|
308
|
+
lookup_in_entry.ec = field.ec;
|
|
309
|
+
lookup_in_entry.exists = field.exists;
|
|
310
|
+
lookup_in_entry.original_index = field.original_index;
|
|
311
|
+
lookup_in_entry.opcode = field.opcode;
|
|
312
|
+
top_entry.fields.emplace_back(lookup_in_entry);
|
|
188
313
|
}
|
|
189
|
-
subop_span->end();
|
|
190
314
|
}
|
|
191
|
-
|
|
192
|
-
{
|
|
193
|
-
|
|
194
|
-
if (ctx->
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
--ctx->expected_responses_;
|
|
198
|
-
if (resp.ctx.ec()) {
|
|
199
|
-
if (ctx->expected_responses_ > 0) {
|
|
200
|
-
// just ignore the response
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
} else {
|
|
204
|
-
lookup_in_all_replicas_response::entry top_entry{};
|
|
205
|
-
top_entry.cas = resp.cas;
|
|
206
|
-
top_entry.deleted = resp.deleted;
|
|
207
|
-
top_entry.is_replica = true;
|
|
208
|
-
top_entry.dispatched_to_node_id = resp.ctx.last_dispatched_to_node_id();
|
|
209
|
-
for (auto& field : resp.fields) {
|
|
210
|
-
lookup_in_all_replicas_response::entry::lookup_in_entry lookup_in_entry{};
|
|
211
|
-
lookup_in_entry.path = field.path;
|
|
212
|
-
lookup_in_entry.value = field.value;
|
|
213
|
-
lookup_in_entry.status = field.status;
|
|
214
|
-
lookup_in_entry.ec = field.ec;
|
|
215
|
-
lookup_in_entry.exists = field.exists;
|
|
216
|
-
lookup_in_entry.original_index = field.original_index;
|
|
217
|
-
lookup_in_entry.opcode = field.opcode;
|
|
218
|
-
top_entry.fields.emplace_back(lookup_in_entry);
|
|
219
|
-
}
|
|
220
|
-
ctx->result_.emplace_back(
|
|
221
|
-
lookup_in_all_replicas_response::entry{ top_entry });
|
|
222
|
-
}
|
|
223
|
-
if (ctx->expected_responses_ == 0) {
|
|
224
|
-
ctx->done_ = true;
|
|
225
|
-
std::swap(local_handler, ctx->handler_);
|
|
315
|
+
ctx->result_.emplace_back(std::move(top_entry));
|
|
316
|
+
if (ctx->expected_responses_ == 0) {
|
|
317
|
+
ctx->done_ = true;
|
|
318
|
+
if (ctx->successful_responses_ == 0) {
|
|
319
|
+
ctx->result_.clear();
|
|
226
320
|
}
|
|
321
|
+
std::swap(local_handler, ctx->handler_);
|
|
227
322
|
}
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
}
|
|
233
|
-
return local_handler({ {}, std::move(ctx->result_) });
|
|
323
|
+
}
|
|
324
|
+
if (local_handler) {
|
|
325
|
+
if (ctx->result_.empty()) {
|
|
326
|
+
// Return an error only when we have no results from any replica.
|
|
327
|
+
return local_handler({ std::move(resp.ctx), {} });
|
|
234
328
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
{},
|
|
241
|
-
{},
|
|
242
|
-
false,
|
|
243
|
-
specs,
|
|
244
|
-
timeout,
|
|
245
|
-
{},
|
|
246
|
-
subop_span,
|
|
247
|
-
},
|
|
248
|
-
[ctx, subop_span](auto&& resp) {
|
|
249
|
-
{
|
|
250
|
-
if (subop_span->uses_tags()) {
|
|
251
|
-
subop_span->add_tag(tracing::attributes::op::retry_count,
|
|
252
|
-
resp.ctx.retry_attempts());
|
|
253
|
-
}
|
|
254
|
-
subop_span->end();
|
|
255
|
-
}
|
|
256
|
-
handler_type local_handler{};
|
|
257
|
-
{
|
|
258
|
-
std::scoped_lock lock(ctx->mutex_);
|
|
259
|
-
if (ctx->done_) {
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
--ctx->expected_responses_;
|
|
263
|
-
if (resp.ctx.ec()) {
|
|
264
|
-
if (ctx->expected_responses_ > 0) {
|
|
265
|
-
// just ignore the response
|
|
266
|
-
return;
|
|
267
|
-
}
|
|
268
|
-
} else {
|
|
269
|
-
lookup_in_all_replicas_response::entry top_entry{};
|
|
270
|
-
top_entry.cas = resp.cas;
|
|
271
|
-
top_entry.deleted = resp.deleted;
|
|
272
|
-
top_entry.is_replica = false;
|
|
273
|
-
top_entry.dispatched_to_node_id = resp.ctx.last_dispatched_to_node_id();
|
|
274
|
-
for (auto& field : resp.fields) {
|
|
275
|
-
lookup_in_all_replicas_response::entry::lookup_in_entry lookup_in_entry{};
|
|
276
|
-
lookup_in_entry.path = field.path;
|
|
277
|
-
lookup_in_entry.value = field.value;
|
|
278
|
-
lookup_in_entry.status = field.status;
|
|
279
|
-
lookup_in_entry.ec = field.ec;
|
|
280
|
-
lookup_in_entry.exists = field.exists;
|
|
281
|
-
lookup_in_entry.original_index = field.original_index;
|
|
282
|
-
lookup_in_entry.opcode = field.opcode;
|
|
283
|
-
top_entry.fields.emplace_back(lookup_in_entry);
|
|
284
|
-
}
|
|
285
|
-
ctx->result_.emplace_back(
|
|
286
|
-
lookup_in_all_replicas_response::entry{ top_entry });
|
|
287
|
-
}
|
|
288
|
-
if (ctx->expected_responses_ == 0) {
|
|
289
|
-
ctx->done_ = true;
|
|
290
|
-
std::swap(local_handler, ctx->handler_);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
if (local_handler) {
|
|
294
|
-
if (ctx->result_.empty()) {
|
|
295
|
-
// Return an error only when we have no results from any replica.
|
|
296
|
-
return local_handler({ std::move(resp.ctx), {} });
|
|
297
|
-
}
|
|
298
|
-
return local_handler({ {}, std::move(ctx->result_) });
|
|
299
|
-
}
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
});
|
|
329
|
+
return local_handler({ {}, std::move(ctx->result_) });
|
|
330
|
+
}
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
}
|
|
304
334
|
});
|
|
305
335
|
}
|
|
306
336
|
};
|