couchbase 3.1.1-universal-darwin-20 → 3.2.0-universal-darwin-20
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 +3 -1
- data/ext/build_version.hxx.in +1 -1
- data/ext/cmake/Testing.cmake +1 -0
- data/ext/cmake/ThirdPartyDependencies.cmake +6 -0
- data/ext/cmake/VersionInfo.cmake +3 -0
- data/ext/couchbase/bucket.hxx +47 -28
- data/ext/couchbase/cbsasl/client.h +1 -1
- data/ext/couchbase/cbsasl/context.cc +1 -1
- data/ext/couchbase/cbsasl/context.h +3 -3
- data/ext/couchbase/cbsasl/mechanism.cc +5 -8
- data/ext/couchbase/cbsasl/mechanism.h +1 -4
- data/ext/couchbase/cbsasl/plain/plain.cc +1 -1
- data/ext/couchbase/cbsasl/scram-sha/scram-sha.cc +30 -36
- data/ext/couchbase/cluster.hxx +40 -22
- data/ext/couchbase/cluster_options.hxx +7 -1
- data/ext/couchbase/configuration.hxx +37 -16
- data/ext/couchbase/couchbase.cxx +1145 -291
- data/ext/couchbase/error_map.hxx +1 -1
- data/ext/couchbase/errors.hxx +25 -17
- data/ext/couchbase/io/dns_client.hxx +3 -3
- data/ext/couchbase/io/dns_codec.hxx +4 -5
- data/ext/couchbase/io/dns_config.hxx +5 -6
- data/ext/couchbase/io/dns_message.hxx +3 -3
- data/ext/couchbase/io/http_command.hxx +70 -35
- data/ext/couchbase/io/http_session.hxx +4 -3
- data/ext/couchbase/io/http_session_manager.hxx +28 -19
- data/ext/couchbase/io/mcbp_command.hxx +51 -19
- data/ext/couchbase/io/mcbp_context.hxx +1 -1
- data/ext/couchbase/io/mcbp_parser.hxx +4 -4
- data/ext/couchbase/io/mcbp_session.hxx +91 -101
- data/ext/couchbase/io/query_cache.hxx +2 -2
- data/ext/couchbase/io/retry_orchestrator.hxx +2 -4
- data/ext/couchbase/io/retry_reason.hxx +2 -2
- data/ext/couchbase/io/retry_strategy.hxx +1 -6
- data/ext/couchbase/io/streams.hxx +7 -7
- data/ext/couchbase/metrics/logging_meter.hxx +228 -0
- data/ext/couchbase/metrics/logging_meter_options.hxx +28 -0
- data/ext/couchbase/metrics/meter.hxx +49 -0
- data/ext/couchbase/metrics/noop_meter.hxx +43 -0
- data/ext/couchbase/operations.hxx +4 -0
- data/ext/couchbase/operations/analytics_dataset_create.hxx +16 -12
- data/ext/couchbase/operations/analytics_dataset_drop.hxx +11 -11
- data/ext/couchbase/operations/analytics_dataset_get_all.hxx +6 -6
- data/ext/couchbase/operations/analytics_dataverse_create.hxx +10 -11
- data/ext/couchbase/operations/analytics_dataverse_drop.hxx +10 -11
- data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +9 -11
- data/ext/couchbase/operations/analytics_index_create.hxx +14 -13
- data/ext/couchbase/operations/analytics_index_drop.hxx +18 -12
- data/ext/couchbase/operations/analytics_index_get_all.hxx +8 -6
- data/ext/couchbase/operations/analytics_link.hxx +39 -0
- data/ext/couchbase/operations/analytics_link_azure_blob_external.hxx +145 -0
- data/ext/couchbase/operations/analytics_link_connect.hxx +14 -12
- data/ext/couchbase/operations/analytics_link_couchbase_remote.hxx +220 -0
- data/ext/couchbase/operations/analytics_link_create.hxx +128 -0
- data/ext/couchbase/operations/analytics_link_disconnect.hxx +11 -12
- data/ext/couchbase/operations/analytics_link_drop.hxx +130 -0
- data/ext/couchbase/operations/analytics_link_get_all.hxx +160 -0
- data/ext/couchbase/operations/analytics_link_replace.hxx +128 -0
- data/ext/couchbase/operations/analytics_link_s3_external.hxx +122 -0
- data/ext/couchbase/operations/bucket_create.hxx +8 -8
- data/ext/couchbase/operations/bucket_drop.hxx +5 -5
- data/ext/couchbase/operations/bucket_flush.hxx +5 -5
- data/ext/couchbase/operations/bucket_get.hxx +7 -7
- data/ext/couchbase/operations/bucket_get_all.hxx +7 -5
- data/ext/couchbase/operations/bucket_settings.hxx +40 -49
- data/ext/couchbase/operations/bucket_update.hxx +8 -8
- data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +7 -7
- data/ext/couchbase/operations/collection_create.hxx +11 -11
- data/ext/couchbase/operations/collection_drop.hxx +12 -10
- data/ext/couchbase/operations/collections_manifest_get.hxx +3 -3
- data/ext/couchbase/operations/design_document.hxx +2 -2
- data/ext/couchbase/operations/document_analytics.hxx +29 -36
- data/ext/couchbase/operations/document_append.hxx +3 -3
- data/ext/couchbase/operations/document_decrement.hxx +3 -3
- data/ext/couchbase/operations/document_exists.hxx +2 -2
- data/ext/couchbase/operations/document_get.hxx +3 -3
- data/ext/couchbase/operations/document_get_and_lock.hxx +5 -3
- data/ext/couchbase/operations/document_get_and_touch.hxx +5 -3
- data/ext/couchbase/operations/document_get_projected.hxx +10 -11
- data/ext/couchbase/operations/document_increment.hxx +3 -3
- data/ext/couchbase/operations/document_insert.hxx +3 -3
- data/ext/couchbase/operations/document_lookup_in.hxx +12 -18
- data/ext/couchbase/operations/document_mutate_in.hxx +13 -18
- data/ext/couchbase/operations/document_prepend.hxx +3 -3
- data/ext/couchbase/operations/document_query.hxx +39 -41
- data/ext/couchbase/operations/document_remove.hxx +3 -3
- data/ext/couchbase/operations/document_replace.hxx +3 -3
- data/ext/couchbase/operations/document_search.hxx +56 -61
- data/ext/couchbase/operations/document_touch.hxx +3 -3
- data/ext/couchbase/operations/document_unlock.hxx +3 -3
- data/ext/couchbase/operations/document_upsert.hxx +3 -3
- data/ext/couchbase/operations/document_view.hxx +23 -23
- data/ext/couchbase/operations/group_drop.hxx +5 -5
- data/ext/couchbase/operations/group_get.hxx +7 -7
- data/ext/couchbase/operations/group_get_all.hxx +6 -6
- data/ext/couchbase/operations/group_upsert.hxx +11 -11
- data/ext/couchbase/operations/http_noop.hxx +6 -6
- data/ext/couchbase/operations/mcbp_noop.hxx +3 -3
- data/ext/couchbase/operations/query_index_build_deferred.hxx +6 -6
- data/ext/couchbase/operations/query_index_create.hxx +10 -8
- data/ext/couchbase/operations/query_index_drop.hxx +8 -8
- data/ext/couchbase/operations/query_index_get_all.hxx +43 -39
- data/ext/couchbase/operations/rbac.hxx +40 -63
- data/ext/couchbase/operations/role_get_all.hxx +6 -6
- data/ext/couchbase/operations/scope_create.hxx +10 -10
- data/ext/couchbase/operations/scope_drop.hxx +9 -9
- data/ext/couchbase/operations/scope_get_all.hxx +8 -8
- data/ext/couchbase/operations/search_get_stats.hxx +5 -3
- data/ext/couchbase/operations/search_index.hxx +6 -15
- data/ext/couchbase/operations/search_index_analyze_document.hxx +11 -11
- data/ext/couchbase/operations/search_index_control_ingest.hxx +9 -9
- data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +9 -9
- data/ext/couchbase/operations/search_index_control_query.hxx +9 -9
- data/ext/couchbase/operations/search_index_drop.hxx +11 -9
- data/ext/couchbase/operations/search_index_get.hxx +11 -9
- data/ext/couchbase/operations/search_index_get_all.hxx +11 -11
- data/ext/couchbase/operations/search_index_get_documents_count.hxx +10 -10
- data/ext/couchbase/operations/search_index_get_stats.hxx +10 -8
- data/ext/couchbase/operations/search_index_upsert.hxx +12 -10
- data/ext/couchbase/operations/user_drop.hxx +5 -5
- data/ext/couchbase/operations/user_get.hxx +7 -7
- data/ext/couchbase/operations/user_get_all.hxx +6 -6
- data/ext/couchbase/operations/user_upsert.hxx +9 -9
- data/ext/couchbase/operations/view_index_drop.hxx +10 -10
- data/ext/couchbase/operations/view_index_get.hxx +13 -15
- data/ext/couchbase/operations/view_index_get_all.hxx +17 -20
- data/ext/couchbase/operations/view_index_upsert.hxx +9 -7
- data/ext/couchbase/origin.hxx +14 -10
- data/ext/couchbase/platform/backtrace.c +1 -1
- data/ext/couchbase/platform/base64.cc +5 -5
- data/ext/couchbase/platform/base64.h +2 -5
- data/ext/couchbase/protocol/client_opcode.hxx +7 -4
- data/ext/couchbase/protocol/client_request.hxx +2 -2
- data/ext/couchbase/protocol/client_response.hxx +41 -16
- data/ext/couchbase/protocol/cmd_append.hxx +17 -16
- data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +4 -4
- data/ext/couchbase/protocol/cmd_decrement.hxx +10 -11
- data/ext/couchbase/protocol/cmd_exists.hxx +12 -15
- data/ext/couchbase/protocol/cmd_get.hxx +11 -14
- data/ext/couchbase/protocol/cmd_get_and_lock.hxx +10 -12
- data/ext/couchbase/protocol/cmd_get_and_touch.hxx +10 -12
- data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +13 -18
- data/ext/couchbase/protocol/cmd_get_collection_id.hxx +12 -15
- data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +12 -16
- data/ext/couchbase/protocol/cmd_get_error_map.hxx +14 -17
- data/ext/couchbase/protocol/cmd_hello.hxx +8 -10
- data/ext/couchbase/protocol/cmd_increment.hxx +9 -10
- data/ext/couchbase/protocol/cmd_insert.hxx +9 -9
- data/ext/couchbase/protocol/cmd_lookup_in.hxx +12 -13
- data/ext/couchbase/protocol/cmd_mutate_in.hxx +11 -11
- data/ext/couchbase/protocol/cmd_noop.hxx +16 -20
- data/ext/couchbase/protocol/cmd_prepend.hxx +9 -10
- data/ext/couchbase/protocol/cmd_remove.hxx +10 -13
- data/ext/couchbase/protocol/cmd_replace.hxx +7 -7
- data/ext/couchbase/protocol/cmd_sasl_auth.hxx +8 -10
- data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +10 -15
- data/ext/couchbase/protocol/cmd_sasl_step.hxx +10 -12
- data/ext/couchbase/protocol/cmd_select_bucket.hxx +14 -18
- data/ext/couchbase/protocol/cmd_touch.hxx +8 -11
- data/ext/couchbase/protocol/cmd_unlock.hxx +10 -14
- data/ext/couchbase/protocol/cmd_upsert.hxx +8 -8
- data/ext/couchbase/protocol/datatype.hxx +3 -3
- data/ext/couchbase/protocol/durability_level.hxx +2 -2
- data/ext/couchbase/protocol/frame_info_id.hxx +4 -4
- data/ext/couchbase/protocol/hello_feature.hxx +2 -2
- data/ext/couchbase/protocol/magic.hxx +2 -2
- data/ext/couchbase/protocol/server_opcode.hxx +2 -2
- data/ext/couchbase/protocol/server_request.hxx +1 -1
- data/ext/couchbase/protocol/status.hxx +4 -7
- data/ext/couchbase/protocol/unsigned_leb128.h +5 -20
- data/ext/couchbase/service_type.hxx +4 -4
- data/ext/couchbase/tracing/constants.hxx +261 -0
- data/ext/couchbase/tracing/noop_tracer.hxx +50 -0
- data/ext/couchbase/tracing/request_tracer.hxx +77 -0
- data/ext/couchbase/tracing/threshold_logging_options.hxx +64 -0
- data/ext/couchbase/tracing/threshold_logging_tracer.hxx +366 -0
- data/ext/couchbase/utils/byteswap.hxx +1 -1
- data/ext/couchbase/utils/connection_string.hxx +21 -1
- data/ext/couchbase/utils/name_codec.hxx +41 -0
- data/ext/couchbase/utils/url_codec.hxx +236 -0
- data/ext/couchbase/version.hxx +1 -1
- data/ext/test/CMakeLists.txt +1 -0
- data/ext/test/test_native_trivial_query.cxx +60 -0
- data/ext/third_party/hdr_histogram_c/CMakeLists.txt +84 -0
- data/ext/third_party/hdr_histogram_c/COPYING.txt +121 -0
- data/ext/third_party/hdr_histogram_c/LICENSE.txt +41 -0
- data/ext/third_party/hdr_histogram_c/config.cmake.in +6 -0
- data/ext/third_party/hdr_histogram_c/src/CMakeLists.txt +83 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_atomic.h +146 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_encoding.c +322 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_encoding.h +79 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_endian.h +116 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_histogram.c +1196 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_histogram.h +516 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_histogram_log.c +1290 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_histogram_log.h +236 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_histogram_log_no_op.c +171 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_interval_recorder.c +227 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_interval_recorder.h +109 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_malloc.h +19 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_tests.h +22 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_thread.c +108 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_thread.h +55 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_time.c +98 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_time.h +49 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_writer_reader_phaser.c +143 -0
- data/ext/third_party/hdr_histogram_c/src/hdr_writer_reader_phaser.h +51 -0
- data/lib/couchbase/cluster.rb +1 -0
- data/lib/couchbase/errors.rb +3 -0
- data/lib/couchbase/libcouchbase.bundle +0 -0
- data/lib/couchbase/management/analytics_index_manager.rb +920 -226
- data/lib/couchbase/management/bucket_manager.rb +207 -69
- data/lib/couchbase/management/collection_manager.rb +173 -61
- data/lib/couchbase/management/query_index_manager.rb +357 -169
- data/lib/couchbase/options.rb +75 -3
- data/lib/couchbase/scope.rb +102 -0
- data/lib/couchbase/utils/time.rb +4 -0
- data/lib/couchbase/version.rb +6 -6
- metadata +48 -5
data/ext/couchbase/error_map.hxx
CHANGED
@@ -120,7 +120,7 @@ struct error_map {
|
|
120
120
|
std::string description;
|
121
121
|
std::set<attribute> attributes;
|
122
122
|
|
123
|
-
bool has_retry_attribute()
|
123
|
+
bool has_retry_attribute() const
|
124
124
|
{
|
125
125
|
return attributes.find(attribute::retry_now) != attributes.end() || attributes.find(attribute::retry_later) != attributes.end();
|
126
126
|
}
|
data/ext/couchbase/errors.hxx
CHANGED
@@ -244,6 +244,9 @@ enum class analytics_errc {
|
|
244
244
|
|
245
245
|
/// Raised When 24006
|
246
246
|
link_not_found,
|
247
|
+
|
248
|
+
/// Raised When 24055
|
249
|
+
link_exists,
|
247
250
|
};
|
248
251
|
|
249
252
|
/// Errors related to Search service (CBFT)
|
@@ -313,12 +316,12 @@ namespace detail
|
|
313
316
|
struct common_error_category : std::error_category {
|
314
317
|
[[nodiscard]] const char* name() const noexcept override
|
315
318
|
{
|
316
|
-
return "common";
|
319
|
+
return "couchbase.common";
|
317
320
|
}
|
318
321
|
|
319
322
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
320
323
|
{
|
321
|
-
switch (
|
324
|
+
switch (common_errc(ev)) {
|
322
325
|
case common_errc::unambiguous_timeout:
|
323
326
|
return "unambiguous_timeout";
|
324
327
|
case common_errc::ambiguous_timeout:
|
@@ -372,12 +375,12 @@ get_common_category()
|
|
372
375
|
struct key_value_error_category : std::error_category {
|
373
376
|
[[nodiscard]] const char* name() const noexcept override
|
374
377
|
{
|
375
|
-
return "key_value";
|
378
|
+
return "couchbase.key_value";
|
376
379
|
}
|
377
380
|
|
378
381
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
379
382
|
{
|
380
|
-
switch (
|
383
|
+
switch (key_value_errc(ev)) {
|
381
384
|
case key_value_errc::document_not_found:
|
382
385
|
return "document_not_found";
|
383
386
|
case key_value_errc::document_irretrievable:
|
@@ -442,12 +445,12 @@ get_key_value_category()
|
|
442
445
|
struct query_error_category : std::error_category {
|
443
446
|
[[nodiscard]] const char* name() const noexcept override
|
444
447
|
{
|
445
|
-
return "query";
|
448
|
+
return "couchbase.query";
|
446
449
|
}
|
447
450
|
|
448
451
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
449
452
|
{
|
450
|
-
switch (
|
453
|
+
switch (query_errc(ev)) {
|
451
454
|
case query_errc::planning_failure:
|
452
455
|
return "planning_failure";
|
453
456
|
case query_errc::index_failure:
|
@@ -469,12 +472,12 @@ get_query_category()
|
|
469
472
|
struct search_error_category : std::error_category {
|
470
473
|
[[nodiscard]] const char* name() const noexcept override
|
471
474
|
{
|
472
|
-
return "search";
|
475
|
+
return "couchbase.search";
|
473
476
|
}
|
474
477
|
|
475
478
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
476
479
|
{
|
477
|
-
switch (
|
480
|
+
switch (search_errc(ev)) {
|
478
481
|
case search_errc::index_not_ready:
|
479
482
|
return "index_not_ready";
|
480
483
|
case search_errc::consistency_mismatch:
|
@@ -494,12 +497,12 @@ get_search_category()
|
|
494
497
|
struct view_error_category : std::error_category {
|
495
498
|
[[nodiscard]] const char* name() const noexcept override
|
496
499
|
{
|
497
|
-
return "view";
|
500
|
+
return "couchbase.view";
|
498
501
|
}
|
499
502
|
|
500
503
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
501
504
|
{
|
502
|
-
switch (
|
505
|
+
switch (view_errc(ev)) {
|
503
506
|
case view_errc::view_not_found:
|
504
507
|
return "view_not_found";
|
505
508
|
case view_errc::design_document_not_found:
|
@@ -519,12 +522,12 @@ get_view_category()
|
|
519
522
|
struct analytics_error_category : std::error_category {
|
520
523
|
[[nodiscard]] const char* name() const noexcept override
|
521
524
|
{
|
522
|
-
return "analytics";
|
525
|
+
return "couchbase.analytics";
|
523
526
|
}
|
524
527
|
|
525
528
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
526
529
|
{
|
527
|
-
switch (
|
530
|
+
switch (analytics_errc(ev)) {
|
528
531
|
case analytics_errc::compilation_failure:
|
529
532
|
return "compilation_failure";
|
530
533
|
case analytics_errc::job_queue_full:
|
@@ -539,6 +542,8 @@ struct analytics_error_category : std::error_category {
|
|
539
542
|
return "dataverse_exists";
|
540
543
|
case analytics_errc::link_not_found:
|
541
544
|
return "link_not_found";
|
545
|
+
case analytics_errc::link_exists:
|
546
|
+
return "link_exists";
|
542
547
|
}
|
543
548
|
return "FIXME: unknown error code in analytics category (recompile with newer library)";
|
544
549
|
}
|
@@ -554,12 +559,12 @@ get_analytics_category()
|
|
554
559
|
struct management_error_category : std::error_category {
|
555
560
|
[[nodiscard]] const char* name() const noexcept override
|
556
561
|
{
|
557
|
-
return "management";
|
562
|
+
return "couchbase.management";
|
558
563
|
}
|
559
564
|
|
560
565
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
561
566
|
{
|
562
|
-
switch (
|
567
|
+
switch (management_errc(ev)) {
|
563
568
|
case management_errc::collection_exists:
|
564
569
|
return "collection_exists";
|
565
570
|
case management_errc::scope_exists:
|
@@ -589,12 +594,12 @@ get_management_category()
|
|
589
594
|
struct network_error_category : std::error_category {
|
590
595
|
[[nodiscard]] const char* name() const noexcept override
|
591
596
|
{
|
592
|
-
return "network";
|
597
|
+
return "couchbase.network";
|
593
598
|
}
|
594
599
|
|
595
600
|
[[nodiscard]] std::string message(int ev) const noexcept override
|
596
601
|
{
|
597
|
-
switch (
|
602
|
+
switch (network_errc(ev)) {
|
598
603
|
case network_errc::resolve_failure:
|
599
604
|
return "resolve_failure";
|
600
605
|
case network_errc::no_endpoints_left:
|
@@ -654,7 +659,10 @@ struct is_error_code_enum<couchbase::error::management_errc> : true_type {
|
|
654
659
|
template<>
|
655
660
|
struct is_error_code_enum<couchbase::error::network_errc> : true_type {
|
656
661
|
};
|
662
|
+
} // namespace std
|
657
663
|
|
664
|
+
namespace couchbase::error
|
665
|
+
{
|
658
666
|
inline std::error_code
|
659
667
|
make_error_code(couchbase::error::common_errc e)
|
660
668
|
{
|
@@ -703,4 +711,4 @@ make_error_code(couchbase::error::network_errc e)
|
|
703
711
|
return { static_cast<int>(e), couchbase::error::detail::get_network_category() };
|
704
712
|
}
|
705
713
|
|
706
|
-
} // namespace
|
714
|
+
} // namespace couchbase::error
|
@@ -81,7 +81,7 @@ class dns_client
|
|
81
81
|
std::size_t /* bytes_transferred */) mutable {
|
82
82
|
if (ec1 == asio::error::operation_aborted) {
|
83
83
|
self->deadline_.cancel();
|
84
|
-
return handler({
|
84
|
+
return handler({ error::common_errc::unambiguous_timeout });
|
85
85
|
}
|
86
86
|
if (ec1) {
|
87
87
|
self->deadline_.cancel();
|
@@ -148,7 +148,7 @@ class dns_client
|
|
148
148
|
if (ec2) {
|
149
149
|
self->deadline_.cancel();
|
150
150
|
if (ec2 == asio::error::operation_aborted) {
|
151
|
-
ec2 =
|
151
|
+
ec2 = error::common_errc::unambiguous_timeout;
|
152
152
|
}
|
153
153
|
return handler({ ec2 });
|
154
154
|
}
|
@@ -207,7 +207,7 @@ class dns_client
|
|
207
207
|
template<class Handler>
|
208
208
|
void query_srv(const std::string& name, const std::string& service, Handler&& handler)
|
209
209
|
{
|
210
|
-
dns_config& config = dns_config::get();
|
210
|
+
const dns_config& config = dns_config::get();
|
211
211
|
auto cmd = std::make_shared<dns_srv_command>(ctx_, name, service, config.address(), config.port());
|
212
212
|
cmd->execute(config.timeout(), std::forward<Handler>(handler));
|
213
213
|
}
|
@@ -65,7 +65,7 @@ class dns_codec
|
|
65
65
|
std::memcpy(&val, payload.data() + offset, sizeof(std::uint16_t));
|
66
66
|
offset += sizeof(std::uint16_t);
|
67
67
|
val = ntohs(val);
|
68
|
-
qr.type =
|
68
|
+
qr.type = resource_type(val);
|
69
69
|
|
70
70
|
std::memcpy(&val, payload.data() + offset, sizeof(std::uint16_t));
|
71
71
|
offset += sizeof(std::uint16_t);
|
@@ -84,12 +84,12 @@ class dns_codec
|
|
84
84
|
std::memcpy(&val, payload.data() + offset, sizeof(std::uint16_t));
|
85
85
|
offset += sizeof(std::uint16_t);
|
86
86
|
val = ntohs(val);
|
87
|
-
ar.type =
|
87
|
+
ar.type = resource_type(val);
|
88
88
|
|
89
89
|
std::memcpy(&val, payload.data() + offset, sizeof(std::uint16_t));
|
90
90
|
offset += sizeof(std::uint16_t);
|
91
91
|
val = ntohs(val);
|
92
|
-
ar.klass =
|
92
|
+
ar.klass = resource_class(val);
|
93
93
|
|
94
94
|
std::memcpy(&ar.ttl, payload.data() + offset, sizeof(std::uint32_t));
|
95
95
|
offset += static_cast<std::uint16_t>(4U);
|
@@ -196,8 +196,7 @@ class dns_codec
|
|
196
196
|
save_offset = offset + sizeof(std::uint16_t);
|
197
197
|
offset = ptr;
|
198
198
|
} else {
|
199
|
-
|
200
|
-
name.labels.emplace_back(label);
|
199
|
+
name.labels.emplace_back(payload.data() + offset + 1, payload.data() + offset + 1 + len);
|
201
200
|
offset += static_cast<std::uint16_t>(1U + len);
|
202
201
|
}
|
203
202
|
}
|
@@ -19,8 +19,8 @@
|
|
19
19
|
|
20
20
|
#include <unistd.h>
|
21
21
|
|
22
|
-
#include <string>
|
23
22
|
#include <fstream>
|
23
|
+
#include <string>
|
24
24
|
|
25
25
|
#include <asio/ip/address.hpp>
|
26
26
|
|
@@ -31,9 +31,9 @@ namespace couchbase::io::dns
|
|
31
31
|
class dns_config
|
32
32
|
{
|
33
33
|
public:
|
34
|
-
static
|
35
|
-
static
|
36
|
-
static
|
34
|
+
static constexpr auto default_resolv_conf_path = "/etc/resolv.conf";
|
35
|
+
static constexpr auto default_host = "8.8.8.8";
|
36
|
+
static constexpr std::uint16_t default_port = 53;
|
37
37
|
|
38
38
|
[[nodiscard]] const asio::ip::address& address() const
|
39
39
|
{
|
@@ -95,8 +95,7 @@ class dns_config
|
|
95
95
|
if (space == std::string::npos || space == offset || line.size() < space + 2) {
|
96
96
|
continue;
|
97
97
|
}
|
98
|
-
std::string keyword = line.substr(offset, space);
|
99
|
-
if (keyword != "nameserver") {
|
98
|
+
if (std::string keyword = line.substr(offset, space); keyword != "nameserver") {
|
100
99
|
continue;
|
101
100
|
}
|
102
101
|
offset = space + 1;
|
@@ -321,15 +321,15 @@ struct dns_header {
|
|
321
321
|
|
322
322
|
void decode(std::uint16_t blob)
|
323
323
|
{
|
324
|
-
qr =
|
325
|
-
opcode =
|
324
|
+
qr = message_type((static_cast<std::uint32_t>(blob) >> 15U) & 1U);
|
325
|
+
opcode = dns::opcode((static_cast<std::uint32_t>(blob) >> 11U) & 15U);
|
326
326
|
|
327
327
|
aa = ((static_cast<std::uint32_t>(blob) >> 10U) & 1U) != 0U ? authoritative_answer::yes : authoritative_answer::no;
|
328
328
|
tc = ((static_cast<std::uint32_t>(blob) >> 9U) & 1U) != 0U ? truncation::yes : truncation::no;
|
329
329
|
rd = ((static_cast<std::uint32_t>(blob) >> 8U) & 1U) != 0U ? recursion_desired::yes : recursion_desired::no;
|
330
330
|
ra = ((static_cast<std::uint32_t>(blob) >> 7U) & 1U) != 0U ? recursion_available::yes : recursion_available::no;
|
331
331
|
|
332
|
-
rcode =
|
332
|
+
rcode = response_code(blob & 15U);
|
333
333
|
}
|
334
334
|
};
|
335
335
|
|
@@ -19,6 +19,9 @@
|
|
19
19
|
|
20
20
|
#include <io/http_session.hxx>
|
21
21
|
|
22
|
+
#include <tracing/request_tracer.hxx>
|
23
|
+
#include <metrics/meter.hxx>
|
24
|
+
|
22
25
|
namespace couchbase::operations
|
23
26
|
{
|
24
27
|
|
@@ -31,22 +34,37 @@ struct http_command : public std::enable_shared_from_this<http_command<Request>>
|
|
31
34
|
asio::steady_timer retry_backoff;
|
32
35
|
Request request;
|
33
36
|
encoded_request_type encoded;
|
37
|
+
tracing::request_tracer* tracer_;
|
38
|
+
tracing::request_span* span_{ nullptr };
|
39
|
+
metrics::meter* meter_;
|
34
40
|
|
35
|
-
http_command(asio::io_context& ctx, Request req)
|
41
|
+
http_command(asio::io_context& ctx, Request req, tracing::request_tracer* tracer, metrics::meter* meter)
|
36
42
|
: deadline(ctx)
|
37
43
|
, retry_backoff(ctx)
|
38
44
|
, request(req)
|
45
|
+
, tracer_(tracer)
|
46
|
+
, meter_(meter)
|
47
|
+
{
|
48
|
+
}
|
49
|
+
|
50
|
+
void finish_dispatch(const std::string& remote_address, const std::string& local_address)
|
39
51
|
{
|
52
|
+
if (span_ == nullptr) {
|
53
|
+
return;
|
54
|
+
}
|
55
|
+
span_->add_tag(tracing::attributes::remote_socket, remote_address);
|
56
|
+
span_->add_tag(tracing::attributes::local_socket, local_address);
|
57
|
+
span_->end();
|
58
|
+
span_ = nullptr;
|
40
59
|
}
|
41
60
|
|
42
61
|
template<typename Handler>
|
43
62
|
void send_to(std::shared_ptr<io::http_session> session, Handler&& handler)
|
44
63
|
{
|
45
64
|
encoded.type = request.type;
|
46
|
-
auto
|
47
|
-
if (encoding_ec) {
|
65
|
+
if (auto ec = request.encode_to(encoded, session->http_context()); ec) {
|
48
66
|
error_context_type ctx{};
|
49
|
-
ctx.ec =
|
67
|
+
ctx.ec = ec;
|
50
68
|
ctx.client_context_id = request.client_context_id;
|
51
69
|
return handler(make_response(std::move(ctx), request, {}));
|
52
70
|
}
|
@@ -67,37 +85,54 @@ struct http_command : public std::enable_shared_from_this<http_command<Request>>
|
|
67
85
|
request.client_context_id,
|
68
86
|
request.timeout.count(),
|
69
87
|
spdlog::to_hex(encoded.body));
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
88
|
+
span_ = tracer_->start_span(tracing::span_name_for_http_service(request.type), nullptr);
|
89
|
+
span_->add_tag(tracing::attributes::service, tracing::service_name_for_http_service(request.type));
|
90
|
+
span_->add_tag(tracing::attributes::operation_id, request.client_context_id);
|
91
|
+
span_->add_tag(tracing::attributes::local_id, session->id());
|
92
|
+
session->write_and_subscribe(
|
93
|
+
encoded,
|
94
|
+
[self = this->shared_from_this(),
|
95
|
+
log_prefix,
|
96
|
+
session,
|
97
|
+
handler = std::forward<Handler>(handler),
|
98
|
+
start = std::chrono::steady_clock::now()](std::error_code ec, io::http_response&& msg) mutable {
|
99
|
+
static std::string meter_name = "db.couchbase.operations";
|
100
|
+
static std::map<std::string, std::string> tags = {
|
101
|
+
{ "db.couchbase.service", fmt::format("{}", self->request.type) },
|
102
|
+
{ "db.operation", self->encoded.path },
|
103
|
+
};
|
104
|
+
self->meter_->get_value_recorder(meter_name, tags)
|
105
|
+
->record_value(std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::steady_clock::now() - start).count());
|
106
|
+
|
107
|
+
self->deadline.cancel();
|
108
|
+
self->finish_dispatch(session->remote_address(), session->local_address());
|
109
|
+
encoded_response_type resp(msg);
|
110
|
+
spdlog::trace(R"({} HTTP response: {}, client_context_id="{}", status={})",
|
111
|
+
log_prefix,
|
112
|
+
self->request.type,
|
113
|
+
self->request.client_context_id,
|
114
|
+
resp.status_code);
|
115
|
+
SPDLOG_TRACE(R"({} HTTP response: {}, client_context_id="{}", status={}{:a})",
|
116
|
+
log_prefix,
|
117
|
+
self->request.type,
|
118
|
+
self->request.client_context_id,
|
119
|
+
resp.status_code,
|
120
|
+
spdlog::to_hex(resp.body));
|
121
|
+
try {
|
122
|
+
error_context_type ctx{};
|
123
|
+
ctx.ec = ec;
|
124
|
+
ctx.client_context_id = self->request.client_context_id;
|
125
|
+
ctx.method = self->encoded.method;
|
126
|
+
ctx.path = self->encoded.path;
|
127
|
+
ctx.last_dispatched_from = session->local_address();
|
128
|
+
ctx.last_dispatched_to = session->remote_address();
|
129
|
+
ctx.http_status = msg.status_code;
|
130
|
+
ctx.http_body = msg.body;
|
131
|
+
handler(make_response(std::move(ctx), self->request, std::move(msg)));
|
132
|
+
} catch (const priv::retry_http_request&) {
|
133
|
+
self->send_to(session, std::forward<Handler>(handler));
|
134
|
+
}
|
135
|
+
});
|
101
136
|
deadline.expires_after(request.timeout);
|
102
137
|
deadline.async_wait([session](std::error_code ec) {
|
103
138
|
if (ec == asio::error::operation_aborted) {
|
@@ -172,7 +172,7 @@ class http_session : public std::enable_shared_from_this<http_session>
|
|
172
172
|
{
|
173
173
|
std::scoped_lock lock(command_handlers_mutex_);
|
174
174
|
for (auto& handler : command_handlers_) {
|
175
|
-
handler(
|
175
|
+
handler(error::common_errc::ambiguous_timeout, {});
|
176
176
|
}
|
177
177
|
command_handlers_.clear();
|
178
178
|
}
|
@@ -202,7 +202,7 @@ class http_session : public std::enable_shared_from_this<http_session>
|
|
202
202
|
output_buffer_.push_back(buf);
|
203
203
|
}
|
204
204
|
|
205
|
-
void write(const std::
|
205
|
+
void write(const std::string_view& buf)
|
206
206
|
{
|
207
207
|
if (stopped_) {
|
208
208
|
return;
|
@@ -221,7 +221,8 @@ class http_session : public std::enable_shared_from_this<http_session>
|
|
221
221
|
do_write();
|
222
222
|
}
|
223
223
|
|
224
|
-
|
224
|
+
template<typename Handler>
|
225
|
+
void write_and_subscribe(io::http_request& request, Handler&& handler)
|
225
226
|
{
|
226
227
|
if (stopped_) {
|
227
228
|
return;
|
@@ -23,6 +23,9 @@
|
|
23
23
|
#include <operations/http_noop.hxx>
|
24
24
|
#include <io/http_command.hxx>
|
25
25
|
|
26
|
+
#include <tracing/noop_tracer.hxx>
|
27
|
+
#include <metrics/meter.hxx>
|
28
|
+
|
26
29
|
#include <random>
|
27
30
|
|
28
31
|
namespace couchbase::io
|
@@ -38,6 +41,16 @@ class http_session_manager : public std::enable_shared_from_this<http_session_ma
|
|
38
41
|
{
|
39
42
|
}
|
40
43
|
|
44
|
+
void set_tracer(tracing::request_tracer* tracer)
|
45
|
+
{
|
46
|
+
tracer_ = tracer;
|
47
|
+
}
|
48
|
+
|
49
|
+
void set_meter(metrics::meter* meter)
|
50
|
+
{
|
51
|
+
meter_ = meter;
|
52
|
+
}
|
53
|
+
|
41
54
|
void set_configuration(const configuration& config, const cluster_options& options)
|
42
55
|
{
|
43
56
|
options_ = options;
|
@@ -74,7 +87,7 @@ class http_session_manager : public std::enable_shared_from_this<http_session_ma
|
|
74
87
|
template<typename Collector>
|
75
88
|
void ping(std::set<service_type> services, std::shared_ptr<Collector> collector, const couchbase::cluster_credentials& credentials)
|
76
89
|
{
|
77
|
-
std::array<service_type, 4> known_types{ service_type::query, service_type::analytics, service_type::search, service_type::
|
90
|
+
std::array<service_type, 4> known_types{ service_type::query, service_type::analytics, service_type::search, service_type::view };
|
78
91
|
for (auto& node : config_.nodes) {
|
79
92
|
for (auto type : known_types) {
|
80
93
|
if (services.find(type) == services.end()) {
|
@@ -116,7 +129,7 @@ class http_session_manager : public std::enable_shared_from_this<http_session_ma
|
|
116
129
|
busy_sessions_[type].push_back(session);
|
117
130
|
operations::http_noop_request request{};
|
118
131
|
request.type = type;
|
119
|
-
auto cmd = std::make_shared<operations::http_command<operations::http_noop_request>>(ctx_, request);
|
132
|
+
auto cmd = std::make_shared<operations::http_command<operations::http_noop_request>>(ctx_, request, tracer_, meter_);
|
120
133
|
cmd->send_to(
|
121
134
|
session,
|
122
135
|
[start = std::chrono::steady_clock::now(),
|
@@ -153,9 +166,7 @@ class http_session_manager : public std::enable_shared_from_this<http_session_ma
|
|
153
166
|
idle_sessions_[type].remove_if([](const auto& s) -> bool { return !s; });
|
154
167
|
busy_sessions_[type].remove_if([](const auto& s) -> bool { return !s; });
|
155
168
|
if (idle_sessions_[type].empty()) {
|
156
|
-
|
157
|
-
std::uint16_t port = 0;
|
158
|
-
std::tie(hostname, port) = next_node(type);
|
169
|
+
auto [hostname, port] = next_node(type);
|
159
170
|
if (port == 0) {
|
160
171
|
return nullptr;
|
161
172
|
}
|
@@ -214,21 +225,17 @@ class http_session_manager : public std::enable_shared_from_this<http_session_ma
|
|
214
225
|
|
215
226
|
void close()
|
216
227
|
{
|
217
|
-
{
|
218
|
-
for (auto&
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
s.reset();
|
223
|
-
}
|
228
|
+
for (auto& sessions : idle_sessions_) {
|
229
|
+
for (auto& s : sessions.second) {
|
230
|
+
if (s) {
|
231
|
+
s->reset_idle();
|
232
|
+
s.reset();
|
224
233
|
}
|
225
234
|
}
|
226
235
|
}
|
227
|
-
{
|
228
|
-
for (auto&
|
229
|
-
|
230
|
-
s.reset();
|
231
|
-
}
|
236
|
+
for (auto& sessions : busy_sessions_) {
|
237
|
+
for (auto& s : sessions.second) {
|
238
|
+
s.reset();
|
232
239
|
}
|
233
240
|
}
|
234
241
|
}
|
@@ -239,7 +246,7 @@ class http_session_manager : public std::enable_shared_from_this<http_session_ma
|
|
239
246
|
auto candidates = config_.nodes.size();
|
240
247
|
while (candidates > 0) {
|
241
248
|
--candidates;
|
242
|
-
auto& node = config_.nodes[next_index_];
|
249
|
+
const auto& node = config_.nodes[next_index_];
|
243
250
|
next_index_ = (next_index_ + 1) % config_.nodes.size();
|
244
251
|
std::uint16_t port = node.port_or(options_.network, type, options_.enable_tls, 0);
|
245
252
|
if (port != 0) {
|
@@ -252,7 +259,9 @@ class http_session_manager : public std::enable_shared_from_this<http_session_ma
|
|
252
259
|
std::string client_id_;
|
253
260
|
asio::io_context& ctx_;
|
254
261
|
asio::ssl::context& tls_;
|
255
|
-
|
262
|
+
tracing::request_tracer* tracer_{ nullptr };
|
263
|
+
metrics::meter* meter_{ nullptr };
|
264
|
+
cluster_options options_{};
|
256
265
|
|
257
266
|
configuration config_{};
|
258
267
|
std::map<service_type, std::list<std::shared_ptr<http_session>>> busy_sessions_{};
|