couchbase 3.7.0 → 3.8.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 +3 -3
- data/ext/CMakeLists.txt +4 -1
- data/ext/cache/extconf_include.rb +4 -3
- data/ext/cache/mozilla-ca-bundle.crt +66 -93
- data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
- data/ext/couchbase/CMakeLists.txt +24 -11
- data/ext/couchbase/cmake/APKBUILD.in +17 -1
- data/ext/couchbase/cmake/Bundler.cmake +9 -1
- data/ext/couchbase/cmake/Cache.cmake +48 -19
- data/ext/couchbase/cmake/CompilerOptions.cmake +3 -1
- data/ext/couchbase/cmake/OpenSSL.cmake +10 -2
- data/ext/couchbase/cmake/Packaging.cmake +48 -8
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +43 -1
- data/ext/couchbase/cmake/build_config.hxx.in +2 -0
- data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +18 -0
- data/ext/couchbase/cmake/tarball_glob.txt +10 -0
- data/ext/couchbase/core/app_telemetry_meter.cxx +1 -0
- data/ext/couchbase/core/app_telemetry_reporter.cxx +45 -43
- data/ext/couchbase/core/app_telemetry_reporter.hxx +4 -3
- data/ext/couchbase/core/bucket.cxx +128 -13
- data/ext/couchbase/core/bucket.hxx +12 -2
- data/ext/couchbase/core/cluster.cxx +304 -152
- data/ext/couchbase/core/cluster.hxx +32 -0
- data/ext/couchbase/core/cluster_credentials.cxx +25 -0
- data/ext/couchbase/core/cluster_credentials.hxx +5 -0
- data/ext/couchbase/core/cluster_label_listener.cxx +72 -0
- data/ext/couchbase/core/cluster_label_listener.hxx +46 -0
- data/ext/couchbase/core/cluster_options.hxx +4 -0
- data/ext/couchbase/core/deprecation_utils.hxx +26 -0
- data/ext/couchbase/core/error.hxx +27 -0
- data/ext/couchbase/core/free_form_http_request.hxx +0 -2
- data/ext/couchbase/core/http_component.cxx +12 -48
- data/ext/couchbase/core/impl/analytics.cxx +3 -2
- data/ext/couchbase/core/impl/analytics.hxx +2 -1
- data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
- data/ext/couchbase/core/impl/binary_collection.cxx +134 -58
- data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
- data/ext/couchbase/core/impl/collection.cxx +560 -245
- data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
- data/ext/couchbase/core/impl/error.cxx +20 -13
- data/ext/couchbase/core/impl/error.hxx +15 -10
- data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
- data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
- data/ext/couchbase/core/impl/get_replica.hxx +2 -0
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
- data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
- data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
- data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
- data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
- data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
- data/ext/couchbase/core/impl/query.cxx +6 -3
- data/ext/couchbase/core/impl/query.hxx +3 -1
- data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
- data/ext/couchbase/core/impl/scope.cxx +53 -11
- data/ext/couchbase/core/impl/search.cxx +8 -4
- data/ext/couchbase/core/impl/search.hxx +6 -2
- data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
- data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
- data/ext/couchbase/core/io/config_tracker.cxx +9 -9
- data/ext/couchbase/core/io/config_tracker.hxx +2 -1
- data/ext/couchbase/core/io/http_command.hxx +98 -49
- data/ext/couchbase/core/io/http_context.hxx +2 -0
- data/ext/couchbase/core/io/http_session.cxx +23 -10
- data/ext/couchbase/core/io/http_session.hxx +17 -9
- data/ext/couchbase/core/io/http_session_manager.hxx +163 -228
- data/ext/couchbase/core/io/http_traits.hxx +0 -7
- data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
- data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
- data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
- data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
- data/ext/couchbase/core/io/streams.cxx +3 -3
- data/ext/couchbase/core/io/streams.hxx +3 -2
- data/ext/couchbase/core/meta/features.hxx +15 -0
- data/ext/couchbase/core/meta/version.cxx +13 -0
- data/ext/couchbase/core/meta/version.hxx +3 -0
- data/ext/couchbase/core/metrics/constants.hxx +23 -0
- data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
- data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
- data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
- data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
- data/ext/couchbase/core/operations/document_append.hxx +0 -4
- data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
- data/ext/couchbase/core/operations/document_exists.hxx +0 -7
- data/ext/couchbase/core/operations/document_get.hxx +0 -7
- data/ext/couchbase/core/operations/document_get_all_replicas.hxx +77 -27
- data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
- data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
- data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
- data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
- data/ext/couchbase/core/operations/document_increment.hxx +0 -5
- data/ext/couchbase/core/operations/document_insert.hxx +0 -4
- data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +46 -4
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
- data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
- data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
- data/ext/couchbase/core/operations/document_query.hxx +0 -4
- data/ext/couchbase/core/operations/document_remove.hxx +0 -4
- data/ext/couchbase/core/operations/document_replace.hxx +0 -4
- data/ext/couchbase/core/operations/document_search.hxx +0 -7
- data/ext/couchbase/core/operations/document_touch.hxx +0 -7
- data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
- data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
- data/ext/couchbase/core/operations/document_view.cxx +2 -0
- data/ext/couchbase/core/operations/document_view.hxx +10 -13
- data/ext/couchbase/core/operations/http_noop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
- data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
- data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
- data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
- data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
- data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/error_utils.cxx +4 -1
- data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
- data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
- data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
- data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
- data/ext/couchbase/core/operations.hxx +0 -1
- data/ext/couchbase/core/operations_fwd.hxx +8 -0
- data/ext/couchbase/core/origin.cxx +67 -12
- data/ext/couchbase/core/origin.hxx +13 -8
- data/ext/couchbase/core/orphan_reporter.cxx +164 -0
- data/ext/couchbase/core/orphan_reporter.hxx +65 -0
- data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
- data/ext/couchbase/core/sasl/client.cc +6 -0
- data/ext/couchbase/core/sasl/mechanism.cc +2 -1
- data/ext/couchbase/core/sasl/mechanism.h +2 -1
- data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
- data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
- data/ext/couchbase/core/tls_context_provider.cxx +44 -0
- data/ext/couchbase/core/tls_context_provider.hxx +44 -0
- data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
- data/ext/couchbase/core/tracing/constants.hxx +148 -68
- data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
- data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
- data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
- data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
- data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
- data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
- data/ext/couchbase/core/transactions/transactions.cxx +1 -1
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
- data/ext/couchbase/core/utils/byteswap.hxx +12 -0
- data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
- data/ext/couchbase/core/utils/connection_string.cxx +2 -0
- data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
- data/ext/couchbase/couchbase/cluster.hxx +47 -0
- data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
- data/ext/couchbase/couchbase/collection.hxx +60 -15
- data/ext/couchbase/couchbase/error_codes.hxx +48 -48
- data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
- data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
- data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
- data/ext/couchbase/couchbase/network_options.hxx +19 -0
- data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
- data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
- data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
- data/ext/couchbase.cxx +4 -0
- data/ext/extconf.rb +1 -0
- data/ext/rcb_analytics.cxx +157 -47
- data/ext/rcb_backend.cxx +118 -71
- data/ext/rcb_buckets.cxx +39 -16
- data/ext/rcb_collections.cxx +36 -12
- data/ext/rcb_crud.cxx +587 -294
- data/ext/rcb_hdr_histogram.cxx +219 -0
- data/ext/rcb_hdr_histogram.hxx +28 -0
- data/ext/rcb_multi.cxx +142 -59
- data/ext/rcb_observability.cxx +132 -0
- data/ext/rcb_observability.hxx +49 -0
- data/ext/rcb_query.cxx +77 -27
- data/ext/rcb_search.cxx +92 -31
- data/ext/rcb_users.cxx +69 -26
- data/ext/rcb_utils.cxx +91 -0
- data/ext/rcb_utils.hxx +141 -168
- data/ext/rcb_views.cxx +36 -12
- data/lib/active_support/cache/couchbase_store.rb +6 -6
- data/lib/couchbase/authenticator.rb +14 -0
- data/lib/couchbase/binary_collection.rb +37 -22
- data/lib/couchbase/bucket.rb +46 -31
- data/lib/couchbase/cluster.rb +146 -61
- data/lib/couchbase/collection.rb +257 -186
- data/lib/couchbase/datastructures/couchbase_list.rb +81 -50
- data/lib/couchbase/datastructures/couchbase_map.rb +86 -50
- data/lib/couchbase/datastructures/couchbase_queue.rb +64 -38
- data/lib/couchbase/datastructures/couchbase_set.rb +57 -41
- data/lib/couchbase/deprecations.rb +1 -1
- data/lib/couchbase/diagnostics.rb +8 -8
- data/lib/couchbase/errors.rb +6 -0
- data/lib/couchbase/management/analytics_index_manager.rb +90 -59
- data/lib/couchbase/management/bucket_manager.rb +73 -45
- data/lib/couchbase/management/collection_manager.rb +86 -43
- data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
- data/lib/couchbase/management/query_index_manager.rb +88 -36
- data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
- data/lib/couchbase/management/search_index_manager.rb +401 -178
- data/lib/couchbase/management/user_manager.rb +343 -174
- data/lib/couchbase/management/view_index_manager.rb +166 -73
- data/lib/couchbase/metrics/logging_meter.rb +108 -0
- data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
- data/lib/couchbase/metrics/meter.rb +27 -0
- data/lib/couchbase/metrics/noop_meter.rb +30 -0
- data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
- data/lib/couchbase/metrics/value_recorder.rb +25 -0
- data/lib/couchbase/options.rb +69 -3
- data/lib/couchbase/protostellar/cluster.rb +3 -0
- data/lib/couchbase/scope.rb +62 -48
- data/lib/couchbase/search_options.rb +18 -18
- data/lib/couchbase/tracing/noop_span.rb +29 -0
- data/lib/couchbase/tracing/noop_tracer.rb +29 -0
- data/lib/couchbase/tracing/request_span.rb +34 -0
- data/lib/couchbase/tracing/request_tracer.rb +28 -0
- data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
- data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
- data/lib/couchbase/utils/hdr_histogram.rb +55 -0
- data/lib/couchbase/utils/observability.rb +257 -0
- data/lib/couchbase/utils/observability_constants.rb +200 -0
- data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
- data/lib/couchbase/version.rb +1 -1
- data/lib/couchbase.rb +2 -2
- metadata +58 -6
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2025 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
|
+
#include "orphan_reporter.hxx"
|
|
19
|
+
|
|
20
|
+
#include <couchbase/build_info.hxx>
|
|
21
|
+
|
|
22
|
+
#include "logger/logger.hxx"
|
|
23
|
+
#include "utils/concurrent_fixed_priority_queue.hxx"
|
|
24
|
+
#include "utils/json.hxx"
|
|
25
|
+
|
|
26
|
+
#include <asio/steady_timer.hpp>
|
|
27
|
+
#include <tao/json/value.hpp>
|
|
28
|
+
|
|
29
|
+
namespace couchbase::core
|
|
30
|
+
{
|
|
31
|
+
auto
|
|
32
|
+
orphan_attributes::operator<(const orphan_attributes& other) const -> bool
|
|
33
|
+
{
|
|
34
|
+
return total_duration < other.total_duration;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
auto
|
|
38
|
+
orphan_attributes::operator>(const orphan_attributes& other) const -> bool
|
|
39
|
+
{
|
|
40
|
+
return total_duration > other.total_duration;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
auto
|
|
44
|
+
orphan_attributes::to_json() const -> tao::json::value
|
|
45
|
+
{
|
|
46
|
+
return tao::json::value{
|
|
47
|
+
{ "total_duration_us", total_duration.count() },
|
|
48
|
+
{ "last_server_duration_us", last_server_duration.count() },
|
|
49
|
+
{ "total_server_duration_us", total_server_duration.count() },
|
|
50
|
+
{ "operation_name", operation_name },
|
|
51
|
+
{ "last_local_id", connection_id },
|
|
52
|
+
{ "operation_id", operation_id },
|
|
53
|
+
{ "last_local_socket", last_local_socket },
|
|
54
|
+
{ "last_remote_socket", last_remote_socket },
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class orphan_reporter_impl : public std::enable_shared_from_this<orphan_reporter_impl>
|
|
59
|
+
{
|
|
60
|
+
public:
|
|
61
|
+
orphan_reporter_impl(asio::io_context& ctx, const orphan_reporter_options& options)
|
|
62
|
+
: options_{ options }
|
|
63
|
+
, orphan_queue_{ options.sample_size }
|
|
64
|
+
, emit_timer_{ ctx }
|
|
65
|
+
{
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
void add_orphan(orphan_attributes&& orphan)
|
|
69
|
+
{
|
|
70
|
+
orphan_queue_.emplace(std::move(orphan));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
void start()
|
|
74
|
+
{
|
|
75
|
+
rearm();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
void stop()
|
|
79
|
+
{
|
|
80
|
+
emit_timer_.cancel();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
auto flush_and_create_output() -> std::optional<std::string>
|
|
84
|
+
{
|
|
85
|
+
if (orphan_queue_.empty()) {
|
|
86
|
+
return std::nullopt;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
auto [queue, dropped_count] = orphan_queue_.steal_data();
|
|
90
|
+
|
|
91
|
+
auto total_count = queue.size() + dropped_count;
|
|
92
|
+
|
|
93
|
+
// We only do orphan reporting for KV at the moment. If we extend this to HTTP services, we must
|
|
94
|
+
// update this to handle other types of services as well.
|
|
95
|
+
tao::json::value report{
|
|
96
|
+
#if COUCHBASE_CXX_CLIENT_DEBUG_BUILD
|
|
97
|
+
{ "emit_interval_ms", options_.emit_interval.count() },
|
|
98
|
+
{ "sample_size", options_.sample_size },
|
|
99
|
+
#endif
|
|
100
|
+
{ "kv", tao::json::value{ { "total_count", total_count } } },
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
tao::json::value entries = tao::json::empty_array;
|
|
104
|
+
while (!queue.empty()) {
|
|
105
|
+
entries.emplace_back(queue.top().to_json());
|
|
106
|
+
queue.pop();
|
|
107
|
+
}
|
|
108
|
+
report["kv"]["top_requests"] = entries;
|
|
109
|
+
|
|
110
|
+
return utils::json::generate(report);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private:
|
|
114
|
+
void rearm()
|
|
115
|
+
{
|
|
116
|
+
emit_timer_.expires_after(options_.emit_interval);
|
|
117
|
+
emit_timer_.async_wait([self = shared_from_this()](std::error_code ec) -> void {
|
|
118
|
+
if (ec == asio::error::operation_aborted) {
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (auto report = self->flush_and_create_output(); report.has_value()) {
|
|
123
|
+
CB_LOG_WARNING("Orphan responses observed: {}", report.value());
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
self->rearm();
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
orphan_reporter_options options_;
|
|
131
|
+
utils::concurrent_fixed_priority_queue<orphan_attributes> orphan_queue_;
|
|
132
|
+
asio::steady_timer emit_timer_;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
orphan_reporter::orphan_reporter(asio::io_context& ctx, const orphan_reporter_options& options)
|
|
136
|
+
: impl_{ std::make_shared<orphan_reporter_impl>(ctx, options) }
|
|
137
|
+
{
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
void
|
|
141
|
+
orphan_reporter::add_orphan(orphan_attributes&& orphan)
|
|
142
|
+
{
|
|
143
|
+
impl_->add_orphan(std::move(orphan));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
void
|
|
147
|
+
orphan_reporter::start()
|
|
148
|
+
{
|
|
149
|
+
impl_->start();
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
void
|
|
153
|
+
orphan_reporter::stop()
|
|
154
|
+
{
|
|
155
|
+
impl_->stop();
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
auto
|
|
159
|
+
orphan_reporter::flush_and_create_output() -> std::optional<std::string>
|
|
160
|
+
{
|
|
161
|
+
return impl_->flush_and_create_output();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
} // namespace couchbase::core
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2025 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/protocol/client_opcode.hxx"
|
|
21
|
+
|
|
22
|
+
#include <asio/io_context.hpp>
|
|
23
|
+
#include <tao/json/value.hpp>
|
|
24
|
+
|
|
25
|
+
#include <chrono>
|
|
26
|
+
#include <memory>
|
|
27
|
+
|
|
28
|
+
namespace couchbase::core
|
|
29
|
+
{
|
|
30
|
+
struct orphan_reporter_options {
|
|
31
|
+
std::chrono::milliseconds emit_interval{ std::chrono::seconds{ 10 } };
|
|
32
|
+
std::size_t sample_size{ 64 };
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
struct orphan_attributes {
|
|
36
|
+
std::string connection_id;
|
|
37
|
+
std::string operation_id;
|
|
38
|
+
std::string last_remote_socket;
|
|
39
|
+
std::string last_local_socket;
|
|
40
|
+
std::chrono::microseconds total_duration;
|
|
41
|
+
std::chrono::microseconds last_server_duration{ 0 };
|
|
42
|
+
std::chrono::microseconds total_server_duration{ 0 };
|
|
43
|
+
std::string operation_name;
|
|
44
|
+
|
|
45
|
+
auto operator<(const orphan_attributes& other) const -> bool;
|
|
46
|
+
auto operator>(const orphan_attributes& other) const -> bool;
|
|
47
|
+
auto to_json() const -> tao::json::value;
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
class orphan_reporter_impl;
|
|
51
|
+
|
|
52
|
+
class orphan_reporter
|
|
53
|
+
{
|
|
54
|
+
public:
|
|
55
|
+
orphan_reporter(asio::io_context& ctx, const orphan_reporter_options& options);
|
|
56
|
+
|
|
57
|
+
void add_orphan(orphan_attributes&& orphan);
|
|
58
|
+
void start();
|
|
59
|
+
void stop();
|
|
60
|
+
auto flush_and_create_output() -> std::optional<std::string>;
|
|
61
|
+
|
|
62
|
+
private:
|
|
63
|
+
std::shared_ptr<orphan_reporter_impl> impl_;
|
|
64
|
+
};
|
|
65
|
+
} // namespace couchbase::core
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
#include "client.h"
|
|
19
19
|
|
|
20
|
+
#include "core/sasl/oauthbearer/oauthbearer.h"
|
|
20
21
|
#include "core/sasl/plain/plain.h"
|
|
21
22
|
#include "core/sasl/scram-sha/scram-sha.h"
|
|
22
23
|
|
|
@@ -43,6 +44,11 @@ ClientContext::ClientContext(GetUsernameCallback user_cb,
|
|
|
43
44
|
break;
|
|
44
45
|
case Mechanism::PLAIN:
|
|
45
46
|
backend = std::make_unique<mechanism::plain::ClientBackend>(user_cb, password_cb, *this);
|
|
47
|
+
break;
|
|
48
|
+
case Mechanism::OAUTHBEARER:
|
|
49
|
+
backend =
|
|
50
|
+
std::make_unique<mechanism::oauthbearer::ClientBackend>(user_cb, password_cb, *this);
|
|
51
|
+
break;
|
|
46
52
|
}
|
|
47
53
|
|
|
48
54
|
if (!backend) {
|
|
@@ -30,7 +30,8 @@ select_mechanism(const std::vector<std::string>& available_mechanisms) -> Mechan
|
|
|
30
30
|
{ std::string{ "SCRAM-SHA512" }, Mechanism::SCRAM_SHA512 },
|
|
31
31
|
{ std::string{ "SCRAM-SHA256" }, Mechanism::SCRAM_SHA256 },
|
|
32
32
|
{ std::string{ "SCRAM-SHA1" }, Mechanism::SCRAM_SHA1 },
|
|
33
|
-
{ std::string{ "PLAIN" }, Mechanism::PLAIN }
|
|
33
|
+
{ std::string{ "PLAIN" }, Mechanism::PLAIN },
|
|
34
|
+
{ std::string{ "OAUTHBEARER" }, Mechanism::OAUTHBEARER },
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
for (const auto& [name, code] : mechs) {
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright 2018 Couchbase, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
#include "oauthbearer.h"
|
|
18
|
+
|
|
19
|
+
#include <spdlog/fmt/bundled/core.h>
|
|
20
|
+
|
|
21
|
+
namespace couchbase::core::sasl::mechanism::oauthbearer
|
|
22
|
+
{
|
|
23
|
+
auto
|
|
24
|
+
ClientBackend::start() -> std::pair<error, std::string_view>
|
|
25
|
+
{
|
|
26
|
+
auto header = std::string{ "n,," };
|
|
27
|
+
header.push_back(0x01);
|
|
28
|
+
header.append(fmt::format("auth=Bearer {}", passwordCallback()));
|
|
29
|
+
header.push_back(0x01);
|
|
30
|
+
header.push_back(0x01);
|
|
31
|
+
client_message = header;
|
|
32
|
+
return { error::OK, client_message };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
auto
|
|
36
|
+
ClientBackend::step(std::string_view /*input*/) -> std::pair<error, std::string_view>
|
|
37
|
+
{
|
|
38
|
+
throw std::logic_error("ClientBackend::step(): OAUTHBEARER auth should not call step");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
} // namespace couchbase::core::sasl::mechanism::oauthbearer
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2016 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
|
+
#pragma once
|
|
18
|
+
|
|
19
|
+
#include "core/sasl/client.h"
|
|
20
|
+
|
|
21
|
+
/// Extremely simple prototype of an OAUTHBEARER mechanism as
|
|
22
|
+
/// desceribed in https://datatracker.ietf.org/doc/html/rfc7628 and
|
|
23
|
+
/// https://datatracker.ietf.org/doc/html/rfc6750
|
|
24
|
+
namespace couchbase::core::sasl::mechanism::oauthbearer
|
|
25
|
+
{
|
|
26
|
+
|
|
27
|
+
class ClientBackend : public MechanismBackend
|
|
28
|
+
{
|
|
29
|
+
public:
|
|
30
|
+
ClientBackend(GetUsernameCallback& user_cb, GetPasswordCallback& password_cb, ClientContext& ctx)
|
|
31
|
+
: MechanismBackend(user_cb, password_cb, ctx)
|
|
32
|
+
{
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
[[nodiscard]] auto get_name() const -> std::string_view override
|
|
36
|
+
{
|
|
37
|
+
return "OAUTHBEARER";
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
auto start() -> std::pair<error, std::string_view> override;
|
|
41
|
+
|
|
42
|
+
auto step(std::string_view) -> std::pair<error, std::string_view> override;
|
|
43
|
+
|
|
44
|
+
private:
|
|
45
|
+
std::string client_message;
|
|
46
|
+
};
|
|
47
|
+
} // namespace couchbase::core::sasl::mechanism::oauthbearer
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2022-Present Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
|
6
|
+
* except in compliance with the License. You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
11
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
12
|
+
* ANY KIND, either express or implied. See the License for the specific language governing
|
|
13
|
+
* permissions and limitations under the License.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#include "tls_context_provider.hxx"
|
|
17
|
+
|
|
18
|
+
#include <asio/ssl/context.hpp>
|
|
19
|
+
|
|
20
|
+
namespace couchbase::core
|
|
21
|
+
{
|
|
22
|
+
|
|
23
|
+
tls_context_provider::tls_context_provider()
|
|
24
|
+
: ctx_(std::make_shared<asio::ssl::context>(asio::ssl::context::tls_client))
|
|
25
|
+
{
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
tls_context_provider::tls_context_provider(std::shared_ptr<asio::ssl::context> ctx)
|
|
29
|
+
: ctx_(std::move(ctx))
|
|
30
|
+
{
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
auto
|
|
34
|
+
tls_context_provider::get_ctx() const -> std::shared_ptr<asio::ssl::context>
|
|
35
|
+
{
|
|
36
|
+
return std::atomic_load(&ctx_);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
void
|
|
40
|
+
tls_context_provider::set_ctx(std::shared_ptr<asio::ssl::context> new_ctx)
|
|
41
|
+
{
|
|
42
|
+
std::atomic_store(&ctx_, std::move(new_ctx));
|
|
43
|
+
}
|
|
44
|
+
} // namespace couchbase::core
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2022-Present Couchbase, Inc.
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
|
|
6
|
+
* except in compliance with the License. You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software distributed under
|
|
11
|
+
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
|
|
12
|
+
* ANY KIND, either express or implied. See the License for the specific language governing
|
|
13
|
+
* permissions and limitations under the License.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
#pragma once
|
|
17
|
+
|
|
18
|
+
#include <memory>
|
|
19
|
+
|
|
20
|
+
namespace asio
|
|
21
|
+
{
|
|
22
|
+
namespace ssl
|
|
23
|
+
{
|
|
24
|
+
class context;
|
|
25
|
+
} // namespace ssl
|
|
26
|
+
} // namespace asio
|
|
27
|
+
|
|
28
|
+
namespace couchbase::core
|
|
29
|
+
{
|
|
30
|
+
|
|
31
|
+
class tls_context_provider
|
|
32
|
+
{
|
|
33
|
+
public:
|
|
34
|
+
tls_context_provider();
|
|
35
|
+
|
|
36
|
+
explicit tls_context_provider(std::shared_ptr<asio::ssl::context> ctx);
|
|
37
|
+
|
|
38
|
+
void set_ctx(std::shared_ptr<asio::ssl::context> new_ctx);
|
|
39
|
+
[[nodiscard]] auto get_ctx() const -> std::shared_ptr<asio::ssl::context>;
|
|
40
|
+
|
|
41
|
+
private:
|
|
42
|
+
std::shared_ptr<asio::ssl::context> ctx_;
|
|
43
|
+
};
|
|
44
|
+
} // namespace couchbase::core
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2025 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 <couchbase/durability_level.hxx>
|
|
21
|
+
#include <couchbase/tracing/request_span.hxx>
|
|
22
|
+
|
|
23
|
+
#include "constants.hxx"
|
|
24
|
+
|
|
25
|
+
namespace couchbase::core::tracing
|
|
26
|
+
{
|
|
27
|
+
void inline set_durability_level_attribute(
|
|
28
|
+
const std::shared_ptr<couchbase::tracing::request_span>& span,
|
|
29
|
+
const durability_level durability)
|
|
30
|
+
{
|
|
31
|
+
switch (durability) {
|
|
32
|
+
case durability_level::none:
|
|
33
|
+
break;
|
|
34
|
+
case durability_level::majority:
|
|
35
|
+
span->add_tag(attributes::op::durability_level, "majority");
|
|
36
|
+
break;
|
|
37
|
+
case durability_level::majority_and_persist_to_active:
|
|
38
|
+
span->add_tag(attributes::op::durability_level, "majority_and_persist_active");
|
|
39
|
+
break;
|
|
40
|
+
case durability_level::persist_to_majority:
|
|
41
|
+
span->add_tag(attributes::op::durability_level, "persist_majority");
|
|
42
|
+
break;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
} // namespace couchbase::core::tracing
|