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..09dceae6fa --- /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 { + std::uint64_t Version; + std::string Cluster; +}; + +struct TStorageConfigIdentity { + std::uint64_t Version; + std::string Cluster; +}; + +struct TDatabaseConfigIdentity { + std::uint64_t Version; + std::string Cluster; + std::string Database; +}; + +using TIdentityTypes = std::variant< + std::monostate + , TMainConfigIdentity + , TStorageConfigIdentity + , TDatabaseConfigIdentity + >; + +struct TConfig { + TIdentityTypes Identity; + std::string 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 std::string& mainConfig, + const TReplaceConfigSettings& settings = {}); + + // Replace config + TAsyncStatus ReplaceConfig( + const std::string& mainConfig, + const std::string& storageConfig, + const TReplaceConfigSettings& settings = {}); + + // Replace config + TAsyncStatus ReplaceConfigDisableDedicatedStorageSection( + const std::string& mainConfig, + const TReplaceConfigSettings& settings = {}); + + // Replace config + TAsyncStatus ReplaceConfigEnableDedicatedStorageSection( + const std::string& mainConfig, + const std::string& storageConfig, + const TReplaceConfigSettings& settings = {}); + + // Fetch current cluster storage config + TAsyncFetchConfigResult FetchAllConfigs(const TFetchAllConfigsSettings& 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/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/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/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/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/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/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/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) diff --git a/src/client/config/config.cpp b/src/client/config/config.cpp new file mode 100644 index 0000000000..80a99b6001 --- /dev/null +++ b/src/client/config/config.cpp @@ -0,0 +1,189 @@ +#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 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, + TRpcRequestSettings::Make(settings)); + } + + 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); + + ApplyReplaceSettings(request, settings); + + return RunSimple( + std::move(request), + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig, + TRpcRequestSettings::Make(settings)); + } + + 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, + TRpcRequestSettings::Make(settings)); + } + + 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); + + ApplyReplaceSettings(request, settings); + + return RunSimple( + std::move(request), + &Ydb::Config::V1::ConfigService::Stub::AsyncReplaceConfig, + TRpcRequestSettings::Make(settings)); + } + + 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 { + 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 std::string& selfAssemblyUUID, const TBootstrapClusterSettings& settings = {}) { + auto request = MakeOperationRequest(settings); + 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 std::string& mainConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfig(mainConfig, settings); +} + +TAsyncStatus TConfigClient::ReplaceConfig( + const std::string& mainConfig, + const std::string& storageConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfig(mainConfig, storageConfig, settings); +} + +TAsyncStatus TConfigClient::ReplaceConfigDisableDedicatedStorageSection( + const std::string& mainConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfigDisableDedicatedStorageSection(mainConfig, settings); +} + +TAsyncStatus TConfigClient::ReplaceConfigEnableDedicatedStorageSection( + const std::string& mainConfig, + const std::string& storageConfig, + const TReplaceConfigSettings& settings) +{ + return Impl_->ReplaceConfigEnableDedicatedStorageSection(mainConfig, storageConfig, settings); +} + +TAsyncFetchConfigResult TConfigClient::FetchAllConfigs(const TFetchAllConfigsSettings& settings) { + return Impl_->FetchAllConfigs(settings); +} + +TAsyncStatus TConfigClient::BootstrapCluster( + const std::string& selfAssemblyUUID, + const TBootstrapClusterSettings& settings) +{ + return Impl_->BootstrapCluster(selfAssemblyUUID, settings); +} + +} 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: 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()) { 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)