Skip to content

Commit d3dfd6a

Browse files
authored
[Configs] Add sensor showing that config will change after restart (#2863)
1 parent 5892c00 commit d3dfd6a

25 files changed

+803
-296
lines changed

ydb/core/cms/cms_ut_common.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -491,7 +491,7 @@ static void SetupServices(TTestActorRuntime &runtime, const TTestEnvOpts &option
491491
runtime.GetNodeId(0)),
492492
TActorSetupCmd(
493493
CreateConfigsDispatcher(
494-
NKikimr::NConsole::TConfigsDispatcherInitInfo {
494+
NKikimr::NConfig::TConfigsDispatcherInitInfo {
495495
.InitialConfig = appConfig,
496496
}),
497497
TMailboxType::Simple,

ydb/core/cms/console/config_item_info.h

-26
This file was deleted.

ydb/core/cms/console/configs_dispatcher.cpp

+150
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,16 @@
1010
#include <ydb/library/yaml_config/yaml_config.h>
1111
#include <ydb/core/mind/tenant_pool.h>
1212
#include <ydb/core/mon/mon.h>
13+
#include <ydb/core/config/init/mock.h>
14+
#include <ydb/core/base/counters.h>
1315

1416
#include <ydb/library/actors/core/actor_bootstrapped.h>
1517
#include <ydb/library/actors/core/interconnect.h>
1618
#include <ydb/library/actors/core/mon.h>
1719
#include <ydb/library/actors/interconnect/interconnect.h>
1820
#include <library/cpp/json/json_reader.h>
1921
#include <library/cpp/json/json_writer.h>
22+
#include <ydb/core/config/init/init.h>
2023

2124
#include <util/generic/bitmap.h>
2225
#include <util/generic/ptr.h>
@@ -35,6 +38,8 @@
3538

3639
namespace NKikimr::NConsole {
3740

41+
using namespace NConfig;
42+
3843
const THashSet<ui32> DYNAMIC_KINDS({
3944
(ui32)NKikimrConsole::TConfigItem::ActorSystemConfigItem,
4045
(ui32)NKikimrConsole::TConfigItem::BootstrapConfigItem,
@@ -161,6 +166,8 @@ class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
161166

162167
TDynBitMap FilterKinds(const TDynBitMap& in);
163168

169+
void UpdateCandidateStartupConfig(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev);
170+
164171
void Handle(NMon::TEvHttpInfo::TPtr &ev);
165172
void Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev);
166173
void Handle(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev);
@@ -232,7 +239,14 @@ class TConfigsDispatcher : public TActorBootstrapped<TConfigsDispatcher> {
232239
const std::variant<std::monostate, TDenyList, TAllowList> ItemsServeRules;
233240
const NKikimrConfig::TAppConfig BaseConfig;
234241
NKikimrConfig::TAppConfig CurrentConfig;
242+
NKikimrConfig::TAppConfig CandidateStartupConfig;
243+
bool StartupConfigProcessError = false;
244+
bool StartupConfigProcessDiff = false;
245+
TString StartupConfigInfo;
246+
::NMonitoring::TDynamicCounters::TCounterPtr StartupConfigChanged;
235247
const std::optional<TDebugInfo> DebugInfo;
248+
std::shared_ptr<NConfig::TRecordedInitialConfiguratorDeps> RecordedInitialConfiguratorDeps;
249+
std::vector<TString> Args;
236250
ui64 NextRequestCookie;
237251
TVector<TActorId> HttpRequests;
238252
TActorId CommonSubscriptionClient;
@@ -257,7 +271,10 @@ TConfigsDispatcher::TConfigsDispatcher(const TConfigsDispatcherInitInfo& initInf
257271
, ItemsServeRules(initInfo.ItemsServeRules)
258272
, BaseConfig(initInfo.InitialConfig)
259273
, CurrentConfig(initInfo.InitialConfig)
274+
, CandidateStartupConfig(initInfo.InitialConfig)
260275
, DebugInfo(initInfo.DebugInfo)
276+
, RecordedInitialConfiguratorDeps(std::move(initInfo.RecordedInitialConfiguratorDeps))
277+
, Args(initInfo.Args)
261278
, NextRequestCookie(Now().GetValue())
262279
{}
263280

@@ -270,6 +287,10 @@ void TConfigsDispatcher::Bootstrap()
270287
NMonitoring::TIndexMonPage *actorsMonPage = mon->RegisterIndexPage("actors", "Actors");
271288
mon->RegisterActorPage(actorsMonPage, "configs_dispatcher", "Configs Dispatcher", false, TlsActivationContext->ExecutorThread.ActorSystem, SelfId());
272289
}
290+
TIntrusivePtr<NMonitoring::TDynamicCounters> rootCounters = AppData()->Counters;
291+
TIntrusivePtr<NMonitoring::TDynamicCounters> authCounters = GetServiceCounters(rootCounters, "config");
292+
NMonitoring::TDynamicCounterPtr counters = authCounters->GetSubgroup("subsystem", "ConfigsDispatcher");
293+
StartupConfigChanged = counters->GetCounter("StartupConfigChanged", true);
273294

274295
auto commonClient = CreateConfigsSubscriber(
275296
SelfId(),
@@ -536,6 +557,33 @@ void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev)
536557
str << "<br />" << Endl;
537558
COLLAPSED_REF_CONTENT("debug-info", "Debug info") {
538559
DIV_CLASS("tab-left") {
560+
COLLAPSED_REF_CONTENT("args", "Startup process args") {
561+
PRE() {
562+
for (auto& arg : Args) {
563+
str << "\"" << arg << "\" ";
564+
}
565+
}
566+
}
567+
str << "<br />" << Endl;
568+
COLLAPSED_REF_CONTENT("candidate-startup-config", "Candidate startup config") {
569+
str << "<div class=\"alert alert-primary tab-left\" role=\"alert\">" << Endl;
570+
if (StartupConfigProcessError) {
571+
str << "<b>Error: </b>" << Endl;
572+
PRE() {
573+
str << StartupConfigInfo;
574+
}
575+
} else if (StartupConfigProcessDiff) {
576+
str << "<b>Configs are different: </b>" << Endl;
577+
PRE() {
578+
str << StartupConfigInfo;
579+
}
580+
} else {
581+
str << "<b>Configs are same.</b>" << Endl;
582+
}
583+
str << "</div>" << Endl;
584+
NHttp::OutputConfigHTML(str, CandidateStartupConfig);
585+
}
586+
str << "<br />" << Endl;
539587
COLLAPSED_REF_CONTENT("effective-config-debug-info", "Effective config debug info") {
540588
NHttp::OutputConfigDebugInfoHTML(
541589
str,
@@ -700,10 +748,112 @@ void TConfigsDispatcher::Handle(TEvInterconnect::TEvNodesInfo::TPtr &ev)
700748
HttpRequests.clear();
701749
}
702750

751+
class TConfigurationResult
752+
: public IConfigurationResult
753+
{
754+
public:
755+
// TODO make ref
756+
const NKikimrConfig::TAppConfig& GetConfig() const {
757+
return Config;
758+
}
759+
760+
bool HasYamlConfig() const {
761+
return !YamlConfig.empty();
762+
}
763+
764+
const TString& GetYamlConfig() const {
765+
return YamlConfig;
766+
}
767+
768+
TMap<ui64, TString> GetVolatileYamlConfigs() const {
769+
return VolatileYamlConfigs;
770+
}
771+
772+
NKikimrConfig::TAppConfig Config;
773+
TString YamlConfig;
774+
TMap<ui64, TString> VolatileYamlConfigs;
775+
};
776+
777+
void TConfigsDispatcher::UpdateCandidateStartupConfig(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev)
778+
try {
779+
if (!RecordedInitialConfiguratorDeps) {
780+
CandidateStartupConfig = {};
781+
StartupConfigProcessError = true;
782+
StartupConfigProcessDiff = false;
783+
StartupConfigInfo = "Startup params not recorded. Corresponding functionality won't work.";
784+
*StartupConfigChanged = 0;
785+
return;
786+
}
787+
788+
auto &rec = ev->Get()->Record;
789+
790+
auto dcClient = std::make_unique<TDynConfigClientMock>();
791+
auto configs = std::make_shared<TConfigurationResult>();
792+
dcClient->SavedResult = configs;
793+
configs->Config = rec.GetRawConsoleConfig();
794+
configs->YamlConfig = rec.GetYamlConfig();
795+
// TODO volatile
796+
RecordedInitialConfiguratorDeps->DynConfigClient = std::move(dcClient);
797+
auto deps = RecordedInitialConfiguratorDeps->GetDeps();
798+
NConfig::TInitialConfigurator initCfg(deps);
799+
800+
std::vector<const char*> argv;
801+
802+
for (const auto& arg : Args) {
803+
argv.push_back(arg.data());
804+
}
805+
806+
NLastGetopt::TOpts opts;
807+
initCfg.RegisterCliOptions(opts);
808+
deps.ProtoConfigFileProvider.RegisterCliOptions(opts);
809+
810+
NLastGetopt::TOptsParseResult parseResult(&opts, argv.size(), argv.data());
811+
812+
initCfg.ValidateOptions(opts, parseResult);
813+
initCfg.Parse(parseResult.GetFreeArgs());
814+
815+
NKikimrConfig::TAppConfig appConfig;
816+
ui32 nodeId;
817+
TKikimrScopeId scopeId;
818+
TString tenantName;
819+
TBasicKikimrServicesMask servicesMask;
820+
TString clusterName;
821+
NConfig::TConfigsDispatcherInitInfo configsDispatcherInitInfo;
822+
823+
initCfg.Apply(
824+
appConfig,
825+
nodeId,
826+
scopeId,
827+
tenantName,
828+
servicesMask,
829+
clusterName,
830+
configsDispatcherInitInfo);
831+
832+
CandidateStartupConfig = appConfig;
833+
StartupConfigProcessError = false;
834+
StartupConfigProcessDiff = false;
835+
StartupConfigInfo.clear();
836+
google::protobuf::util::MessageDifferencer md;
837+
auto fieldComparator = google::protobuf::util::DefaultFieldComparator();
838+
md.set_field_comparator(&fieldComparator);
839+
md.ReportDifferencesToString(&StartupConfigInfo);
840+
StartupConfigProcessDiff = !md.Compare(BaseConfig, CandidateStartupConfig);
841+
*StartupConfigChanged = StartupConfigProcessDiff ? 1 : 0;
842+
}
843+
catch (...) {
844+
CandidateStartupConfig = {};
845+
StartupConfigProcessError = true;
846+
StartupConfigProcessDiff = false;
847+
StartupConfigInfo = "Got exception while processing candidate config.";
848+
*StartupConfigChanged = 1;
849+
}
850+
703851
void TConfigsDispatcher::Handle(TEvConsole::TEvConfigSubscriptionNotification::TPtr &ev)
704852
{
705853
auto &rec = ev->Get()->Record;
706854

855+
UpdateCandidateStartupConfig(ev);
856+
707857
CurrentConfig = rec.GetConfig();
708858

709859
const auto& newYamlConfig = rec.GetYamlConfig();

ydb/core/cms/console/configs_dispatcher.h

+2-24
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "defs.h"
33

44
#include <ydb/core/protos/config.pb.h>
5-
#include <ydb/core/cms/console/config_item_info.h>
5+
#include <ydb/core/config/init/init.h>
66

77
#include <util/generic/vector.h>
88
#include <util/generic/map.h>
@@ -108,34 +108,12 @@ struct TEvConfigsDispatcher {
108108
};
109109
};
110110

111-
struct TDenyList {
112-
std::set<ui32> Items;
113-
};
114-
115-
struct TAllowList {
116-
std::set<ui32> Items;
117-
};
118-
119-
struct TDebugInfo {
120-
NKikimrConfig::TAppConfig StaticConfig;
121-
NKikimrConfig::TAppConfig OldDynConfig;
122-
NKikimrConfig::TAppConfig NewDynConfig;
123-
THashMap<ui32, TConfigItemInfo> InitInfo;
124-
};
125-
126-
struct TConfigsDispatcherInitInfo {
127-
NKikimrConfig::TAppConfig InitialConfig;
128-
TMap<TString, TString> Labels;
129-
std::variant<std::monostate, TDenyList, TAllowList> ItemsServeRules;
130-
std::optional<TDebugInfo> DebugInfo;
131-
};
132-
133111
/**
134112
* Initial config is used to initilize Configs Dispatcher. All received configs
135113
* are compared to the current one and notifications are not sent to local
136114
* subscribers if there is no config modification detected.
137115
*/
138-
IActor *CreateConfigsDispatcher(const TConfigsDispatcherInitInfo& initInfo);
116+
IActor *CreateConfigsDispatcher(const NConfig::TConfigsDispatcherInitInfo& initInfo);
139117

140118
inline TActorId MakeConfigsDispatcherID(ui32 node = 0) {
141119
char x[12] = { 'c', 'o', 'n', 'f', 'i', 'g', 's', 'd', 'i', 's', 'p' };

ydb/core/cms/console/console.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -358,10 +358,12 @@ struct TEvConsole {
358358
const NKikimrConfig::TAppConfig &config,
359359
const THashSet<ui32> &affectedKinds,
360360
const TString &yamlConfig = {},
361-
const TMap<ui64, TString> &volatileYamlConfigs = {})
361+
const TMap<ui64, TString> &volatileYamlConfigs = {},
362+
const NKikimrConfig::TAppConfig &rawConfig = {})
362363
{
363364
Record.SetGeneration(generation);
364365
Record.MutableConfig()->CopyFrom(config);
366+
Record.MutableRawConsoleConfig()->CopyFrom(rawConfig);
365367
for (ui32 kind : affectedKinds)
366368
Record.AddAffectedKinds(kind);
367369

ydb/core/cms/console/console_configs_subscriber.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -246,11 +246,16 @@ class TConfigsSubscriber : public TActorBootstrapped<TConfigsSubscriber> {
246246
auto *reflection = CurrentConfig.GetReflection();
247247
for (auto kind : rec.GetAffectedKinds()) {
248248
auto *field = desc1->FindFieldByNumber(kind);
249-
if (field && reflection->HasField(CurrentConfig, field))
249+
if (field && reflection->HasField(CurrentConfig, field)) {
250250
reflection->ClearField(&CurrentConfig, field);
251+
}
252+
if (field && reflection->HasField(CurrentDynConfig, field)) {
253+
reflection->ClearField(&CurrentDynConfig, field);
254+
}
251255
}
252256

253257
CurrentConfig.MergeFrom(rec.GetConfig());
258+
CurrentDynConfig.MergeFrom(rec.GetConfig());
254259
if (newVersion.GetItems().empty())
255260
CurrentConfig.ClearVersion();
256261
else
@@ -259,7 +264,13 @@ class TConfigsSubscriber : public TActorBootstrapped<TConfigsSubscriber> {
259264
notChanged &= changes.empty();
260265

261266
if (!notChanged || !FirstUpdateSent) {
262-
Send(OwnerId, new TEvConsole::TEvConfigSubscriptionNotification(Generation, CurrentConfig, changes, YamlConfig, VolatileYamlConfigs),
267+
Send(OwnerId, new TEvConsole::TEvConfigSubscriptionNotification(
268+
Generation,
269+
CurrentConfig,
270+
changes,
271+
YamlConfig,
272+
VolatileYamlConfigs,
273+
CurrentDynConfig),
263274
IEventHandle::FlagTrackDelivery, Cookie);
264275

265276
FirstUpdateSent = true;
@@ -383,6 +394,7 @@ class TConfigsSubscriber : public TActorBootstrapped<TConfigsSubscriber> {
383394
ui64 LastOrder;
384395

385396
NKikimrConfig::TAppConfig CurrentConfig;
397+
NKikimrConfig::TAppConfig CurrentDynConfig;
386398

387399
bool ServeYaml = false;
388400
ui64 Version;

ydb/core/cms/console/http.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include "defs.h"
33

44
#include <ydb/core/protos/config.pb.h>
5-
#include <ydb/core/cms/console/config_item_info.h>
5+
#include <ydb/core/config/init/init.h>
66

77
#include <library/cpp/monlib/service/pages/templates.h>
88

@@ -13,6 +13,8 @@
1313

1414
namespace NKikimr::NConsole::NHttp {
1515

16+
using namespace NConfig;
17+
1618
struct TCollapsedRef {
1719
template <class... TClasses>
1820
TCollapsedRef(IOutputStream& str, const TString& target, const TString& text, TClasses... classes)

ydb/core/cms/console/ya.make

+3-2
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,6 @@ SRCS(
7373
util.h
7474
)
7575

76-
GENERATE_ENUM_SERIALIZATION(config_item_info.h)
77-
7876
PEERDIR(
7977
ydb/library/actors/core
8078
ydb/library/actors/http
@@ -84,6 +82,7 @@ PEERDIR(
8482
ydb/core/blobstorage/base
8583
ydb/core/blobstorage/groupinfo
8684
ydb/core/cms/console/validators
85+
ydb/core/config/init
8786
ydb/core/control
8887
ydb/core/engine/minikql
8988
ydb/core/mind
@@ -98,6 +97,8 @@ PEERDIR(
9897
ydb/public/lib/operation_id
9998
)
10099

100+
YQL_LAST_ABI_VERSION()
101+
101102
END()
102103

103104
RECURSE(

0 commit comments

Comments
 (0)