diff options
25 files changed, 803 insertions, 296 deletions
diff --git a/ydb/core/cms/cms_ut_common.cpp b/ydb/core/cms/cms_ut_common.cpp index 7a200779f77..ca108af43e1 100644 --- a/ydb/core/cms/cms_ut_common.cpp +++ b/ydb/core/cms/cms_ut_common.cpp @@ -491,7 +491,7 @@ static void SetupServices(TTestActorRuntime &runtime, const TTestEnvOpts &option runtime.GetNodeId(0)), TActorSetupCmd( CreateConfigsDispatcher( - NKikimr::NConsole::TConfigsDispatcherInitInfo { + NKikimr::NConfig::TConfigsDispatcherInitInfo { .InitialConfig = appConfig, }), TMailboxType::Simple, diff --git a/ydb/core/cms/console/config_item_info.h b/ydb/core/cms/console/config_item_info.h deleted file mode 100644 index a34f64a1307..00000000000 --- a/ydb/core/cms/console/config_item_info.h +++ /dev/null @@ -1,26 +0,0 @@ -#pragma once - -#include <util/generic/vector.h> -#include <util/system/types.h> - -struct TConfigItemInfo { - enum class EUpdateKind { - MutableConfigPartFromFile, - MutableConfigPartFromBaseConfig, - MutableConfigPartMergeFromFile, - ReplaceConfigWithConsoleYaml, - ReplaceConfigWithConsoleProto, - ReplaceConfigWithBase, - LoadYamlConfigFromFile, - SetExplicitly, - UpdateExplicitly, - }; - - struct TUpdate { - const char* File; - ui32 Line; - EUpdateKind Kind; - }; - - TVector<TUpdate> Updates; -}; diff --git a/ydb/core/cms/console/configs_dispatcher.cpp b/ydb/core/cms/console/configs_dispatcher.cpp index f415cf3243c..2c5c3b77c27 100644 --- a/ydb/core/cms/console/configs_dispatcher.cpp +++ b/ydb/core/cms/console/configs_dispatcher.cpp @@ -10,6 +10,8 @@ #include <ydb/library/yaml_config/yaml_config.h> #include <ydb/core/mind/tenant_pool.h> #include <ydb/core/mon/mon.h> +#include <ydb/core/config/init/mock.h> +#include <ydb/core/base/counters.h> #include <ydb/library/actors/core/actor_bootstrapped.h> #include <ydb/library/actors/core/interconnect.h> @@ -17,6 +19,7 @@ #include <ydb/library/actors/interconnect/interconnect.h> #include <library/cpp/json/json_reader.h> #include <library/cpp/json/json_writer.h> +#include <ydb/core/config/init/init.h> #include <util/generic/bitmap.h> #include <util/generic/ptr.h> @@ -35,6 +38,8 @@ namespace NKikimr::NConsole { +using namespace NConfig; + const THashSet<ui32> DYNAMIC_KINDS({ (ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem, (ui32)NKikimrConsole::TConfigItem::BootstrapConfigItem, @@ -161,6 +166,8 @@ public: TDynBitMap FilterKinds(const TDynBitMap& in); + void UpdateCandidateStartupConfig(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev); + void Handle(NMon::TEvHttpInfo::TPtr &ev); void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev); void Handle(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev); @@ -232,7 +239,14 @@ private: const std::variant<std::monostate, TDenyList, TAllowList> ItemsServeRules; const NKikimrConfig::TAppConfig BaseConfig; NKikimrConfig::TAppConfig CurrentConfig; + NKikimrConfig::TAppConfig CandidateStartupConfig; + bool StartupConfigProcessError = false; + bool StartupConfigProcessDiff = false; + TString StartupConfigInfo; + ::NMonitoring::TDynamicCounters::TCounterPtr StartupConfigChanged; const std::optional<TDebugInfo> DebugInfo; + std::shared_ptr<NConfig::TRecordedInitialConfiguratorDeps> RecordedInitialConfiguratorDeps; + std::vector<TString> Args; ui64 NextRequestCookie; TVector<TActorId> HttpRequests; TActorId CommonSubscriptionClient; @@ -257,7 +271,10 @@ TConfigsDispatcher::TConfigsDispatcher(const TConfigsDispatcherInitInfo& initInf , ItemsServeRules(initInfo.ItemsServeRules) , BaseConfig(initInfo.InitialConfig) , CurrentConfig(initInfo.InitialConfig) + , CandidateStartupConfig(initInfo.InitialConfig) , DebugInfo(initInfo.DebugInfo) + , RecordedInitialConfiguratorDeps(std::move(initInfo.RecordedInitialConfiguratorDeps)) + , Args(initInfo.Args) , NextRequestCookie(Now().GetValue()) {} @@ -270,6 +287,10 @@ void TConfigsDispatcher::Bootstrap() NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors"); mon->RegisterActorPage(actorsMonPage, "configs_dispatcher", "Configs Dispatcher", false, TlsActivationContext->ExecutorThread.ActorSystem, SelfId()); } + TIntrusivePtr<NMonitoring::TDynamicCounters> rootCounters = AppData()->Counters; + TIntrusivePtr<NMonitoring::TDynamicCounters> authCounters = GetServiceCounters(rootCounters, "config"); + NMonitoring::TDynamicCounterPtr counters = authCounters->GetSubgroup("subsystem", "ConfigsDispatcher"); + StartupConfigChanged = counters->GetCounter("StartupConfigChanged", true); auto commonClient = CreateConfigsSubscriber( SelfId(), @@ -536,6 +557,33 @@ void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev) str << "<br />" << Endl; COLLAPSED_REF_CONTENT("debug-info", "Debug info") { DIV_CLASS("tab-left") { + COLLAPSED_REF_CONTENT("args", "Startup process args") { + PRE() { + for (auto& arg : Args) { + str << "\"" << arg << "\" "; + } + } + } + str << "<br />" << Endl; + COLLAPSED_REF_CONTENT("candidate-startup-config", "Candidate startup config") { + str << "<div class=\"alert alert-primary tab-left\" role=\"alert\">" << Endl; + if (StartupConfigProcessError) { + str << "<b>Error: </b>" << Endl; + PRE() { + str << StartupConfigInfo; + } + } else if (StartupConfigProcessDiff) { + str << "<b>Configs are different: </b>" << Endl; + PRE() { + str << StartupConfigInfo; + } + } else { + str << "<b>Configs are same.</b>" << Endl; + } + str << "</div>" << Endl; + NHttp::OutputConfigHTML(str, CandidateStartupConfig); + } + str << "<br />" << Endl; COLLAPSED_REF_CONTENT("effective-config-debug-info", "Effective config debug info") { NHttp::OutputConfigDebugInfoHTML( str, @@ -700,10 +748,112 @@ void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev) HttpRequests.clear(); } +class TConfigurationResult + : public IConfigurationResult +{ +public: + // TODO make ref + const NKikimrConfig::TAppConfig& GetConfig() const { + return Config; + } + + bool HasYamlConfig() const { + return !YamlConfig.empty(); + } + + const TString& GetYamlConfig() const { + return YamlConfig; + } + + TMap<ui64, TString> GetVolatileYamlConfigs() const { + return VolatileYamlConfigs; + } + + NKikimrConfig::TAppConfig Config; + TString YamlConfig; + TMap<ui64, TString> VolatileYamlConfigs; +}; + +void TConfigsDispatcher::UpdateCandidateStartupConfig(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev) +try { + if (!RecordedInitialConfiguratorDeps) { + CandidateStartupConfig = {}; + StartupConfigProcessError = true; + StartupConfigProcessDiff = false; + StartupConfigInfo = "Startup params not recorded. Corresponding functionality won't work."; + *StartupConfigChanged = 0; + return; + } + + auto &rec = ev->Get()->Record; + + auto dcClient = std::make_unique<TDynConfigClientMock>(); + auto configs = std::make_shared<TConfigurationResult>(); + dcClient->SavedResult = configs; + configs->Config = rec.GetRawConsoleConfig(); + configs->YamlConfig = rec.GetYamlConfig(); + // TODO volatile + RecordedInitialConfiguratorDeps->DynConfigClient = std::move(dcClient); + auto deps = RecordedInitialConfiguratorDeps->GetDeps(); + NConfig::TInitialConfigurator initCfg(deps); + + std::vector<const char*> argv; + + for (const auto& arg : Args) { + argv.push_back(arg.data()); + } + + NLastGetopt::TOpts opts; + initCfg.RegisterCliOptions(opts); + deps.ProtoConfigFileProvider.RegisterCliOptions(opts); + + NLastGetopt::TOptsParseResult parseResult(&opts, argv.size(), argv.data()); + + initCfg.ValidateOptions(opts, parseResult); + initCfg.Parse(parseResult.GetFreeArgs()); + + NKikimrConfig::TAppConfig appConfig; + ui32 nodeId; + TKikimrScopeId scopeId; + TString tenantName; + TBasicKikimrServicesMask servicesMask; + TString clusterName; + NConfig::TConfigsDispatcherInitInfo configsDispatcherInitInfo; + + initCfg.Apply( + appConfig, + nodeId, + scopeId, + tenantName, + servicesMask, + clusterName, + configsDispatcherInitInfo); + + CandidateStartupConfig = appConfig; + StartupConfigProcessError = false; + StartupConfigProcessDiff = false; + StartupConfigInfo.clear(); + google::protobuf::util::MessageDifferencer md; + auto fieldComparator = google::protobuf::util::DefaultFieldComparator(); + md.set_field_comparator(&fieldComparator); + md.ReportDifferencesToString(&StartupConfigInfo); + StartupConfigProcessDiff = !md.Compare(BaseConfig, CandidateStartupConfig); + *StartupConfigChanged = StartupConfigProcessDiff ? 1 : 0; +} +catch (...) { + CandidateStartupConfig = {}; + StartupConfigProcessError = true; + StartupConfigProcessDiff = false; + StartupConfigInfo = "Got exception while processing candidate config."; + *StartupConfigChanged = 1; +} + void TConfigsDispatcher::Handle(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev) { auto &rec = ev->Get()->Record; + UpdateCandidateStartupConfig(ev); + CurrentConfig = rec.GetConfig(); const auto& newYamlConfig = rec.GetYamlConfig(); diff --git a/ydb/core/cms/console/configs_dispatcher.h b/ydb/core/cms/console/configs_dispatcher.h index e3034f93252..90ec90e07c4 100644 --- a/ydb/core/cms/console/configs_dispatcher.h +++ b/ydb/core/cms/console/configs_dispatcher.h @@ -2,7 +2,7 @@ #include "defs.h" #include <ydb/core/protos/config.pb.h> -#include <ydb/core/cms/console/config_item_info.h> +#include <ydb/core/config/init/init.h> #include <util/generic/vector.h> #include <util/generic/map.h> @@ -108,34 +108,12 @@ struct TEvConfigsDispatcher { }; }; -struct TDenyList { - std::set<ui32> Items; -}; - -struct TAllowList { - std::set<ui32> Items; -}; - -struct TDebugInfo { - NKikimrConfig::TAppConfig StaticConfig; - NKikimrConfig::TAppConfig OldDynConfig; - NKikimrConfig::TAppConfig NewDynConfig; - THashMap<ui32, TConfigItemInfo> InitInfo; -}; - -struct TConfigsDispatcherInitInfo { - NKikimrConfig::TAppConfig InitialConfig; - TMap<TString, TString> Labels; - std::variant<std::monostate, TDenyList, TAllowList> ItemsServeRules; - std::optional<TDebugInfo> DebugInfo; -}; - /** * Initial config is used to initilize Configs Dispatcher. All received configs * are compared to the current one and notifications are not sent to local * subscribers if there is no config modification detected. */ -IActor *CreateConfigsDispatcher(const TConfigsDispatcherInitInfo& initInfo); +IActor *CreateConfigsDispatcher(const NConfig::TConfigsDispatcherInitInfo& initInfo); inline TActorId MakeConfigsDispatcherID(ui32 node = 0) { char x[12] = { 'c', 'o', 'n', 'f', 'i', 'g', 's', 'd', 'i', 's', 'p' }; diff --git a/ydb/core/cms/console/console.h b/ydb/core/cms/console/console.h index fd518a69af9..bdaf507f272 100644 --- a/ydb/core/cms/console/console.h +++ b/ydb/core/cms/console/console.h @@ -358,10 +358,12 @@ struct TEvConsole { const NKikimrConfig::TAppConfig &config, const THashSet<ui32> &affectedKinds, const TString &yamlConfig = {}, - const TMap<ui64, TString> &volatileYamlConfigs = {}) + const TMap<ui64, TString> &volatileYamlConfigs = {}, + const NKikimrConfig::TAppConfig &rawConfig = {}) { Record.SetGeneration(generation); Record.MutableConfig()->CopyFrom(config); + Record.MutableRawConsoleConfig()->CopyFrom(rawConfig); for (ui32 kind : affectedKinds) Record.AddAffectedKinds(kind); diff --git a/ydb/core/cms/console/console_configs_subscriber.cpp b/ydb/core/cms/console/console_configs_subscriber.cpp index cb1a36167c8..e7482b97297 100644 --- a/ydb/core/cms/console/console_configs_subscriber.cpp +++ b/ydb/core/cms/console/console_configs_subscriber.cpp @@ -246,11 +246,16 @@ public: auto *reflection = CurrentConfig.GetReflection(); for (auto kind : rec.GetAffectedKinds()) { auto *field = desc1->FindFieldByNumber(kind); - if (field && reflection->HasField(CurrentConfig, field)) + if (field && reflection->HasField(CurrentConfig, field)) { reflection->ClearField(&CurrentConfig, field); + } + if (field && reflection->HasField(CurrentDynConfig, field)) { + reflection->ClearField(&CurrentDynConfig, field); + } } CurrentConfig.MergeFrom(rec.GetConfig()); + CurrentDynConfig.MergeFrom(rec.GetConfig()); if (newVersion.GetItems().empty()) CurrentConfig.ClearVersion(); else @@ -259,7 +264,13 @@ public: notChanged &= changes.empty(); if (!notChanged || !FirstUpdateSent) { - Send(OwnerId, new TEvConsole::TEvConfigSubscriptionNotification(Generation, CurrentConfig, changes, YamlConfig, VolatileYamlConfigs), + Send(OwnerId, new TEvConsole::TEvConfigSubscriptionNotification( + Generation, + CurrentConfig, + changes, + YamlConfig, + VolatileYamlConfigs, + CurrentDynConfig), IEventHandle::FlagTrackDelivery, Cookie); FirstUpdateSent = true; @@ -383,6 +394,7 @@ private: ui64 LastOrder; NKikimrConfig::TAppConfig CurrentConfig; + NKikimrConfig::TAppConfig CurrentDynConfig; bool ServeYaml = false; ui64 Version; diff --git a/ydb/core/cms/console/http.h b/ydb/core/cms/console/http.h index d9e0f7a45f9..89b339adb6d 100644 --- a/ydb/core/cms/console/http.h +++ b/ydb/core/cms/console/http.h @@ -2,7 +2,7 @@ #include "defs.h" #include <ydb/core/protos/config.pb.h> -#include <ydb/core/cms/console/config_item_info.h> +#include <ydb/core/config/init/init.h> #include <library/cpp/monlib/service/pages/templates.h> @@ -13,6 +13,8 @@ namespace NKikimr::NConsole::NHttp { +using namespace NConfig; + struct TCollapsedRef { template <class... TClasses> TCollapsedRef(IOutputStream& str, const TString& target, const TString& text, TClasses... classes) diff --git a/ydb/core/cms/console/ya.make b/ydb/core/cms/console/ya.make index 80a68a361dd..6fecc062050 100644 --- a/ydb/core/cms/console/ya.make +++ b/ydb/core/cms/console/ya.make @@ -73,8 +73,6 @@ SRCS( util.h ) -GENERATE_ENUM_SERIALIZATION(config_item_info.h) - PEERDIR( ydb/library/actors/core ydb/library/actors/http @@ -84,6 +82,7 @@ PEERDIR( ydb/core/blobstorage/base ydb/core/blobstorage/groupinfo ydb/core/cms/console/validators + ydb/core/config/init ydb/core/control ydb/core/engine/minikql ydb/core/mind @@ -98,6 +97,8 @@ PEERDIR( ydb/public/lib/operation_id ) +YQL_LAST_ABI_VERSION() + END() RECURSE( diff --git a/ydb/core/config/init/init.cpp b/ydb/core/config/init/init.cpp index 2b69e570315..6fbdd190075 100644 --- a/ydb/core/config/init/init.cpp +++ b/ydb/core/config/init/init.cpp @@ -1,4 +1,5 @@ #include "init_impl.h" +#include "mock.h" namespace NKikimr::NConfig { @@ -33,11 +34,6 @@ public: } }; -struct TFileConfigOptions { - TString Description; - TMaybe<TString> ParsedOption; -}; - class TDefaultProtoConfigFileProvider : public IProtoConfigFileProvider { @@ -72,7 +68,9 @@ public: void RegisterCliOptions(NLastGetopt::TOpts& opts) const override { for (const auto& [name, opt] : Opts) { - opts.AddLongOption(name, opt->Description).OptionalArgument("PATH").StoreResult(&opt->ParsedOption); + opts.AddLongOption(name, opt->Description) + .OptionalArgument("PATH") + .StoreResult(&opt->ParsedOption); } } @@ -369,7 +367,7 @@ class TDefaultNodeBrokerClient } public: - std::unique_ptr<INodeRegistrationResult> RegisterDynamicNode( + std::shared_ptr<INodeRegistrationResult> RegisterDynamicNode( const TGrpcSslSettings& grpcSettings, const TVector<TString>& addrs, const TNodeRegistrationSettings& regSettings, @@ -396,7 +394,33 @@ public: logger); } - return std::make_unique<TResult>(std::move(result)); + return std::make_shared<TResult>(std::move(result)); + } +}; + +class TDynConfigResultWrapper + : public IConfigurationResult +{ + NKikimr::NClient::TConfigurationResult Result; +public: + TDynConfigResultWrapper(NKikimr::NClient::TConfigurationResult&& result) + : Result(std::move(result)) + {} + + const NKikimrConfig::TAppConfig& GetConfig() const { + return Result.GetConfig(); + } + + bool HasYamlConfig() const { + return Result.HasYamlConfig(); + } + + const TString& GetYamlConfig() const { + return Result.GetYamlConfig(); + } + + TMap<ui64, TString> GetVolatileYamlConfigs() const { + return Result.GetVolatileYamlConfigs(); } }; @@ -409,7 +433,7 @@ class TDefaultDynConfigClient const TDynConfigSettings& settings, const IEnv& env, IInitLogger& logger, - TMaybe<NKikimr::NClient::TConfigurationResult>& res, + std::shared_ptr<IConfigurationResult>& res, TString &error) { NClient::TKikimr kikimr(GetKikimr( @@ -430,6 +454,7 @@ class TDefaultDynConfigClient 1); if (!result.IsSuccess()) { + res = nullptr; error = result.GetErrorMessage(); logger.Err() << "Configuration error: " << error << Endl; return false; @@ -437,19 +462,19 @@ class TDefaultDynConfigClient logger.Out() << "Success." << Endl; - res = result; + res = std::make_shared<TDynConfigResultWrapper>(std::move(result)); return true; } public: - TMaybe<NKikimr::NClient::TConfigurationResult> GetConfig( + std::shared_ptr<IConfigurationResult> GetConfig( const TGrpcSslSettings& grpcSettings, const TVector<TString>& addrs, const TDynConfigSettings& settings, const IEnv& env, IInitLogger& logger) const override { - TMaybe<NKikimr::NClient::TConfigurationResult> res; + std::shared_ptr<IConfigurationResult> res; bool success = false; TString error; @@ -742,7 +767,7 @@ NClient::TKikimr GetKikimr(const TGrpcSslSettings& cf, const TString& addr, cons return NClient::TKikimr(grpcConfig); } -NKikimrConfig::TAppConfig GetYamlConfigFromResult(const NKikimr::NClient::TConfigurationResult& result, const TMap<TString, TString>& labels) { +NKikimrConfig::TAppConfig GetYamlConfigFromResult(const IConfigurationResult& result, const TMap<TString, TString>& labels) { NKikimrConfig::TAppConfig yamlConfig; if (result.HasYamlConfig() && !result.GetYamlConfig().empty()) { NYamlConfig::ResolveAndParseYamlConfig( @@ -782,6 +807,54 @@ std::unique_ptr<IInitialConfigurator> MakeDefaultInitialConfigurator(TInitialCon return std::make_unique<TInitialConfiguratorImpl>(deps); } +class TInitlaConfiguratorDepsRecorder + : public IInitialConfiguratorDepsRecorder +{ + TInitialConfiguratorDependencies Impls; + TProtoConfigFileProviderRecorder ProtoConfigFileProvider; + TNodeBrokerClientRecorder NodeBrokerClient; + TDynConfigClientRecorder DynConfigClient; + TEnvRecorder Env; +public: + TInitlaConfiguratorDepsRecorder(TInitialConfiguratorDependencies deps) + : Impls(deps) + , ProtoConfigFileProvider(deps.ProtoConfigFileProvider) + , NodeBrokerClient(deps.NodeBrokerClient) + , DynConfigClient(deps.DynConfigClient) + , Env(deps.Env) + {} + + TInitialConfiguratorDependencies GetDeps() override { + return TInitialConfiguratorDependencies { + .ErrorCollector = Impls.ErrorCollector, + .ProtoConfigFileProvider = ProtoConfigFileProvider, + .ConfigUpdateTracer = Impls.ConfigUpdateTracer, + .MemLogInit = Impls.MemLogInit, + .NodeBrokerClient = NodeBrokerClient, + .DynConfigClient = DynConfigClient, + .Env = Env, + .Logger = Impls.Logger, + }; + } + + TRecordedInitialConfiguratorDeps GetRecordedDeps() const override { + return TRecordedInitialConfiguratorDeps { + .ErrorCollector = MakeDefaultErrorCollector(), + .ProtoConfigFileProvider = std::make_unique<TProtoConfigFileProviderMock>(ProtoConfigFileProvider.GetMock()), + .ConfigUpdateTracer = MakeDefaultConfigUpdateTracer(), + .MemLogInit = MakeNoopMemLogInitializer(), + .NodeBrokerClient = std::make_unique<TNodeBrokerClientMock>(NodeBrokerClient.GetMock()), + .DynConfigClient = std::make_unique<TDynConfigClientMock>(DynConfigClient.GetMock()), + .Env = std::make_unique<TEnvMock>(Env.GetMock()), + .Logger = MakeNoopInitLogger(), + }; + } +}; + +std::unique_ptr<IInitialConfiguratorDepsRecorder> MakeDefaultInitialConfiguratorDepsRecorder(TInitialConfiguratorDependencies deps) { + return std::make_unique<TInitlaConfiguratorDepsRecorder>(deps); +} + } // namespace NKikimr::NConfig Y_DECLARE_OUT_SPEC(, NKikimr::NConfig::TWithDefault<TString>, stream, value) { diff --git a/ydb/core/config/init/init.h b/ydb/core/config/init/init.h index 1c19c43026e..5dad67bd9f3 100644 --- a/ydb/core/config/init/init.h +++ b/ydb/core/config/init/init.h @@ -1,9 +1,8 @@ #pragma once +#include <ydb/core/driver_lib/run/service_mask.h> #include <ydb/core/base/event_filter.h> -#include <ydb/core/cms/console/config_item_info.h> #include <ydb/core/config/init/source_location.h> -#include <ydb/core/driver_lib/run/config.h> #include <ydb/core/protos/config.pb.h> #include <ydb/library/actors/core/interconnect.h> #include <ydb/public/lib/deprecated/kicli/kicli.h> @@ -17,6 +16,28 @@ namespace NKikimr::NConfig { +struct TConfigItemInfo { + enum class EUpdateKind { + MutableConfigPartFromFile, + MutableConfigPartFromBaseConfig, + MutableConfigPartMergeFromFile, + ReplaceConfigWithConsoleYaml, + ReplaceConfigWithConsoleProto, + ReplaceConfigWithBase, + LoadYamlConfigFromFile, + SetExplicitly, + UpdateExplicitly, + }; + + struct TUpdate { + const char* File; + ui32 Line; + EUpdateKind Kind; + }; + + TVector<TUpdate> Updates; +}; + struct TCallContext { const char* File; ui32 Line; @@ -108,7 +129,7 @@ public: class INodeBrokerClient { public: virtual ~INodeBrokerClient() {} - virtual std::unique_ptr<INodeRegistrationResult> RegisterDynamicNode( + virtual std::shared_ptr<INodeRegistrationResult> RegisterDynamicNode( const TGrpcSslSettings& grpcSettings, const TVector<TString>& addrs, const TNodeRegistrationSettings& regSettings, @@ -127,10 +148,19 @@ struct TDynConfigSettings { TString StaffApiUserToken; }; +class IConfigurationResult { +public: + virtual ~IConfigurationResult() {} + virtual const NKikimrConfig::TAppConfig& GetConfig() const = 0; + virtual bool HasYamlConfig() const = 0; + virtual const TString& GetYamlConfig() const = 0; + virtual TMap<ui64, TString> GetVolatileYamlConfigs() const = 0; +}; + class IDynConfigClient { public: virtual ~IDynConfigClient() {} - virtual TMaybe<NKikimr::NClient::TConfigurationResult> GetConfig( + virtual std::shared_ptr<IConfigurationResult> GetConfig( const TGrpcSslSettings& gs, const TVector<TString>& addrs, const TDynConfigSettings& settings, @@ -140,6 +170,65 @@ public: // === +struct TInitialConfiguratorDependencies { + NConfig::IErrorCollector& ErrorCollector; + NConfig::IProtoConfigFileProvider& ProtoConfigFileProvider; + NConfig::IConfigUpdateTracer& ConfigUpdateTracer; + NConfig::IMemLogInitializer& MemLogInit; + NConfig::INodeBrokerClient& NodeBrokerClient; + NConfig::IDynConfigClient& DynConfigClient; + NConfig::IEnv& Env; + NConfig::IInitLogger& Logger; +}; + +struct TRecordedInitialConfiguratorDeps { + TInitialConfiguratorDependencies GetDeps() { + return { + *ErrorCollector, + *ProtoConfigFileProvider, + *ConfigUpdateTracer, + *MemLogInit, + *NodeBrokerClient, + *DynConfigClient, + *Env, + *Logger + }; + } + + std::unique_ptr<NConfig::IErrorCollector> ErrorCollector; + std::unique_ptr<NConfig::IProtoConfigFileProvider> ProtoConfigFileProvider; + std::unique_ptr<NConfig::IConfigUpdateTracer> ConfigUpdateTracer; + std::unique_ptr<NConfig::IMemLogInitializer> MemLogInit; + std::unique_ptr<NConfig::INodeBrokerClient> NodeBrokerClient; + std::unique_ptr<NConfig::IDynConfigClient> DynConfigClient; + std::unique_ptr<NConfig::IEnv> Env; + std::unique_ptr<NConfig::IInitLogger> Logger; +}; + +struct TDenyList { + std::set<ui32> Items; +}; + +struct TAllowList { + std::set<ui32> Items; +}; + +struct TDebugInfo { + NKikimrConfig::TAppConfig StaticConfig; + NKikimrConfig::TAppConfig OldDynConfig; + NKikimrConfig::TAppConfig NewDynConfig; + THashMap<ui32, TConfigItemInfo> InitInfo; +}; + +struct TConfigsDispatcherInitInfo { + NKikimrConfig::TAppConfig InitialConfig; + TMap<TString, TString> Labels; + std::variant<std::monostate, TDenyList, TAllowList> ItemsServeRules; + std::optional<TDebugInfo> DebugInfo; + std::shared_ptr<NConfig::TRecordedInitialConfiguratorDeps> RecordedInitialConfiguratorDeps = nullptr; + std::vector<TString> Args; +}; + class IInitialConfigurator { public: virtual ~IInitialConfigurator() {}; @@ -152,22 +241,8 @@ public: TKikimrScopeId& scopeId, TString& tenantName, TBasicKikimrServicesMask& servicesMask, - TMap<TString, TString>& labels, TString& clusterName, - NKikimrConfig::TAppConfig& initialCmsConfig, - NKikimrConfig::TAppConfig& initialCmsYamlConfig, - THashMap<ui32, TConfigItemInfo>& configInitInfo) const = 0; -}; - -struct TInitialConfiguratorDependencies { - NConfig::IErrorCollector& ErrorCollector; - NConfig::IProtoConfigFileProvider& ProtoConfigFileProvider; - NConfig::IConfigUpdateTracer& ConfigUpdateTracer; - NConfig::IMemLogInitializer& MemLogInit; - NConfig::INodeBrokerClient& NodeBrokerClient; - NConfig::IDynConfigClient& DynConfigClient; - NConfig::IEnv& Env; - NConfig::IInitLogger& Logger; + NConfig::TConfigsDispatcherInitInfo& configsDispatcherInitInfo) const = 0; }; std::unique_ptr<IConfigUpdateTracer> MakeDefaultConfigUpdateTracer(); @@ -186,10 +261,21 @@ std::unique_ptr<IInitLogger> MakeNoopInitLogger(); std::unique_ptr<IInitialConfigurator> MakeDefaultInitialConfigurator(TInitialConfiguratorDependencies deps); +class IInitialConfiguratorDepsRecorder { +public: + virtual ~IInitialConfiguratorDepsRecorder() {} + + virtual TInitialConfiguratorDependencies GetDeps() = 0; + + virtual TRecordedInitialConfiguratorDeps GetRecordedDeps() const = 0; +}; + +std::unique_ptr<IInitialConfiguratorDepsRecorder> MakeDefaultInitialConfiguratorDepsRecorder(TInitialConfiguratorDependencies deps); + class TInitialConfigurator { public: TInitialConfigurator(TInitialConfiguratorDependencies deps) - : Impl(MakeDefaultInitialConfigurator(deps)) + : Impl(MakeDefaultInitialConfigurator(deps)) {} void RegisterCliOptions(NLastGetopt::TOpts& opts) { @@ -210,11 +296,8 @@ public: TKikimrScopeId& scopeId, TString& tenantName, TBasicKikimrServicesMask& servicesMask, - TMap<TString, TString>& labels, TString& clusterName, - NKikimrConfig::TAppConfig& initialCmsConfig, - NKikimrConfig::TAppConfig& initialCmsYamlConfig, - THashMap<ui32, TConfigItemInfo>& configInitInfo) const + TConfigsDispatcherInitInfo& configsDispatcherInitInfo) const { Impl->Apply( appConfig, @@ -222,11 +305,8 @@ public: scopeId, tenantName, servicesMask, - labels, clusterName, - initialCmsConfig, - initialCmsYamlConfig, - configInitInfo); + configsDispatcherInitInfo); } private: diff --git a/ydb/core/config/init/init_impl.h b/ydb/core/config/init/init_impl.h index d92100a0b18..59a1682d37c 100644 --- a/ydb/core/config/init/init_impl.h +++ b/ydb/core/config/init/init_impl.h @@ -7,7 +7,6 @@ #include <ydb/core/base/location.h> #include <ydb/core/base/path.h> -#include <ydb/core/cms/console/config_item_info.h> #include <ydb/core/driver_lib/run/config.h> #include <ydb/core/protos/config.pb.h> #include <ydb/core/protos/node_broker.pb.h> @@ -72,6 +71,10 @@ struct TConfigRefs { IProtoConfigFileProvider& ProtoConfigFileProvider; }; +struct TFileConfigOptions { + TString Description; + TMaybe<TString> ParsedOption; +}; template <class TProto> using TAccessors = std::tuple< @@ -865,7 +868,7 @@ TString DeduceNodeDomain(const NConfig::TCommonAppOptions& cf, const NKikimrConf ui32 NextValidKind(ui32 kind); bool HasCorrespondingManagedKind(ui32 kind, const NKikimrConfig::TAppConfig& appConfig); NClient::TKikimr GetKikimr(const TGrpcSslSettings& cf, const TString& addr, const IEnv& env); -NKikimrConfig::TAppConfig GetYamlConfigFromResult(const NKikimr::NClient::TConfigurationResult& result, const TMap<TString, TString>& labels); +NKikimrConfig::TAppConfig GetYamlConfigFromResult(const IConfigurationResult& result, const TMap<TString, TString>& labels); NKikimrConfig::TAppConfig GetActualDynConfig( const NKikimrConfig::TAppConfig& yamlConfig, const NKikimrConfig::TAppConfig& regularConfig, @@ -1176,7 +1179,7 @@ public: AppConfig.GetAuthConfig().GetStaffApiUserToken(), }; - TMaybe<NKikimr::NClient::TConfigurationResult> result = DynConfigClient.GetConfig(CommonAppOptions.GrpcSslSettings, addrs, settings, Env, Logger); + auto result = DynConfigClient.GetConfig(CommonAppOptions.GrpcSslSettings, addrs, settings, Env, Logger); if (!result) { return; @@ -1211,22 +1214,25 @@ public: TKikimrScopeId& scopeId, TString& tenantName, TBasicKikimrServicesMask& servicesMask, - TMap<TString, TString>& labels, TString& clusterName, - NKikimrConfig::TAppConfig& initialCmsConfig, - NKikimrConfig::TAppConfig& initialCmsYamlConfig, - THashMap<ui32, TConfigItemInfo>& configInitInfo) const override + TConfigsDispatcherInitInfo& configsDispatcherInitInfo) const override { appConfig = AppConfig; nodeId = NodeId; scopeId = ScopeId; tenantName = TenantName; servicesMask = ServicesMask; - labels = Labels; clusterName = ClusterName; - initialCmsConfig.CopyFrom(InitDebug.OldConfig); - initialCmsYamlConfig.CopyFrom(InitDebug.YamlConfig); - configInitInfo = InitDebug.ConfigTransformInfo; + configsDispatcherInitInfo.InitialConfig = appConfig; + configsDispatcherInitInfo.ItemsServeRules = std::monostate{}, + configsDispatcherInitInfo.Labels = Labels; + configsDispatcherInitInfo.DebugInfo = TDebugInfo { + .InitInfo = InitDebug.ConfigTransformInfo, + }; + auto& debugInfo = *configsDispatcherInitInfo.DebugInfo; + debugInfo.StaticConfig.CopyFrom(appConfig); // FIXME it's not static config + debugInfo.OldDynConfig.CopyFrom(InitDebug.OldConfig); + debugInfo.NewDynConfig.CopyFrom(InitDebug.YamlConfig); } }; diff --git a/ydb/core/config/init/init_noop.cpp b/ydb/core/config/init/init_noop.cpp index 9d6b653745b..87198f5b316 100644 --- a/ydb/core/config/init/init_noop.cpp +++ b/ydb/core/config/init/init_noop.cpp @@ -18,33 +18,33 @@ class TNoopInitLogger public: IOutputStream& Out() const noexcept override { return NullStream; - }; + } IOutputStream& Err() const noexcept override { return NullStream; - }; + } }; class TNoopDynConfigClient : public IDynConfigClient { public: - TMaybe<NKikimr::NClient::TConfigurationResult> GetConfig( + std::shared_ptr<IConfigurationResult> GetConfig( const TGrpcSslSettings&, const TVector<TString>&, const TDynConfigSettings&, const IEnv&, IInitLogger&) const override { - return {}; - }; + return nullptr; + } }; class TNoopNodeBrokerClient : public INodeBrokerClient { public: - std::unique_ptr<INodeRegistrationResult> RegisterDynamicNode( + std::shared_ptr<INodeRegistrationResult> RegisterDynamicNode( const TGrpcSslSettings&, const TVector<TString>&, const TNodeRegistrationSettings&, @@ -52,14 +52,14 @@ public: IInitLogger&) const override { return nullptr; - }; + } }; class TNoopMemLogInitializer : public IMemLogInitializer { public: - void Init(const NKikimrConfig::TMemoryLogConfig&) const override {}; + void Init(const NKikimrConfig::TMemoryLogConfig&) const override {} }; std::unique_ptr<IMemLogInitializer> MakeNoopMemLogInitializer() { diff --git a/ydb/core/config/init/mock.h b/ydb/core/config/init/mock.h new file mode 100644 index 00000000000..568aeaaab49 --- /dev/null +++ b/ydb/core/config/init/mock.h @@ -0,0 +1,237 @@ +#pragma once + +#include "init.h" +#include "init_impl.h" + +namespace NKikimr::NConfig { + +class TEnvMock + : public IEnv +{ +public: + TString HostName() const override { + return SavedHostName; + } + + TString FQDNHostName() const override { + return SavedFQDNHostName; + } + + TString ReadFromFile(const TString& filePath, const TString& fileName, bool allowEmpty = true) const override { + Y_UNUSED(allowEmpty); + if (auto it = SavedFiles.find({filePath, fileName}); it != SavedFiles.end()) { + return it->second; + } + return ""; // TODO throw + } + + void Sleep(const TDuration&) const override { + return; + } + + TString SavedHostName; + TString SavedFQDNHostName; + TMap<std::pair<TString, TString>, TString> SavedFiles; +}; + +class TEnvRecorder + : public IEnv +{ + IEnv& Impl; + mutable TEnvMock Mock; +public: + TEnvRecorder(IEnv& impl) + : Impl(impl) + {} + + TString HostName() const override { + Mock.SavedHostName = Impl.HostName(); + return Mock.SavedHostName; + } + + TString FQDNHostName() const override { + Mock.SavedFQDNHostName = Impl.FQDNHostName(); + return Mock.SavedFQDNHostName; + } + + TString ReadFromFile(const TString& filePath, const TString& fileName, bool allowEmpty = true) const override { + auto& File = Mock.SavedFiles[{filePath, fileName}]; + File = Impl.ReadFromFile(filePath, fileName, allowEmpty); + return File; + } + + void Sleep(const TDuration& dur) const override { + return Impl.Sleep(dur); + } + + TEnvMock GetMock() const { + return Mock; + } +}; + +class TDynConfigClientMock + : public IDynConfigClient +{ +public: + std::shared_ptr<IConfigurationResult> GetConfig( + const TGrpcSslSettings& gs, + const TVector<TString>& addrs, + const TDynConfigSettings& settings, + const IEnv& env, + IInitLogger& logger) const override + { + Y_UNUSED(gs, addrs, settings, env, logger); // TODO validate unchanged + return SavedResult; + } + + std::shared_ptr<IConfigurationResult> SavedResult; +}; + +class TDynConfigClientRecorder + : public IDynConfigClient +{ + IDynConfigClient& Impl; + mutable TDynConfigClientMock Mock; +public: + TDynConfigClientRecorder(IDynConfigClient& impl) + : Impl(impl) + {} + + std::shared_ptr<IConfigurationResult> GetConfig( + const TGrpcSslSettings& gs, + const TVector<TString>& addrs, + const TDynConfigSettings& settings, + const IEnv& env, + IInitLogger& logger) const override + { + Mock.SavedResult = Impl.GetConfig(gs, addrs, settings, env, logger); + return Mock.SavedResult; + } + + TDynConfigClientMock GetMock() const { + return Mock; + } +}; + +class TNodeBrokerClientMock + : public INodeBrokerClient +{ +public: + std::shared_ptr<INodeRegistrationResult> RegisterDynamicNode( + const TGrpcSslSettings& grpcSettings, + const TVector<TString>& addrs, + const TNodeRegistrationSettings& regSettings, + const IEnv& env, + IInitLogger& logger) const override + { + Y_UNUSED(grpcSettings, addrs, regSettings, env, logger); + return SavedResult; + } + + std::shared_ptr<INodeRegistrationResult> SavedResult; +}; + +class TNodeBrokerClientRecorder + : public INodeBrokerClient +{ + INodeBrokerClient& Impl; + mutable TNodeBrokerClientMock Mock; +public: + TNodeBrokerClientRecorder(INodeBrokerClient& impl) + : Impl(impl) + {} + + std::shared_ptr<INodeRegistrationResult> RegisterDynamicNode( + const TGrpcSslSettings& grpcSettings, + const TVector<TString>& addrs, + const TNodeRegistrationSettings& regSettings, + const IEnv& env, + IInitLogger& logger) const override + { + Mock.SavedResult = Impl.RegisterDynamicNode(grpcSettings, addrs, regSettings, env, logger); + return Mock.SavedResult; + } + + TNodeBrokerClientMock GetMock() const { + return Mock; + } +}; + +class TProtoConfigFileProviderMock + : public IProtoConfigFileProvider +{ +public: + void AddConfigFile(TString optName, TString description) override { + SavedOpts[optName] = MakeSimpleShared<TFileConfigOptions>(TFileConfigOptions{.Description = description}); + } + + void RegisterCliOptions(NLastGetopt::TOpts& opts) const override { + for (const auto& [name, opt] : SavedOpts) { + opts.AddLongOption(name, opt->Description) + .OptionalArgument("PATH") + .StoreResult(&opt->ParsedOption); + } + } + + TString GetProtoFromFile(const TString& path, IErrorCollector& errorCollector) const override { + Y_UNUSED(path, errorCollector, SavedFiles); + return SavedFiles.at(path); + } + + bool Has(TString optName) override { + if (auto* opt = SavedOpts.FindPtr(optName)) { + return !!((*opt)->ParsedOption); + } + return false; + } + + TString Get(TString optName) override { + if (auto* opt = SavedOpts.FindPtr(optName); opt && (*opt)->ParsedOption) { + return (*opt)->ParsedOption.GetRef(); + } + ythrow yexception() << "option " << optName.Quote() << " undefined"; + } + + TMap<TString, TSimpleSharedPtr<TFileConfigOptions>> SavedOpts; + TMap<TString, TString> SavedFiles; +}; + + +class TProtoConfigFileProviderRecorder + : public IProtoConfigFileProvider +{ + IProtoConfigFileProvider& Impl; + mutable TProtoConfigFileProviderMock Mock; +public: + TProtoConfigFileProviderRecorder(IProtoConfigFileProvider& impl) + : Impl(impl) + {} + + void AddConfigFile(TString optName, TString description) override { + Mock.AddConfigFile(optName, description); + Impl.AddConfigFile(optName, description); + } + + void RegisterCliOptions(NLastGetopt::TOpts& opts) const override { + Impl.RegisterCliOptions(opts); + } + + TString GetProtoFromFile(const TString& path, IErrorCollector& errorCollector) const override { + Mock.SavedFiles[path] = Impl.GetProtoFromFile(path, errorCollector); + return Mock.SavedFiles[path]; + } + + bool Has(TString optName) override { + return Impl.Has(optName); + } + + TString Get(TString optName) override { + return Impl.Get(optName); + } + + TProtoConfigFileProviderMock GetMock() const { + return Mock; + } +}; + +} // namespace NKikimr::NConfig diff --git a/ydb/core/config/init/ut/ya.make b/ydb/core/config/init/ut/ya.make index 2de7e9a1644..f5ab5089797 100644 --- a/ydb/core/config/init/ut/ya.make +++ b/ydb/core/config/init/ut/ya.make @@ -6,7 +6,8 @@ SRCS( PEERDIR( ydb/core/config/init - ydb/library/yql/sql/pg_dummy + ydb/library/yql/sql/pg_dummy + ydb/library/yql/public/udf/service/stub ) YQL_LAST_ABI_VERSION() diff --git a/ydb/core/config/init/ya.make b/ydb/core/config/init/ya.make index c10c6c3e366..00ac73bd891 100644 --- a/ydb/core/config/init/ya.make +++ b/ydb/core/config/init/ya.make @@ -16,12 +16,13 @@ PEERDIR( ydb/library/yaml_config ydb/library/yql/minikql ydb/library/yql/public/udf - ydb/library/yql/public/udf/service/exception_policy ydb/public/lib/deprecated/kicli ydb/public/sdk/cpp/client/ydb_discovery ydb/public/sdk/cpp/client/ydb_driver ) +GENERATE_ENUM_SERIALIZATION(init.h) + YQL_LAST_ABI_VERSION() END() diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp index 65707d8f10a..68ba6f76cba 100644 --- a/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp +++ b/ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp @@ -13,7 +13,7 @@ TClientCommandServer::TClientCommandServer(std::shared_ptr<TModuleFactories> fac , DynConfigClient(NConfig::MakeDefaultDynConfigClient()) , Env(NConfig::MakeDefaultEnv()) , Logger(NConfig::MakeDefaultInitLogger()) - , InitCfg({ + , DepsRecorder(NConfig::MakeDefaultInitialConfiguratorDepsRecorder({ *ErrorCollector, *ProtoConfigFileProvider, *ConfigUpdateTracer, @@ -22,28 +22,33 @@ TClientCommandServer::TClientCommandServer(std::shared_ptr<TModuleFactories> fac *DynConfigClient, *Env, *Logger - }) + })) + , InitCfg(DepsRecorder->GetDeps()) {} -int TClientCommandServer::Run(TConfig& /*config*/) { +int TClientCommandServer::Run(TConfig& config) { NKikimrConfig::TAppConfig appConfig; - TKikimrRunConfig RunConfig(appConfig); + TKikimrRunConfig runConfig(appConfig); InitCfg.Apply( appConfig, - RunConfig.NodeId, - RunConfig.ScopeId, - RunConfig.TenantName, - RunConfig.ServicesMask, - RunConfig.Labels, - RunConfig.ClusterName, - RunConfig.InitialCmsConfig, - RunConfig.InitialCmsYamlConfig, - RunConfig.ConfigInitInfo); + runConfig.NodeId, + runConfig.ScopeId, + runConfig.TenantName, + runConfig.ServicesMask, + runConfig.ClusterName, + runConfig.ConfigsDispatcherInitInfo); - Y_ABORT_UNLESS(RunConfig.NodeId); - return MainRun(RunConfig, Factories); + runConfig.ConfigsDispatcherInitInfo.RecordedInitialConfiguratorDeps = + std::make_shared<NConfig::TRecordedInitialConfiguratorDeps>(DepsRecorder->GetRecordedDeps()); + + for (int i = 0; i < config.ArgC; ++i) { + runConfig.ConfigsDispatcherInitInfo.Args.push_back(config.ArgV[i]); + } + + Y_ABORT_UNLESS(runConfig.NodeId); + return MainRun(runConfig, Factories); } void TClientCommandServer::Config(TConfig& config) { diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_server.h b/ydb/core/driver_lib/cli_utils/cli_cmds_server.h index 4646f37da52..f64ae5ba431 100644 --- a/ydb/core/driver_lib/cli_utils/cli_cmds_server.h +++ b/ydb/core/driver_lib/cli_utils/cli_cmds_server.h @@ -30,6 +30,8 @@ protected: std::unique_ptr<NConfig::IEnv> Env; std::unique_ptr<NConfig::IInitLogger> Logger; + std::unique_ptr<NConfig::IInitialConfiguratorDepsRecorder> DepsRecorder; + NConfig::TInitialConfigurator InitCfg; }; diff --git a/ydb/core/driver_lib/cli_utils/cli_cmds_validate_config.cpp b/ydb/core/driver_lib/cli_utils/cli_cmds_validate_config.cpp index f1a1c108db8..f78dc555d99 100644 --- a/ydb/core/driver_lib/cli_utils/cli_cmds_validate_config.cpp +++ b/ydb/core/driver_lib/cli_utils/cli_cmds_validate_config.cpp @@ -48,11 +48,8 @@ NKikimrConfig::TAppConfig TransformConfig(const std::vector<TString>& args) { TKikimrScopeId scopeId; TString tenantName; TBasicKikimrServicesMask servicesMask; - TMap<TString, TString> labels; TString clusterName; - NKikimrConfig::TAppConfig initialCmsConfig; - NKikimrConfig::TAppConfig initialCmsYamlConfig; - THashMap<ui32, TConfigItemInfo> configInitInfo; + NConfig::TConfigsDispatcherInitInfo configsDispatcherInitInfo; initCfg->Apply( appConfig, @@ -60,11 +57,8 @@ NKikimrConfig::TAppConfig TransformConfig(const std::vector<TString>& args) { scopeId, tenantName, servicesMask, - labels, clusterName, - initialCmsConfig, - initialCmsYamlConfig, - configInitInfo); + configsDispatcherInitInfo); return appConfig; } diff --git a/ydb/core/driver_lib/run/config.h b/ydb/core/driver_lib/run/config.h index 2cd944329a6..40e4aa360ec 100644 --- a/ydb/core/driver_lib/run/config.h +++ b/ydb/core/driver_lib/run/config.h @@ -1,8 +1,10 @@ #pragma once +#include "service_mask.h" + #include <ydb/core/protos/config.pb.h> #include <ydb/core/base/event_filter.h> -#include <ydb/core/cms/console/config_item_info.h> +#include <ydb/core/config/init/init.h> #include <ydb/core/driver_lib/cli_config_base/config_base.h> #include <util/generic/hash.h> @@ -11,142 +13,19 @@ namespace NKikimr { -union TBasicKikimrServicesMask { - struct { - bool EnableBasicServices:1; - bool EnableIcbService:1; - bool EnableWhiteBoard:1; - bool EnableBSNodeWarden:1; - bool EnableStateStorageService:1; - bool EnableLocalService:1; - bool EnableSharedCache:1; - bool EnableBlobCache:1; - bool EnableLogger:1; - bool EnableSchedulerActor:1; - bool EnableProfiler:1; - bool EnableResourceBroker:1; - bool EnableTabletResolver:1; - bool EnableTabletMonitoringProxy:1; - bool EnableTabletCountersAggregator:1; - bool EnableRestartsCountPublisher:1; - bool EnableBootstrapper:1; - bool EnableMediatorTimeCastProxy:1; - bool EnableTxProxy:1; - bool EnableMiniKQLCompileService:1; - bool EnableMessageBusServices:1; - bool EnableStatsCollector:1; - bool EnableSelfPing:1; - bool EnableTabletMonitor:1; - bool EnableViewerService:1; - bool EnableLoadService:1; - bool EnableFailureInjectionService:1; - bool EnablePersQueueL2Cache:1; - bool EnableKqp:1; - bool EnableMemoryLog:1; - bool EnableGRpcService:1; - bool UNUSED_EnableNodeIdentifier:1; - bool EnableCms:1; - bool EnableNodeTable:1; - bool EnableGRpcProxyStatus:1; - bool EnablePQ:1; - bool EnableSqs:1; - bool EnableConfigsDispatcher:1; - bool EnableSecurityServices:1; - bool EnableTabletInfo:1; - bool EnableQuoterService:1; - bool EnablePersQueueClusterDiscovery:1; - bool EnableNetClassifier:1; - bool EnablePersQueueClusterTracker:1; - bool EnablePersQueueDirectReadCache:1; - bool EnableSysViewService:1; - bool EnableMeteringWriter:1; - bool EnableAuditWriter:1; - bool EnableSchemeBoardMonitoring:1; - bool EnableConfigsCache:1; - bool EnableLongTxService:1; - bool EnableHealthCheckService:1; - bool EnableYandexQuery:1; - bool EnableSequenceProxyService:1; - bool EnableHttpProxy:1; - bool EnableMetadataProvider:1; - bool EnableReplicationService:1; - bool EnableBackgroundTasks:1; - bool EnableExternalIndex: 1; - bool EnableScanConveyor : 1; - bool EnableCompConveyor : 1; - bool EnableInsertConveyor : 1; - bool EnableLocalPgWire:1; - bool EnableKafkaProxy:1; - bool EnableIcNodeCacheService:1; - bool EnableMemoryTracker:1; - - // next 64 flags - - bool EnableDatabaseMetadataCache:1; - bool EnableGraphService:1; - }; - - struct { - ui64 Raw1; - ui64 Raw2; - }; - - void DisableAll() { - Raw1 = 0; - Raw2 = 0; - } - - void EnableAll() { - Raw1 = 0xFFFFFFFFFFFFFFFFLL; - Raw2 = 0xFFFFFFFFFFFFFFFFLL; - } - - void EnableYQ() { - EnableBasicServices = true; - EnableLogger = true; - EnableSchedulerActor = true; - EnableStatsCollector = true; - EnableSelfPing = true; - EnableMemoryLog = true; - EnableGRpcService = true; - EnableSecurityServices = true; - EnableYandexQuery = true; - EnableViewerService = true; - EnableMeteringWriter = true; - EnableProfiler = true; - } - - void SetTinyMode() { - EnableSelfPing = false; - EnableMemoryTracker = false; - - // TODO: set EnableStatsCollector to false as well - } - - TBasicKikimrServicesMask() { - EnableAll(); - } -}; - -static_assert(sizeof(TBasicKikimrServicesMask) == 16, "expected sizeof(TBasicKikimrServicesMask) == 16"); - struct TKikimrRunConfig { NKikimrConfig::TAppConfig& AppConfig; - ui32 NodeId; - TKikimrScopeId ScopeId; - - TString PathToConfigCacheFile; + ui32 NodeId; + TKikimrScopeId ScopeId; - TString TenantName; - TBasicKikimrServicesMask ServicesMask; + TString PathToConfigCacheFile; - TMap<TString, TString> Labels; + TString TenantName; + TBasicKikimrServicesMask ServicesMask; - TString ClusterName; + TString ClusterName; - NKikimrConfig::TAppConfig InitialCmsConfig; - NKikimrConfig::TAppConfig InitialCmsYamlConfig; - THashMap<ui32, TConfigItemInfo> ConfigInitInfo; + NConfig::TConfigsDispatcherInitInfo ConfigsDispatcherInitInfo; TKikimrRunConfig(NKikimrConfig::TAppConfig& appConfig, ui32 nodeId = 0, const TKikimrScopeId& scopeId = {}); diff --git a/ydb/core/driver_lib/run/kikimr_services_initializers.cpp b/ydb/core/driver_lib/run/kikimr_services_initializers.cpp index d8b4afb0318..fba5ee93100 100644 --- a/ydb/core/driver_lib/run/kikimr_services_initializers.cpp +++ b/ydb/core/driver_lib/run/kikimr_services_initializers.cpp @@ -2424,27 +2424,13 @@ void THttpProxyServiceInitializer::InitializeServices(NActors::TActorSystemSetup TConfigsDispatcherInitializer::TConfigsDispatcherInitializer(const TKikimrRunConfig& runConfig) - : IKikimrServicesInitializer(runConfig) - , Labels(runConfig.Labels) - , InitialCmsConfig(runConfig.InitialCmsConfig) - , InitialCmsYamlConfig(runConfig.InitialCmsYamlConfig) - , ConfigInitInfo(runConfig.ConfigInitInfo) + : IKikimrServicesInitializer(runConfig) + , ConfigsDispatcherInitInfo(runConfig.ConfigsDispatcherInitInfo) { } void TConfigsDispatcherInitializer::InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) { - NKikimr::NConsole::TConfigsDispatcherInitInfo initInfo { - .InitialConfig = Config, - .Labels = Labels, - .ItemsServeRules = std::monostate{}, - .DebugInfo = NKikimr::NConsole::TDebugInfo { - .StaticConfig = Config, - .OldDynConfig = InitialCmsConfig, - .NewDynConfig = InitialCmsYamlConfig, - .InitInfo = ConfigInitInfo, - }, - }; - IActor* actor = NConsole::CreateConfigsDispatcher(initInfo); + IActor* actor = NConsole::CreateConfigsDispatcher(ConfigsDispatcherInitInfo); setup->LocalServices.push_back(std::pair<TActorId, TActorSetupCmd>( NConsole::MakeConfigsDispatcherID(NodeId), TActorSetupCmd(actor, TMailboxType::HTSwap, appData->UserPoolId))); diff --git a/ydb/core/driver_lib/run/kikimr_services_initializers.h b/ydb/core/driver_lib/run/kikimr_services_initializers.h index 2b6cd37f7c6..06238a6f08e 100644 --- a/ydb/core/driver_lib/run/kikimr_services_initializers.h +++ b/ydb/core/driver_lib/run/kikimr_services_initializers.h @@ -478,10 +478,7 @@ public: void InitializeServices(NActors::TActorSystemSetup* setup, const NKikimr::TAppData* appData) override; private: - TMap<TString, TString> Labels; - NKikimrConfig::TAppConfig InitialCmsConfig; - NKikimrConfig::TAppConfig InitialCmsYamlConfig; - THashMap<ui32, TConfigItemInfo> ConfigInitInfo; + NConfig::TConfigsDispatcherInitInfo ConfigsDispatcherInitInfo; }; class TConfigsCacheInitializer : public IKikimrServicesInitializer { diff --git a/ydb/core/driver_lib/run/service_mask.h b/ydb/core/driver_lib/run/service_mask.h new file mode 100644 index 00000000000..17e64c5a849 --- /dev/null +++ b/ydb/core/driver_lib/run/service_mask.h @@ -0,0 +1,126 @@ +#pragma once + +#include <util/system/types.h> + +namespace NKikimr { + +union TBasicKikimrServicesMask { + struct { + bool EnableBasicServices:1; + bool EnableIcbService:1; + bool EnableWhiteBoard:1; + bool EnableBSNodeWarden:1; + bool EnableStateStorageService:1; + bool EnableLocalService:1; + bool EnableSharedCache:1; + bool EnableBlobCache:1; + bool EnableLogger:1; + bool EnableSchedulerActor:1; + bool EnableProfiler:1; + bool EnableResourceBroker:1; + bool EnableTabletResolver:1; + bool EnableTabletMonitoringProxy:1; + bool EnableTabletCountersAggregator:1; + bool EnableRestartsCountPublisher:1; + bool EnableBootstrapper:1; + bool EnableMediatorTimeCastProxy:1; + bool EnableTxProxy:1; + bool EnableMiniKQLCompileService:1; + bool EnableMessageBusServices:1; + bool EnableStatsCollector:1; + bool EnableSelfPing:1; + bool EnableTabletMonitor:1; + bool EnableViewerService:1; + bool EnableLoadService:1; + bool EnableFailureInjectionService:1; + bool EnablePersQueueL2Cache:1; + bool EnableKqp:1; + bool EnableMemoryLog:1; + bool EnableGRpcService:1; + bool UNUSED_EnableNodeIdentifier:1; + bool EnableCms:1; + bool EnableNodeTable:1; + bool EnableGRpcProxyStatus:1; + bool EnablePQ:1; + bool EnableSqs:1; + bool EnableConfigsDispatcher:1; + bool EnableSecurityServices:1; + bool EnableTabletInfo:1; + bool EnableQuoterService:1; + bool EnablePersQueueClusterDiscovery:1; + bool EnableNetClassifier:1; + bool EnablePersQueueClusterTracker:1; + bool EnablePersQueueDirectReadCache:1; + bool EnableSysViewService:1; + bool EnableMeteringWriter:1; + bool EnableAuditWriter:1; + bool EnableSchemeBoardMonitoring:1; + bool EnableConfigsCache:1; + bool EnableLongTxService:1; + bool EnableHealthCheckService:1; + bool EnableYandexQuery:1; + bool EnableSequenceProxyService:1; + bool EnableHttpProxy:1; + bool EnableMetadataProvider:1; + bool EnableReplicationService:1; + bool EnableBackgroundTasks:1; + bool EnableExternalIndex: 1; + bool EnableScanConveyor : 1; + bool EnableCompConveyor : 1; + bool EnableInsertConveyor : 1; + bool EnableLocalPgWire:1; + bool EnableKafkaProxy:1; + bool EnableIcNodeCacheService:1; + bool EnableMemoryTracker:1; + + // next 64 flags + + bool EnableDatabaseMetadataCache:1; + bool EnableGraphService:1; + }; + + struct { + ui64 Raw1; + ui64 Raw2; + }; + + void DisableAll() { + Raw1 = 0; + Raw2 = 0; + } + + void EnableAll() { + Raw1 = 0xFFFFFFFFFFFFFFFFLL; + Raw2 = 0xFFFFFFFFFFFFFFFFLL; + } + + void EnableYQ() { + EnableBasicServices = true; + EnableLogger = true; + EnableSchedulerActor = true; + EnableStatsCollector = true; + EnableSelfPing = true; + EnableMemoryLog = true; + EnableGRpcService = true; + EnableSecurityServices = true; + EnableYandexQuery = true; + EnableViewerService = true; + EnableMeteringWriter = true; + EnableProfiler = true; + } + + void SetTinyMode() { + EnableSelfPing = false; + EnableMemoryTracker = false; + + // TODO: set EnableStatsCollector to false as well + } + + TBasicKikimrServicesMask() { + EnableAll(); + } +}; + +static_assert(sizeof(TBasicKikimrServicesMask) == 16, "expected sizeof(TBasicKikimrServicesMask) == 16"); + +} diff --git a/ydb/core/protos/console_config.proto b/ydb/core/protos/console_config.proto index 69e1a7dcf01..d9a00f5cdb5 100644 --- a/ydb/core/protos/console_config.proto +++ b/ydb/core/protos/console_config.proto @@ -484,6 +484,7 @@ message TConfigSubscriptionNotification { optional string YamlConfig = 5; optional bool YamlConfigNotChanged = 6; repeated TVolatileYamlConfig VolatileConfigs = 7; + optional NKikimrConfig.TAppConfig RawConsoleConfig = 103; // Used for correct next startup config prediction } message TSubscription { diff --git a/ydb/core/testlib/tenant_runtime.cpp b/ydb/core/testlib/tenant_runtime.cpp index 84e8938fcc1..64f2af721a2 100644 --- a/ydb/core/testlib/tenant_runtime.cpp +++ b/ydb/core/testlib/tenant_runtime.cpp @@ -1035,7 +1035,7 @@ void TTenantTestRuntime::Setup(bool createTenantPools) } labels.emplace("node_id", ToString(i)); auto aid = Register(CreateConfigsDispatcher( - NKikimr::NConsole::TConfigsDispatcherInitInfo { + NKikimr::NConfig::TConfigsDispatcherInitInfo { .InitialConfig = Extension, .Labels = labels, } diff --git a/ydb/core/testlib/test_client.cpp b/ydb/core/testlib/test_client.cpp index 881372db2b8..cc46e377fd8 100644 --- a/ydb/core/testlib/test_client.cpp +++ b/ydb/core/testlib/test_client.cpp @@ -737,7 +737,7 @@ namespace Tests { initial.MutableImmediateControlsConfig()->CopyFrom(Settings->Controls); } auto *dispatcher = NConsole::CreateConfigsDispatcher( - NKikimr::NConsole::TConfigsDispatcherInitInfo { + NKikimr::NConfig::TConfigsDispatcherInitInfo { .InitialConfig = initial, }); auto aid = Runtime->Register(dispatcher, nodeIdx, appData.SystemPoolId, TMailboxType::Revolving, 0); |
