summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ydb/core/cms/cms_ut_common.cpp2
-rw-r--r--ydb/core/cms/console/config_item_info.h26
-rw-r--r--ydb/core/cms/console/configs_dispatcher.cpp150
-rw-r--r--ydb/core/cms/console/configs_dispatcher.h26
-rw-r--r--ydb/core/cms/console/console.h4
-rw-r--r--ydb/core/cms/console/console_configs_subscriber.cpp16
-rw-r--r--ydb/core/cms/console/http.h4
-rw-r--r--ydb/core/cms/console/ya.make5
-rw-r--r--ydb/core/config/init/init.cpp99
-rw-r--r--ydb/core/config/init/init.h136
-rw-r--r--ydb/core/config/init/init_impl.h28
-rw-r--r--ydb/core/config/init/init_noop.cpp16
-rw-r--r--ydb/core/config/init/mock.h237
-rw-r--r--ydb/core/config/init/ut/ya.make3
-rw-r--r--ydb/core/config/init/ya.make3
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_server.cpp35
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_server.h2
-rw-r--r--ydb/core/driver_lib/cli_utils/cli_cmds_validate_config.cpp10
-rw-r--r--ydb/core/driver_lib/run/config.h141
-rw-r--r--ydb/core/driver_lib/run/kikimr_services_initializers.cpp20
-rw-r--r--ydb/core/driver_lib/run/kikimr_services_initializers.h5
-rw-r--r--ydb/core/driver_lib/run/service_mask.h126
-rw-r--r--ydb/core/protos/console_config.proto1
-rw-r--r--ydb/core/testlib/tenant_runtime.cpp2
-rw-r--r--ydb/core/testlib/test_client.cpp2
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);