From ff58fd99bfd2d60f0867ae6aeb7ce04cd07b8ad3 Mon Sep 17 00:00:00 2001 From: stanislav_shchetinin Date: Fri, 21 Feb 2025 10:59:29 +0000 Subject: [PATCH 1/7] Import changefeed's configuration from s3 (#13943) --- include/ydb-cpp-sdk/client/import/import.h | 1 + src/api/protos/ydb_import.proto | 1 + src/client/proto/accessor.cpp | 2 ++ 3 files changed, 4 insertions(+) diff --git a/include/ydb-cpp-sdk/client/import/import.h b/include/ydb-cpp-sdk/client/import/import.h index 3e6b191cbf..d4975e7562 100644 --- a/include/ydb-cpp-sdk/client/import/import.h +++ b/include/ydb-cpp-sdk/client/import/import.h @@ -17,6 +17,7 @@ enum class EImportProgress { Done = 4, Cancellation = 5, Cancelled = 6, + CreateChangefeeds = 7, Unknown = std::numeric_limits::max(), }; diff --git a/src/api/protos/ydb_import.proto b/src/api/protos/ydb_import.proto index 82b661962c..c7f7b586ea 100644 --- a/src/api/protos/ydb_import.proto +++ b/src/api/protos/ydb_import.proto @@ -19,6 +19,7 @@ message ImportProgress { PROGRESS_DONE = 4; PROGRESS_CANCELLATION = 5; PROGRESS_CANCELLED = 6; + PROGRESS_CREATE_CHANGEFEEDS = 7; } } diff --git a/src/client/proto/accessor.cpp b/src/client/proto/accessor.cpp index 9adbba5c0e..fa85db31ae 100644 --- a/src/client/proto/accessor.cpp +++ b/src/client/proto/accessor.cpp @@ -124,6 +124,8 @@ NImport::EImportProgress TProtoAccessor::FromProto(Ydb::Import::ImportProgress:: return NImport::EImportProgress::TransferData; case Ydb::Import::ImportProgress::PROGRESS_BUILD_INDEXES: return NImport::EImportProgress::BuildIndexes; + case Ydb::Import::ImportProgress::PROGRESS_CREATE_CHANGEFEEDS: + return NImport::EImportProgress::CreateChangefeeds; case Ydb::Import::ImportProgress::PROGRESS_DONE: return NImport::EImportProgress::Done; case Ydb::Import::ImportProgress::PROGRESS_CANCELLATION: From f5114c7c7b5623dfec4f9b30905434c01b3fcb89 Mon Sep 17 00:00:00 2001 From: Innokentii Mokin Date: Fri, 21 Feb 2025 11:00:03 +0000 Subject: [PATCH 2/7] Make config api from bsconfig api (#14617) --- .../client/bsconfig/storage_config.h | 69 ------- include/ydb-cpp-sdk/client/config/config.h | 120 ++++++++++++ .../ydb-cpp-sdk/client/types/status/status.h | 1 + src/api/grpc/ydb_bsconfig_v1.proto | 22 --- src/api/grpc/ydb_config_v1.proto | 20 ++ src/api/protos/ydb_bsconfig.proto | 53 ----- src/api/protos/ydb_config.proto | 183 +++++++++++++++++ src/client/bsconfig/storage_config.cpp | 108 ---------- src/client/config/config.cpp | 184 ++++++++++++++++++ src/client/types/status/status.cpp | 4 + 10 files changed, 512 insertions(+), 252 deletions(-) delete mode 100644 include/ydb-cpp-sdk/client/bsconfig/storage_config.h create mode 100644 include/ydb-cpp-sdk/client/config/config.h delete mode 100644 src/api/grpc/ydb_bsconfig_v1.proto create mode 100644 src/api/grpc/ydb_config_v1.proto delete mode 100644 src/api/protos/ydb_bsconfig.proto create mode 100644 src/api/protos/ydb_config.proto delete mode 100644 src/client/bsconfig/storage_config.cpp create mode 100644 src/client/config/config.cpp diff --git a/include/ydb-cpp-sdk/client/bsconfig/storage_config.h b/include/ydb-cpp-sdk/client/bsconfig/storage_config.h deleted file mode 100644 index a6196feded..0000000000 --- a/include/ydb-cpp-sdk/client/bsconfig/storage_config.h +++ /dev/null @@ -1,69 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include - -#include -#include - -namespace NYdb::inline V3::NStorageConfig { - -struct TFetchStorageConfigResult : public TStatus { - TFetchStorageConfigResult( - TStatus&& status, - std::string&& config, - std::string&& storage_config) - : TStatus(std::move(status)) - , Config_(std::move(config)) - , StorageConfig_(std::move(storage_config)) - {} - - const std::string& GetConfig() const { - return Config_; - } - - const std::string& GetStorageConfig() const { - return StorageConfig_; - } - -private: - std::string Config_; - std::string StorageConfig_; -}; - -using TAsyncFetchStorageConfigResult = NThreading::TFuture; - -struct TReplaceStorageConfigSettings : public NYdb::TOperationRequestSettings {}; -struct TFetchStorageConfigSettings : public NYdb::TOperationRequestSettings {}; -struct TBootstrapClusterSettings : public NYdb::TOperationRequestSettings {}; - -class TStorageConfigClient { -public: - explicit TStorageConfigClient(const TDriver& driver, const TCommonClientSettings& settings = {}); - - ~TStorageConfigClient(); - - // Replace config - TAsyncStatus ReplaceStorageConfig(const std::optional& yaml_config, - const std::optional& storage_yaml_config, - std::optional switch_dedicated_storage_section, - bool dedicated_config_mode, - const TReplaceStorageConfigSettings& settings = {}); - - // Fetch current cluster storage config - TAsyncFetchStorageConfigResult FetchStorageConfig(bool dedicated_storage_section, bool dedicated_cluster_section, - const TFetchStorageConfigSettings& settings = {}); - - // Bootstrap cluster with automatic configuration - TAsyncStatus BootstrapCluster(const std::string& selfAssemblyUUID, const TBootstrapClusterSettings& settings = {}); - -private: - class TImpl; - - std::unique_ptr Impl_; -}; - -} diff --git a/include/ydb-cpp-sdk/client/config/config.h b/include/ydb-cpp-sdk/client/config/config.h new file mode 100644 index 0000000000..e4fdb38e58 --- /dev/null +++ b/include/ydb-cpp-sdk/client/config/config.h @@ -0,0 +1,120 @@ +#pragma once + +#include +#include +#include +#include +#include + +#include +#include + +namespace NYdb::inline V3::NConfig { + +struct TReplaceConfigSettings : public NYdb::TOperationRequestSettings { + FLUENT_SETTING_FLAG(DryRun); + FLUENT_SETTING_FLAG(AllowUnknownFields); + FLUENT_SETTING_FLAG(BypassChecks); +}; + +enum class EFetchAllConfigsTransform { + NONE, + DETACH_STORAGE_CONFIG_SECTION, + ATTACH_STORAGE_CONFIG_SECTION, +}; + +struct TFetchAllConfigsSettings : public NYdb::TOperationRequestSettings { + FLUENT_SETTING(EFetchAllConfigsTransform, Transform); +}; + +struct TBootstrapClusterSettings : public NYdb::TOperationRequestSettings {}; + +struct TMainConfigIdentity { + ui64 Version; + TString Cluster; +}; + +struct TStorageConfigIdentity { + ui64 Version; + TString Cluster; +}; + +struct TDatabaseConfigIdentity { + ui64 Version; + TString Cluster; + TString Database; +}; + +using TIdentityTypes = std::variant< + std::monostate + , TMainConfigIdentity + , TStorageConfigIdentity + , TDatabaseConfigIdentity + >; + +struct TConfig { + TIdentityTypes Identity; + TString Config; +}; + +struct TFetchConfigResult : public TStatus { + TFetchConfigResult( + TStatus&& status, + std::vector&& configs) + : TStatus(std::move(status)) + , Configs_(std::move(configs)) + {} + + const std::vector& GetConfigs() const { + return Configs_; + } + +private: + std::vector Configs_; +}; + +using TAsyncFetchConfigResult = NThreading::TFuture; + +class TConfigClient { +public: + explicit TConfigClient(const TDriver& driver, const TCommonClientSettings& settings = {}); + + ~TConfigClient(); + + // Replace config + TAsyncStatus ReplaceConfig( + const TString& mainConfig, + const TReplaceConfigSettings& settings = {}); + + // Replace config + TAsyncStatus ReplaceConfig( + const TString& mainConfig, + const TString& storageConfig, + const TReplaceConfigSettings& settings = {}); + + // Replace config + TAsyncStatus ReplaceConfigDisableDedicatedStorageSection( + const TString& mainConfig, + const TReplaceConfigSettings& settings = {}); + + // Replace config + TAsyncStatus ReplaceConfigEnableDedicatedStorageSection( + const TString& mainConfig, + const TString& storageConfig, + const TReplaceConfigSettings& settings = {}); + + // Fetch current cluster storage config + TAsyncFetchConfigResult FetchAllConfigs(const TFetchAllConfigsSettings& settings = {}); + + // Bootstrap cluster with automatic configuration + TAsyncStatus BootstrapCluster( + const TString& selfAssemblyUUID, + const TBootstrapClusterSettings& settings = {}); + +private: + class TImpl; + + std::unique_ptr Impl_; +}; + +} diff --git a/include/ydb-cpp-sdk/client/types/status/status.h b/include/ydb-cpp-sdk/client/types/status/status.h index 96314b6e2d..76d2d70934 100644 --- a/include/ydb-cpp-sdk/client/types/status/status.h +++ b/include/ydb-cpp-sdk/client/types/status/status.h @@ -25,6 +25,7 @@ class TStatus { const NYdb::NIssue::TIssues& GetIssues() const; bool IsSuccess() const; bool IsTransportError() const; + bool IsUnimplementedError() const; const std::string& GetEndpoint() const; const std::multimap& GetResponseMetadata() const; float GetConsumedRu() const; diff --git a/src/api/grpc/ydb_bsconfig_v1.proto b/src/api/grpc/ydb_bsconfig_v1.proto deleted file mode 100644 index 137f7a6d2e..0000000000 --- a/src/api/grpc/ydb_bsconfig_v1.proto +++ /dev/null @@ -1,22 +0,0 @@ -syntax = "proto3"; - -package Ydb.BSConfig.V1; - -option java_package = "com.yandex.ydb.bsconfig.v1"; -option java_outer_classname = "BSConfigGrpc"; -option java_multiple_files = true; - -import "src/api/protos/ydb_bsconfig.proto"; - -service BSConfigService { - - // Initialize Blobstorage/single config - rpc ReplaceStorageConfig(BSConfig.ReplaceStorageConfigRequest) returns (BSConfig.ReplaceStorageConfigResponse); - - // Fetch Blobstorage/single config - rpc FetchStorageConfig(BSConfig.FetchStorageConfigRequest) returns (BSConfig.FetchStorageConfigResponse); - - // Bootstrap automatically configured cluster - rpc BootstrapCluster(BSConfig.BootstrapClusterRequest) returns (BSConfig.BootstrapClusterResponse); - -} diff --git a/src/api/grpc/ydb_config_v1.proto b/src/api/grpc/ydb_config_v1.proto new file mode 100644 index 0000000000..d5c5eed6df --- /dev/null +++ b/src/api/grpc/ydb_config_v1.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; + +package Ydb.Config.V1; + +option java_package = "com.yandex.ydb.config.v1"; +option java_outer_classname = "ConfigGrpc"; +option java_multiple_files = true; + +import "src/api/protos/ydb_config.proto"; + +service ConfigService { + // Replace one or many configs. + rpc ReplaceConfig(Config.ReplaceConfigRequest) returns (Config.ReplaceConfigResponse); + + // Fetch configs from cluster. + rpc FetchConfig(Config.FetchConfigRequest) returns (Config.FetchConfigResponse); + + // Start cluster initialization process. + rpc BootstrapCluster(Config.BootstrapClusterRequest) returns (Config.BootstrapClusterResponse); +} diff --git a/src/api/protos/ydb_bsconfig.proto b/src/api/protos/ydb_bsconfig.proto deleted file mode 100644 index 814c824149..0000000000 --- a/src/api/protos/ydb_bsconfig.proto +++ /dev/null @@ -1,53 +0,0 @@ -syntax = "proto3"; -option cc_enable_arenas = true; - -package Ydb.BSConfig; - -option java_package = "com.yandex.ydb.bsconfig.proto"; -option java_outer_classname = "BSConfigProtos"; -option java_multiple_files = true; - -import "src/api/protos/ydb_operation.proto"; - -// -// BSConfig API. -// - -message ReplaceStorageConfigRequest { - Ydb.Operations.OperationParams operation_params = 1; - optional string yaml_config = 2; // cluster yaml config - optional string storage_yaml_config = 3; // dedicated storage yaml config (when dual-config mode is enabled) - optional bool switch_dedicated_storage_section = 4; // if filled, can turn on or off dedicated section of YAML config - bool dedicated_config_mode = 5; // if true, then user expects system to work in dual-config mode -} - -message ReplaceStorageConfigResponse { - Ydb.Operations.Operation operation = 1; -} - -message ReplaceStorageConfigResult { -} - -message FetchStorageConfigRequest { - Ydb.Operations.OperationParams operation_params = 1; - bool dedicated_storage_section = 2; - bool dedicated_cluster_section = 3; -} - -message FetchStorageConfigResponse { - Ydb.Operations.Operation operation = 1; -} - -message FetchStorageConfigResult { - optional string yaml_config = 1; - optional string storage_yaml_config = 2; -} - -message BootstrapClusterRequest { - Ydb.Operations.OperationParams operation_params = 1; - string self_assembly_uuid = 2; -} - -message BootstrapClusterResponse { - Ydb.Operations.Operation operation = 1; -} diff --git a/src/api/protos/ydb_config.proto b/src/api/protos/ydb_config.proto new file mode 100644 index 0000000000..aae8a06e7b --- /dev/null +++ b/src/api/protos/ydb_config.proto @@ -0,0 +1,183 @@ +syntax = "proto3"; +option cc_enable_arenas = true; + +package Ydb.Config; + +option java_package = "com.yandex.ydb.config.proto"; +option java_outer_classname = "ConfigProtos"; +option java_multiple_files = true; + +import "src/api/protos/ydb_operation.proto"; +import "google/protobuf/empty.proto"; + +// Main config is "the" main config used for configuring everyting +// For most installations this config is enough, because it +// allows database administrator to configure all entites: +// whole cluster, database, specific node(s), etc. +message MainConfigIdentity {} + +// Storage config allows administrator separate management of +// storage/infrastructure part from main/application part +// it is useful on large clusters, where enumeration of all +// physical machines takes too much space and make it inconvenient +// to store and manage this configuration data together with other +message StorageConfigIdentity {} + +// Database config allows to manage specific parts of configuration +// by database administrators themself. It mostly applies to +// feature flags enabled on particular database +// This type of config is disabled by default and can be enabled +// in configuration +message DatabaseConfigIdentity { + string database = 1; +} + +// Representation of config metadata. +// Uniquely identifies config. +// Used to describe what config user want to change or receive. +message ConfigIdentity { + // Current config version + uint64 version = 1; + + // Identifier of the cluster + string cluster = 2; + + // Config type with attached identity data specific for particular type + // List of config types may be extended in future + oneof type { + MainConfigIdentity main = 3; + StorageConfigIdentity storage = 4; + DatabaseConfigIdentity database = 5; + } +} + +message ReplaceConfigRequest { + Ydb.Operations.OperationParams operation_params = 1; + + message ConfigBundle { + optional string main_config = 1; + optional string storage_config = 2; + } + + oneof action { + // Replaces config on cluster. + // By default awaits config with matching metadata (kind MainConfig, right cluster and version + 1) + string replace = 2; + + // Replaces storage and/or main configs on cluster in dedicated storage config mode + // By default awaits either MainConfig or StorageConfig or both with matching metadata + ConfigBundle replace_with_dedicated_storage_section = 3; + + // Replaces storage and main configs on cluster in single config mode **AND** enables dedicated storage config mode + // By default awaits MainConfig and StorageConfig with matching metadata + ConfigBundle replace_enable_dedicated_storage_section = 4; + + // Replaces main config on cluster in single config mode **AND** disables dedicated storage config mode + // By default awaits MainConfig with matching metadata + string replace_disable_dedicated_storage_section = 5; + } + + // Try to apply config(s) without making real changes + // Exact data returned and checks done are implementation defined + // Now renders final configs for all labels and makes basic validity checks + // All errors returned as issues in response + bool dry_run = 6; + + // Allows to apply config with fields unknown to config parser + // It is useful when user need to try some new experimental flag, then rollback to previous version + // and want to update existing config keeping flag from newer version in config + // All unknown fields still reported in result as warnings + bool allow_unknown_fields = 7; + + // Allows to apply config with incorrect metadata + // Metadata of stored config after this call will be replaced with correct one + // Exact set of excluded checks is implementation defined, this flag + // may ignore additional checks in future + // BEWARE: with this flag set user can apply config on wrong cluster + // or overwrite other users changes in case of race + // Behaviour identical to deprecated DynConfig.SetConfig() call + bool bypass_checks = 8; +} + +message ReplaceConfigResponse { + Ydb.Operations.Operation operation = 1; +} + +message ReplaceConfigResult {} + +message FetchConfigRequest { + Ydb.Operations.OperationParams operation_params = 1; + + // Settings for mode "all" + // In this mode server will return all configs to user + // There are additional settings allowing to transform configs in server answer + message FetchModeAll { + // Use this option to somehow transform main config + // Currently used to automatically derive detached StorageSection from MainConfig + // or vice versa + oneof config_transform { + // Optionally may be set to explicitly tell "do not transform anything" + google.protobuf.Empty none = 1; + + // Fetch will return MainConfig and StorageConfig derived from MainConfig + // by detaching storage config + // (MainConfig) -> (MainConfig*, StorageConfig) + // MainConfig with asterisk means MainConfig with excluded storage-related sections + google.protobuf.Empty detach_storage_config_section = 2; + + // Fetch will return MainConfig derived from MainConfig and StorageConfig + // by attaching storage config to main config + // (MainConfig*, StorageConfig) -> (MainConfig) + // MainConfig with asterisk means MainConfig with excluded storage-related sections + google.protobuf.Empty attach_storage_config_section = 3; + } + } + + // Settings for mode "by identity" + // In this mode server will return all configs with identites which are exactly match to identites in request + // If there is no matching identity on server the identity will be skipped + message FetchModeByIdentity { + // List of configs to fetch + repeated ConfigIdentity identity = 1; + } + + // Depending on mode Fetch will return different set of configs + // List of modes may be extended in future + oneof mode { + // Fetch all configs from cluster + FetchModeAll all = 2; + + // Fetch all configs with matching identities + FetchModeByIdentity target = 3; + } +} + +message FetchConfigResponse { + Ydb.Operations.Operation operation = 1; +} + +// Config with attached identity +// Allows to operate on on configs without necessary parsing config metadta field +// For example filtering out fetch result based on some specific rules +message ConfigEntry { + ConfigIdentity identity = 1; + string config = 2; +} + +message FetchConfigResult { + repeated ConfigEntry config = 1; +} + +message BootstrapClusterRequest { + Ydb.Operations.OperationParams operation_params = 1; + + // This field used to make this request indempotent + // Must be set to arbitrary **unique** string + string self_assembly_uuid = 2; +} + +message BootstrapClusterResponse { + Ydb.Operations.Operation operation = 1; +} + +message BootstrapClusterResult {} diff --git a/src/client/bsconfig/storage_config.cpp b/src/client/bsconfig/storage_config.cpp deleted file mode 100644 index 44baf6b038..0000000000 --- a/src/client/bsconfig/storage_config.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include - -#include -#include - -#include - -namespace NYdb::inline V3::NStorageConfig { - -class TStorageConfigClient::TImpl : public TClientImplCommon { -public: - TImpl(std::shared_ptr connections, const TCommonClientSettings& settings) - : TClientImplCommon(std::move(connections), settings) - { - } - - TAsyncStatus ReplaceStorageConfig(const std::optional& yaml_config, - const std::optional& storage_yaml_config, - std::optional switch_dedicated_storage_section, - bool dedicated_config_mode, - const TReplaceStorageConfigSettings& settings) { - auto request = MakeRequest(); - - if (yaml_config) { - request.set_yaml_config(*yaml_config); - } - if (storage_yaml_config) { - request.set_storage_yaml_config(*storage_yaml_config); - } - if (switch_dedicated_storage_section) { - request.set_switch_dedicated_storage_section(*switch_dedicated_storage_section); - } - request.set_dedicated_config_mode(dedicated_config_mode); - - return RunSimple( - std::move(request), - &Ydb::BSConfig::V1::BSConfigService::Stub::AsyncReplaceStorageConfig, - TRpcRequestSettings::Make(settings)); - } - - TAsyncFetchStorageConfigResult FetchStorageConfig(bool dedicated_storage_section, bool dedicated_cluster_section, - const TFetchStorageConfigSettings& settings) { - auto request = MakeOperationRequest(settings); - if (dedicated_storage_section) { - request.set_dedicated_storage_section(true); - } - if (dedicated_cluster_section) { - request.set_dedicated_cluster_section(true); - } - auto promise = NThreading::NewPromise(); - - auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { - NYdb::TStringType config; - NYdb::TStringType storage_config; - if (Ydb::BSConfig::FetchStorageConfigResult result; any && any->UnpackTo(&result)) { - config = result.yaml_config(); - storage_config = result.storage_yaml_config(); - } - - TFetchStorageConfigResult val(TStatus(std::move(status)), std::string{std::move(config)}, - std::string{std::move(storage_config)}); - promise.SetValue(std::move(val)); - }; - - Connections_->RunDeferred( - std::move(request), - extractor, - &Ydb::BSConfig::V1::BSConfigService::Stub::AsyncFetchStorageConfig, - DbDriverState_, - INITIAL_DEFERRED_CALL_DELAY, - TRpcRequestSettings::Make(settings)); - return promise.GetFuture(); - } - - TAsyncStatus BootstrapCluster(const std::string& selfAssemblyUUID, const TBootstrapClusterSettings& settings) { - auto request = MakeRequest(); - request.set_self_assembly_uuid(selfAssemblyUUID); - return RunSimple(std::move(request), - &Ydb::BSConfig::V1::BSConfigService::Stub::AsyncBootstrapCluster, - TRpcRequestSettings::Make(settings)); - } -}; - -TStorageConfigClient::TStorageConfigClient(const TDriver& driver, const TCommonClientSettings& settings) - : Impl_(new TStorageConfigClient::TImpl(CreateInternalInterface(driver), settings)) -{} - -TStorageConfigClient::~TStorageConfigClient() = default; - -TAsyncStatus TStorageConfigClient::ReplaceStorageConfig(const std::optional& yaml_config, - const std::optional& storage_yaml_config, std::optional switch_dedicated_storage_section, - bool dedicated_config_mode, const TReplaceStorageConfigSettings& settings) { - return Impl_->ReplaceStorageConfig(yaml_config, storage_yaml_config, switch_dedicated_storage_section, - dedicated_config_mode, settings); -} - -TAsyncFetchStorageConfigResult TStorageConfigClient::FetchStorageConfig(bool dedicated_storage_section, - bool dedicated_cluster_section, const TFetchStorageConfigSettings& settings) { - return Impl_->FetchStorageConfig(dedicated_storage_section, dedicated_cluster_section, settings); -} - -TAsyncStatus TStorageConfigClient::BootstrapCluster(const std::string& selfAssemblyUUID, const TBootstrapClusterSettings& settings) { - return Impl_->BootstrapCluster(selfAssemblyUUID, settings); -} - - -} diff --git a/src/client/config/config.cpp b/src/client/config/config.cpp new file mode 100644 index 0000000000..c572683183 --- /dev/null +++ b/src/client/config/config.cpp @@ -0,0 +1,184 @@ +#include + +#include +#include + +#include + +namespace NYdb::inline V3::NConfig { + +class TConfigClient::TImpl : public TClientImplCommon { +public: + TImpl(std::shared_ptr connections, const TCommonClientSettings& settings) + : TClientImplCommon(std::move(connections), settings) + { + } + + TAsyncStatus ReplaceConfig(const TString& mainConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeRequest(); + request.set_replace(mainConfig); + + ApplyReplaceSettings(request, settings); + + return RunSimple( + std::move(request), + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + } + + TAsyncStatus ReplaceConfig(const TString& mainConfig, const TString& storageConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeRequest(); + auto& replace = *request.mutable_replace_with_dedicated_storage_section(); + replace.set_main_config(mainConfig); + replace.set_storage_config(storageConfig); + + ApplyReplaceSettings(request, settings); + + return RunSimple( + std::move(request), + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + } + + TAsyncStatus ReplaceConfigDisableDedicatedStorageSection(const TString& mainConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeRequest(); + request.set_replace_disable_dedicated_storage_section(mainConfig); + + ApplyReplaceSettings(request, settings); + + return RunSimple( + std::move(request), + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + } + + TAsyncStatus ReplaceConfigEnableDedicatedStorageSection(const TString& mainConfig, const TString& storageConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeRequest(); + auto& replace = *request.mutable_replace_enable_dedicated_storage_section(); + replace.set_main_config(mainConfig); + replace.set_storage_config(storageConfig); + + ApplyReplaceSettings(request, settings); + + return RunSimple( + std::move(request), + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + } + + TAsyncFetchConfigResult FetchAllConfigs(const TFetchAllConfigsSettings& settings = {}) { + auto request = MakeOperationRequest(settings); + auto promise = NThreading::NewPromise(); + + auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { + std::vector configs; + if (Ydb::Config::FetchConfigResult result; any && any->UnpackTo(&result)) { + for (const auto& entry : result.config()) { + TIdentityTypes identity; + + switch (entry.identity().type_case()) { + case Ydb::Config::ConfigIdentity::TypeCase::kMain: + identity = TMainConfigIdentity { + .Version = entry.identity().version(), + .Cluster = entry.identity().cluster(), + }; + break; + case Ydb::Config::ConfigIdentity::TypeCase::kStorage: + identity = TStorageConfigIdentity { + .Version = entry.identity().version(), + .Cluster = entry.identity().cluster(), + }; + break; + case Ydb::Config::ConfigIdentity::TypeCase::kDatabase: + identity = TDatabaseConfigIdentity { + .Version = entry.identity().version(), + .Cluster = entry.identity().cluster(), + .Database = entry.identity().database().database(), + }; + break; + case Ydb::Config::ConfigIdentity::TypeCase::TYPE_NOT_SET: + break; // leave in monostate; uknown identity + } + + configs.push_back(TConfig{ + .Identity = identity, + .Config = entry.config(), + }); + } + } + + TFetchConfigResult val(TStatus(std::move(status)), std::move(configs)); + promise.SetValue(std::move(val)); + }; + + Connections_->RunDeferred( + std::move(request), + extractor, + &Ydb::Config::V1::ConfigService::Stub::AsyncFetchConfig, + DbDriverState_, + INITIAL_DEFERRED_CALL_DELAY, + TRpcRequestSettings::Make(settings)); + return promise.GetFuture(); + } + + TAsyncStatus BootstrapCluster(const TString& selfAssemblyUUID, const TBootstrapClusterSettings& settings = {}) { + Y_UNUSED(settings); + auto request = MakeRequest(); + request.set_self_assembly_uuid(selfAssemblyUUID); + + return RunSimple(std::move(request), + &Ydb::Config::V1::ConfigService::Stub::AsyncBootstrapCluster); + } +private: + static void ApplyReplaceSettings(auto& request, const TReplaceConfigSettings& settings) { + request.set_dry_run(settings.DryRun_); + request.set_allow_unknown_fields(settings.AllowUnknownFields_); + request.set_bypass_checks(settings.BypassChecks_); + } +}; + +TConfigClient::TConfigClient(const TDriver& driver, const TCommonClientSettings& settings) + : Impl_(new TConfigClient::TImpl(CreateInternalInterface(driver), settings)) +{} + +TConfigClient::~TConfigClient() = default; + +TAsyncStatus TConfigClient::ReplaceConfig( + const TString& mainConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfig(mainConfig, settings); +} + +TAsyncStatus TConfigClient::ReplaceConfig( + const TString& mainConfig, + const TString& storageConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfig(mainConfig, storageConfig, settings); +} + +TAsyncStatus TConfigClient::ReplaceConfigDisableDedicatedStorageSection( + const TString& mainConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfigDisableDedicatedStorageSection(mainConfig, settings); +} + +TAsyncStatus TConfigClient::ReplaceConfigEnableDedicatedStorageSection( + const TString& mainConfig, + const TString& storageConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfigEnableDedicatedStorageSection(mainConfig, storageConfig, settings); +} + +TAsyncFetchConfigResult TConfigClient::FetchAllConfigs(const TFetchAllConfigsSettings& settings) { + return Impl_->FetchAllConfigs(settings); +} + +TAsyncStatus TConfigClient::BootstrapCluster( + const TString& selfAssemblyUUID, + const TBootstrapClusterSettings& settings) +{ + return Impl_->BootstrapCluster(selfAssemblyUUID, settings); +} + +} diff --git a/src/client/types/status/status.cpp b/src/client/types/status/status.cpp index 1764499e40..be7e44082a 100644 --- a/src/client/types/status/status.cpp +++ b/src/client/types/status/status.cpp @@ -54,6 +54,10 @@ bool TStatus::IsTransportError() const { && static_cast(Impl_->Status.Status) <= TRANSPORT_STATUSES_LAST; } +bool TStatus::IsUnimplementedError() const { + return Impl_->Status.Status == EStatus::CLIENT_CALL_UNIMPLEMENTED; +} + void TStatus::CheckStatusOk(const std::string& str) const { Impl_->CheckStatusOk(str); } From ff4449db70670b5c7fcf03484c386a451594684f Mon Sep 17 00:00:00 2001 From: Bulat Date: Fri, 21 Feb 2025 11:00:27 +0000 Subject: [PATCH 3/7] Fixed underflow in C++ SDK decimal FromString, ToString and IsValid (#14807) --- src/library/decimal/yql_decimal.cpp | 38 ++++++++++++++++++----------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/src/library/decimal/yql_decimal.cpp b/src/library/decimal/yql_decimal.cpp index 0eb36911ff..6ee9eff00b 100644 --- a/src/library/decimal/yql_decimal.cpp +++ b/src/library/decimal/yql_decimal.cpp @@ -32,7 +32,7 @@ bool IsNormal(TInt128 v) { } const char* ToString(TInt128 val, ui8 precision, ui8 scale) { - if (!precision || precision > MaxPrecision || scale > precision) { + if (precision == 0 || precision > MaxPrecision || scale > precision) { return ""; } @@ -47,7 +47,7 @@ const char* ToString(TInt128 val, ui8 precision, ui8 scale) { return nullptr; } - if (!val) { + if (val == 0) { return "0"; } @@ -63,9 +63,10 @@ const char* ToString(TInt128 val, ui8 precision, ui8 scale) { auto s = end; do { - if (!precision--) { + if (precision == 0) { return ""; } + --precision; const auto digit = ui8(v % Ten); @@ -80,9 +81,10 @@ const char* ToString(TInt128 val, ui8 precision, ui8 scale) { if (scale) { do { - if (!precision--) { + if (precision == 0) { return nullptr; } + --precision; *--s = '0'; } while (--scale); @@ -119,7 +121,7 @@ TInt128 FromString(const std::string_view& str, ui8 precision, ui8 scale) { auto s = str.data(); auto l = str.size(); - if (!s || !l) + if (s == nullptr || l == 0) return Err(); const bool neg = '-' == *s; @@ -138,7 +140,7 @@ TInt128 FromString(const std::string_view& str, ui8 precision, ui8 scale) { TUint128 v = 0U; auto integral = precision - scale; - for (bool dot = false; l; --l) { + for (bool dot = false; l > 0; --l) { if (*s == '.') { if (dot) return Err(); @@ -162,19 +164,23 @@ TInt128 FromString(const std::string_view& str, ui8 precision, ui8 scale) { v *= Ten; v += c - '0'; - if (!dot && v && !integral--) { - return neg ? -Inf() : Inf(); + if (!dot && v > 0) { + if (integral == 0) { + return neg ? -Inf() : Inf(); + } + --integral; } } - if (l--) { + if (l > 0) { + --l; const char c = *s++; if (!std::isdigit(c)) return Err(); bool plus = c > '5'; if (!plus && c == '5') { - for (plus = v & 1; !plus && l; --l) { + for (plus = v & 1; !plus && l > 0; --l) { const char c = *s++; if (!std::isdigit(c)) return Err(); @@ -183,17 +189,21 @@ TInt128 FromString(const std::string_view& str, ui8 precision, ui8 scale) { } } - while (l--) + while (l > 0) { + --l; if (!std::isdigit(*s++)) return Err(); + } if (plus) if (++v >= GetDivider(precision)) v = Inf(); } - while (scale--) + while (scale > 0) { + --scale; v *= Ten; + } return neg ? -v : v; } @@ -209,7 +219,7 @@ bool IsValid(const std::string_view& str) { auto s = str.data(); auto l = str.size(); - if (!s || !l) + if (s == nullptr || l == 0) return false; if ('-' == *s || '+' == *s) { @@ -221,7 +231,7 @@ bool IsValid(const std::string_view& str) { return true; } - for (bool dot = false; l--;) { + for (bool dot = false; l > 0; l--) { const char c = *s++; if (c == '.') { if (dot) From 3f4f6c507b1a13b6b66d033f1cf1bd4e2cf05cec Mon Sep 17 00:00:00 2001 From: Innokentii Mokin Date: Fri, 21 Feb 2025 11:00:52 +0000 Subject: [PATCH 4/7] Fix sdk according review in #14617 (#14831) --- include/ydb-cpp-sdk/client/config/config.h | 30 ++++++------ .../ydb-cpp-sdk/client/types/status/status.h | 1 - src/client/config/config.cpp | 47 ++++++++++--------- src/client/types/status/status.cpp | 4 -- 4 files changed, 40 insertions(+), 42 deletions(-) diff --git a/include/ydb-cpp-sdk/client/config/config.h b/include/ydb-cpp-sdk/client/config/config.h index e4fdb38e58..09dceae6fa 100644 --- a/include/ydb-cpp-sdk/client/config/config.h +++ b/include/ydb-cpp-sdk/client/config/config.h @@ -30,19 +30,19 @@ struct TFetchAllConfigsSettings : public NYdb::TOperationRequestSettings {}; struct TMainConfigIdentity { - ui64 Version; - TString Cluster; + std::uint64_t Version; + std::string Cluster; }; struct TStorageConfigIdentity { - ui64 Version; - TString Cluster; + std::uint64_t Version; + std::string Cluster; }; struct TDatabaseConfigIdentity { - ui64 Version; - TString Cluster; - TString Database; + std::uint64_t Version; + std::string Cluster; + std::string Database; }; using TIdentityTypes = std::variant< @@ -54,7 +54,7 @@ using TIdentityTypes = std::variant< struct TConfig { TIdentityTypes Identity; - TString Config; + std::string Config; }; struct TFetchConfigResult : public TStatus { @@ -83,24 +83,24 @@ class TConfigClient { // Replace config TAsyncStatus ReplaceConfig( - const TString& mainConfig, + const std::string& mainConfig, const TReplaceConfigSettings& settings = {}); // Replace config TAsyncStatus ReplaceConfig( - const TString& mainConfig, - const TString& storageConfig, + const std::string& mainConfig, + const std::string& storageConfig, const TReplaceConfigSettings& settings = {}); // Replace config TAsyncStatus ReplaceConfigDisableDedicatedStorageSection( - const TString& mainConfig, + const std::string& mainConfig, const TReplaceConfigSettings& settings = {}); // Replace config TAsyncStatus ReplaceConfigEnableDedicatedStorageSection( - const TString& mainConfig, - const TString& storageConfig, + const std::string& mainConfig, + const std::string& storageConfig, const TReplaceConfigSettings& settings = {}); // Fetch current cluster storage config @@ -108,7 +108,7 @@ class TConfigClient { // Bootstrap cluster with automatic configuration TAsyncStatus BootstrapCluster( - const TString& selfAssemblyUUID, + const std::string& selfAssemblyUUID, const TBootstrapClusterSettings& settings = {}); private: diff --git a/include/ydb-cpp-sdk/client/types/status/status.h b/include/ydb-cpp-sdk/client/types/status/status.h index 76d2d70934..96314b6e2d 100644 --- a/include/ydb-cpp-sdk/client/types/status/status.h +++ b/include/ydb-cpp-sdk/client/types/status/status.h @@ -25,7 +25,6 @@ class TStatus { const NYdb::NIssue::TIssues& GetIssues() const; bool IsSuccess() const; bool IsTransportError() const; - bool IsUnimplementedError() const; const std::string& GetEndpoint() const; const std::multimap& GetResponseMetadata() const; float GetConsumedRu() const; diff --git a/src/client/config/config.cpp b/src/client/config/config.cpp index c572683183..e37b4e22e7 100644 --- a/src/client/config/config.cpp +++ b/src/client/config/config.cpp @@ -14,19 +14,20 @@ class TConfigClient::TImpl : public TClientImplCommon { { } - TAsyncStatus ReplaceConfig(const TString& mainConfig, const TReplaceConfigSettings& settings = {}) { - auto request = MakeRequest(); + TAsyncStatus ReplaceConfig(const std::string& mainConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeOperationRequest(settings); request.set_replace(mainConfig); ApplyReplaceSettings(request, settings); return RunSimple( std::move(request), - &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig, + TRpcRequestSettings::Make(settings)); } - TAsyncStatus ReplaceConfig(const TString& mainConfig, const TString& storageConfig, const TReplaceConfigSettings& settings = {}) { - auto request = MakeRequest(); + TAsyncStatus ReplaceConfig(const std::string& mainConfig, const std::string& storageConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeOperationRequest(settings); auto& replace = *request.mutable_replace_with_dedicated_storage_section(); replace.set_main_config(mainConfig); replace.set_storage_config(storageConfig); @@ -35,22 +36,24 @@ class TConfigClient::TImpl : public TClientImplCommon { return RunSimple( std::move(request), - &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig, + TRpcRequestSettings::Make(settings)); } - TAsyncStatus ReplaceConfigDisableDedicatedStorageSection(const TString& mainConfig, const TReplaceConfigSettings& settings = {}) { - auto request = MakeRequest(); + TAsyncStatus ReplaceConfigDisableDedicatedStorageSection(const std::string& mainConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeOperationRequest(settings); request.set_replace_disable_dedicated_storage_section(mainConfig); ApplyReplaceSettings(request, settings); return RunSimple( std::move(request), - &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig, + TRpcRequestSettings::Make(settings)); } - TAsyncStatus ReplaceConfigEnableDedicatedStorageSection(const TString& mainConfig, const TString& storageConfig, const TReplaceConfigSettings& settings = {}) { - auto request = MakeRequest(); + TAsyncStatus ReplaceConfigEnableDedicatedStorageSection(const std::string& mainConfig, const std::string& storageConfig, const TReplaceConfigSettings& settings = {}) { + auto request = MakeOperationRequest(settings); auto& replace = *request.mutable_replace_enable_dedicated_storage_section(); replace.set_main_config(mainConfig); replace.set_storage_config(storageConfig); @@ -59,7 +62,8 @@ class TConfigClient::TImpl : public TClientImplCommon { return RunSimple( std::move(request), - &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig); + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig, + TRpcRequestSettings::Make(settings)); } TAsyncFetchConfigResult FetchAllConfigs(const TFetchAllConfigsSettings& settings = {}) { @@ -117,9 +121,8 @@ class TConfigClient::TImpl : public TClientImplCommon { return promise.GetFuture(); } - TAsyncStatus BootstrapCluster(const TString& selfAssemblyUUID, const TBootstrapClusterSettings& settings = {}) { - Y_UNUSED(settings); - auto request = MakeRequest(); + TAsyncStatus BootstrapCluster(const std::string& selfAssemblyUUID, const TBootstrapClusterSettings& settings = {}) { + auto request = MakeOperationRequest(settings); request.set_self_assembly_uuid(selfAssemblyUUID); return RunSimpleReplaceConfig(mainConfig, settings); } TAsyncStatus TConfigClient::ReplaceConfig( - const TString& mainConfig, - const TString& storageConfig, + const std::string& mainConfig, + const std::string& storageConfig, const TReplaceConfigSettings& settings) { return Impl_->ReplaceConfig(mainConfig, storageConfig, settings); } TAsyncStatus TConfigClient::ReplaceConfigDisableDedicatedStorageSection( - const TString& mainConfig, + const std::string& mainConfig, const TReplaceConfigSettings& settings) { return Impl_->ReplaceConfigDisableDedicatedStorageSection(mainConfig, settings); } TAsyncStatus TConfigClient::ReplaceConfigEnableDedicatedStorageSection( - const TString& mainConfig, - const TString& storageConfig, + const std::string& mainConfig, + const std::string& storageConfig, const TReplaceConfigSettings& settings) { return Impl_->ReplaceConfigEnableDedicatedStorageSection(mainConfig, storageConfig, settings); @@ -175,7 +178,7 @@ TAsyncFetchConfigResult TConfigClient::FetchAllConfigs(const TFetchAllConfigsSet } TAsyncStatus TConfigClient::BootstrapCluster( - const TString& selfAssemblyUUID, + const std::string& selfAssemblyUUID, const TBootstrapClusterSettings& settings) { return Impl_->BootstrapCluster(selfAssemblyUUID, settings); diff --git a/src/client/types/status/status.cpp b/src/client/types/status/status.cpp index be7e44082a..1764499e40 100644 --- a/src/client/types/status/status.cpp +++ b/src/client/types/status/status.cpp @@ -54,10 +54,6 @@ bool TStatus::IsTransportError() const { && static_cast(Impl_->Status.Status) <= TRANSPORT_STATUSES_LAST; } -bool TStatus::IsUnimplementedError() const { - return Impl_->Status.Status == EStatus::CLIENT_CALL_UNIMPLEMENTED; -} - void TStatus::CheckStatusOk(const std::string& str) const { Impl_->CheckStatusOk(str); } From 5ad9ac3b4eb8d260dc5e8a49125643e3ba6bc352 Mon Sep 17 00:00:00 2001 From: Alexander Rutkovsky Date: Fri, 21 Feb 2025 11:01:15 +0000 Subject: [PATCH 5/7] Fix distconf configuration fetch machinery (#14864) --- src/client/config/config.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/client/config/config.cpp b/src/client/config/config.cpp index e37b4e22e7..80a99b6001 100644 --- a/src/client/config/config.cpp +++ b/src/client/config/config.cpp @@ -68,6 +68,8 @@ class TConfigClient::TImpl : public TClientImplCommon { TAsyncFetchConfigResult FetchAllConfigs(const TFetchAllConfigsSettings& settings = {}) { auto request = MakeOperationRequest(settings); + request.mutable_all(); + auto promise = NThreading::NewPromise(); auto extractor = [promise] (google::protobuf::Any* any, TPlainStatus status) mutable { From acd896846a73dbd3bbd8e2764a2f9c3febdaf8bd Mon Sep 17 00:00:00 2001 From: Bulat Gayazov Date: Fri, 21 Feb 2025 13:50:19 +0000 Subject: [PATCH 6/7] Fixed CMakeLists for config client --- src/client/CMakeLists.txt | 14 +++++++------- src/client/{bsconfig => config}/CMakeLists.txt | 10 +++++----- 2 files changed, 12 insertions(+), 12 deletions(-) rename src/client/{bsconfig => config}/CMakeLists.txt (53%) diff --git a/src/client/CMakeLists.txt b/src/client/CMakeLists.txt index 2b33ff89fe..2b83bfc61e 100644 --- a/src/client/CMakeLists.txt +++ b/src/client/CMakeLists.txt @@ -1,21 +1,20 @@ -add_subdirectory(bsconfig) -add_subdirectory(draft) -add_subdirectory(helpers) -add_subdirectory(iam) -add_subdirectory(iam_private) -add_subdirectory(impl) -add_subdirectory(resources) add_subdirectory(cms) add_subdirectory(common_client) +add_subdirectory(config) add_subdirectory(coordination) add_subdirectory(datastreams) add_subdirectory(debug) add_subdirectory(discovery) +add_subdirectory(draft) add_subdirectory(driver) add_subdirectory(export) add_subdirectory(extension_common) add_subdirectory(extensions) add_subdirectory(federated_topic) +add_subdirectory(helpers) +add_subdirectory(iam) +add_subdirectory(iam_private) +add_subdirectory(impl) add_subdirectory(import) add_subdirectory(monitoring) add_subdirectory(operation) @@ -24,6 +23,7 @@ add_subdirectory(persqueue_public) add_subdirectory(proto) add_subdirectory(query) add_subdirectory(rate_limiter) +add_subdirectory(resources) add_subdirectory(result) add_subdirectory(scheme) add_subdirectory(ss_tasks) diff --git a/src/client/bsconfig/CMakeLists.txt b/src/client/config/CMakeLists.txt similarity index 53% rename from src/client/bsconfig/CMakeLists.txt rename to src/client/config/CMakeLists.txt index 961a3327a6..96fea5227b 100644 --- a/src/client/bsconfig/CMakeLists.txt +++ b/src/client/config/CMakeLists.txt @@ -1,6 +1,6 @@ -_ydb_sdk_add_library(client-bsconfig) +_ydb_sdk_add_library(client-config) -target_link_libraries(client-bsconfig +target_link_libraries(client-config PUBLIC client-ydb_driver client-ydb_common_client @@ -12,9 +12,9 @@ target_link_libraries(client-bsconfig client-ydb_common_client-impl ) -target_sources(client-bsconfig +target_sources(client-config PRIVATE - storage_config.cpp + config.cpp ) -_ydb_sdk_make_client_component(BSConfig client-bsconfig) +_ydb_sdk_make_client_component(Config client-config) From ef588637eb7b70a31c6f35dc9465a401052d7f88 Mon Sep 17 00:00:00 2001 From: yumkam Date: Fri, 21 Feb 2025 14:42:44 +0000 Subject: [PATCH 7/7] style/typo (#14884) --- src/api/protos/ydb_keyvalue.proto | 3 +++ src/client/topic/impl/write_session_impl.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/api/protos/ydb_keyvalue.proto b/src/api/protos/ydb_keyvalue.proto index dfcd284bd5..53e0703c79 100644 --- a/src/api/protos/ydb_keyvalue.proto +++ b/src/api/protos/ydb_keyvalue.proto @@ -514,6 +514,9 @@ message DescribeVolumeResult { // Count of partitions. uint64 partition_count = 2; + + // Storage config. + StorageConfig storage_config = 3; } message ListLocalPartitionsRequest { diff --git a/src/client/topic/impl/write_session_impl.cpp b/src/client/topic/impl/write_session_impl.cpp index 6a0b40faae..0fc63e9c62 100644 --- a/src/client/topic/impl/write_session_impl.cpp +++ b/src/client/topic/impl/write_session_impl.cpp @@ -988,7 +988,7 @@ TStringBuilder TWriteSessionImpl::LogPrefixImpl() const { Y_ABORT_UNLESS(Lock.IsLocked()); TStringBuilder ret; - ret << " TraceId [" << Settings.TraceId_ << "] ";; + ret << " TraceId [" << Settings.TraceId_ << "] "; ret << " SessionId [" << SessionId << "] "; if (Settings.PartitionId_.has_value() || DirectWriteToPartitionId.has_value()) {