Skip to content

Commit 95b0a00

Browse files
Evgenik2ydbot
authored andcommitted
Add overrides in state storage self heal (#26064)
1 parent a47e532 commit 95b0a00

12 files changed

+114
-32
lines changed

ydb/core/blobstorage/nodewarden/distconf.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,10 @@ namespace NKikimr::NStorage {
469469
bool GenerateStateStorageConfig(NKikimrConfig::TDomainsConfig::TStateStorage *ss
470470
, const NKikimrBlobStorage::TStorageConfig& baseConfig
471471
, std::unordered_set<ui32>& usedNodes
472-
, const NKikimrConfig::TDomainsConfig::TStateStorage& oldConfig = {});
472+
, const NKikimrConfig::TDomainsConfig::TStateStorage& oldConfig = {}
473+
, ui32 overrideReplicasInRingCount = 0
474+
, ui32 overrideRingsCount = 0
475+
);
473476

474477
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
475478
// Bridge ops

ydb/core/blobstorage/nodewarden/distconf_generate.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,10 @@ namespace NKikimr::NStorage {
583583

584584
bool TDistributedConfigKeeper::GenerateStateStorageConfig(NKikimrConfig::TDomainsConfig::TStateStorage *ss
585585
, const NKikimrBlobStorage::TStorageConfig& baseConfig, std::unordered_set<ui32>& usedNodes
586-
, const NKikimrConfig::TDomainsConfig::TStateStorage& oldConfig) {
586+
, const NKikimrConfig::TDomainsConfig::TStateStorage& oldConfig
587+
, ui32 overrideReplicasInRingCount
588+
, ui32 overrideRingsCount
589+
) {
587590
std::map<TBridgePileId, THashMap<TString, std::vector<std::tuple<ui32, TNodeLocation>>>> nodes;
588591
bool goodConfig = true;
589592
for (const auto& node : baseConfig.GetAllNodes()) {
@@ -592,7 +595,7 @@ namespace NKikimr::NStorage {
592595
nodes[pileId][location.GetDataCenterId()].emplace_back(node.GetNodeId(), location);
593596
}
594597
for (auto& [pileId, nodesByDataCenter] : nodes) {
595-
TStateStoragePerPileGenerator generator(nodesByDataCenter, SelfHealNodesState, pileId, usedNodes, oldConfig);
598+
TStateStoragePerPileGenerator generator(nodesByDataCenter, SelfHealNodesState, pileId, usedNodes, oldConfig, overrideReplicasInRingCount, overrideRingsCount);
596599
generator.AddRingGroup(ss);
597600
goodConfig &= generator.IsGoodConfig();
598601
}

ydb/core/blobstorage/nodewarden/distconf_invoke.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,12 +107,12 @@ namespace NKikimr::NStorage {
107107
void ReassignStateStorageNode(const TQuery::TReassignStateStorageNode& cmd);
108108
void ReconfigStateStorage(const NKikimrBlobStorage::TStateStorageConfig& cmd);
109109
void SelfHealStateStorage(const TQuery::TSelfHealStateStorage& cmd);
110-
void SelfHealStateStorage(ui32 waitForConfigStep, bool forceHeal, bool pileupReplicas);
110+
void SelfHealStateStorage(ui32 waitForConfigStep, bool forceHeal, bool pileupReplicas, ui32 overrideReplicasInRingCount, ui32 overrideRingsCount);
111111
void SelfHealNodesStateUpdate(const TQuery::TSelfHealNodesStateUpdate& cmd);
112112
void GetStateStorageConfig(const TQuery::TGetStateStorageConfig& cmd);
113113

114114
void GetCurrentStateStorageConfig(NKikimrBlobStorage::TStateStorageConfig* currentConfig, bool getNodesState);
115-
bool GetRecommendedStateStorageConfig(NKikimrBlobStorage::TStateStorageConfig* currentConfig, bool pileupReplicas);
115+
bool GetRecommendedStateStorageConfig(NKikimrBlobStorage::TStateStorageConfig* currentConfig, bool pileupReplicas, ui32 overrideReplicasInRingCount, ui32 overrideRingsCount);
116116
void AdjustRingGroupActorIdOffsetInRecommendedStateStorageConfig(NKikimrBlobStorage::TStateStorageConfig* currentConfig);
117117
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
118118
// Storage configuration YAML manipulation

ydb/core/blobstorage/nodewarden/distconf_invoke_state_storage.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ namespace NKikimr::NStorage {
99

1010
using TInvokeRequestHandlerActor = TDistributedConfigKeeper::TInvokeRequestHandlerActor;
1111

12-
bool TInvokeRequestHandlerActor::GetRecommendedStateStorageConfig(NKikimrBlobStorage::TStateStorageConfig* currentConfig, bool pileupReplicas) {
12+
bool TInvokeRequestHandlerActor::GetRecommendedStateStorageConfig(NKikimrBlobStorage::TStateStorageConfig* currentConfig, bool pileupReplicas, ui32 overrideReplicasInRingCount, ui32 overrideRingsCount) {
1313
const NKikimrBlobStorage::TStorageConfig& config = *Self->StorageConfig;
1414
bool result = true;
1515
std::unordered_set<ui32> usedNodes;
16-
result &= Self->GenerateStateStorageConfig(currentConfig->MutableStateStorageConfig(), config, usedNodes, config.GetStateStorageConfig());
16+
result &= Self->GenerateStateStorageConfig(currentConfig->MutableStateStorageConfig(), config, usedNodes, config.GetStateStorageConfig(), overrideReplicasInRingCount, overrideRingsCount);
1717
if (pileupReplicas) {
1818
usedNodes.clear();
1919
}
20-
result &= Self->GenerateStateStorageConfig(currentConfig->MutableStateStorageBoardConfig(), config, usedNodes, config.GetStateStorageBoardConfig());
20+
result &= Self->GenerateStateStorageConfig(currentConfig->MutableStateStorageBoardConfig(), config, usedNodes, config.GetStateStorageBoardConfig(), overrideReplicasInRingCount, overrideRingsCount);
2121
if (pileupReplicas) {
2222
usedNodes.clear();
2323
}
24-
result &= Self->GenerateStateStorageConfig(currentConfig->MutableSchemeBoardConfig(), config, usedNodes, config.GetSchemeBoardConfig());
24+
result &= Self->GenerateStateStorageConfig(currentConfig->MutableSchemeBoardConfig(), config, usedNodes, config.GetSchemeBoardConfig(), overrideReplicasInRingCount, overrideRingsCount);
2525
return result;
2626
}
2727

@@ -97,7 +97,7 @@ namespace NKikimr::NStorage {
9797
auto* currentConfig = record->MutableStateStorageConfig();
9898

9999
if (cmd.GetRecommended()) {
100-
GetRecommendedStateStorageConfig(currentConfig, cmd.GetPileupReplicas());
100+
GetRecommendedStateStorageConfig(currentConfig, cmd.GetPileupReplicas(), cmd.GetOverrideReplicasInRingCount(), cmd.GetOverrideRingsCount());
101101
AdjustRingGroupActorIdOffsetInRecommendedStateStorageConfig(currentConfig);
102102
} else {
103103
GetCurrentStateStorageConfig(currentConfig, cmd.GetNodesState());
@@ -112,19 +112,20 @@ namespace NKikimr::NStorage {
112112
Self->SelfHealNodesState[node.GetNodeId()] = node.GetState();
113113
}
114114
if (cmd.GetEnableSelfHealStateStorage()) {
115-
SelfHealStateStorage(cmd.GetWaitForConfigStep(), true, cmd.GetPileupReplicas());
115+
SelfHealStateStorage(cmd.GetWaitForConfigStep(), true, cmd.GetPileupReplicas(), cmd.GetOverrideReplicasInRingCount(), cmd.GetOverrideRingsCount());
116116
}
117117
}
118118

119119
void TInvokeRequestHandlerActor::SelfHealStateStorage(const TQuery::TSelfHealStateStorage& cmd) {
120-
SelfHealStateStorage(cmd.GetWaitForConfigStep(), cmd.GetForceHeal(), cmd.GetPileupReplicas());
120+
SelfHealStateStorage(cmd.GetWaitForConfigStep(), cmd.GetForceHeal(), cmd.GetPileupReplicas(), cmd.GetOverrideReplicasInRingCount(), cmd.GetOverrideRingsCount());
121121
}
122122

123-
void TInvokeRequestHandlerActor::SelfHealStateStorage(ui32 waitForConfigStep, bool forceHeal, bool pileupReplicas) {
123+
void TInvokeRequestHandlerActor::SelfHealStateStorage(ui32 waitForConfigStep, bool forceHeal, bool pileupReplicas, ui32 overrideReplicasInRingCount, ui32 overrideRingsCount) {
124124
RunCommonChecks();
125-
STLOG(PRI_DEBUG, BS_NODE, NW105, "TInvokeRequestHandlerActor::SelfHealStateStorage", (waitForConfigStep, waitForConfigStep), (forceHeal, forceHeal), (pileupReplicas, pileupReplicas));
125+
STLOG(PRI_DEBUG, BS_NODE, NW105, "TInvokeRequestHandlerActor::SelfHealStateStorage", (waitForConfigStep, waitForConfigStep),
126+
(forceHeal, forceHeal), (pileupReplicas, pileupReplicas), (overrideReplicasInRingCount, overrideReplicasInRingCount), (overrideRingsCount, overrideRingsCount));
126127
NKikimrBlobStorage::TStateStorageConfig targetConfig;
127-
if (!GetRecommendedStateStorageConfig(&targetConfig, pileupReplicas) && !forceHeal) {
128+
if (!GetRecommendedStateStorageConfig(&targetConfig, pileupReplicas, overrideReplicasInRingCount, overrideRingsCount) && !forceHeal) {
128129
throw TExError() << "Recommended configuration has faulty nodes and can not be applyed";
129130
}
130131

ydb/core/blobstorage/nodewarden/distconf_statestorage_config_generator.cpp

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,15 @@ namespace NKikimr::NStorage {
1515
, TBridgePileId pileId
1616
, std::unordered_set<ui32>& usedNodes
1717
, const NKikimrConfig::TDomainsConfig::TStateStorage& oldConfig
18+
, ui32 overrideReplicasInRingCount
19+
, ui32 overrideRingsCount
1820
)
1921
: PileId(pileId)
2022
, SelfHealNodesState(selfHealNodesState)
2123
, UsedNodes(usedNodes)
2224
, OldConfig(oldConfig)
25+
, OverrideReplicasInRingCount(overrideReplicasInRingCount)
26+
, OverrideRingsCount(overrideRingsCount)
2327
{
2428
FillNodeGroups(nodes);
2529
CalculateRingsParameters();
@@ -56,25 +60,29 @@ namespace NKikimr::NStorage {
5660
void TStateStoragePerPileGenerator::CalculateRingsParameters() {
5761
ui32 minNodesInGroup = NodeGroups[0].Nodes.size();
5862
if (NodeGroups.size() == 1) {
59-
if (minNodesInGroup < 5) {
60-
RingsInGroupCount = minNodesInGroup;
61-
NToSelect = minNodesInGroup < 3 ? 1 : 3;
62-
} else {
63+
RingsInGroupCount = OverrideRingsCount;
64+
if (RingsInGroupCount == 0)
6365
RingsInGroupCount = minNodesInGroup < 8 ? minNodesInGroup : 8;
64-
NToSelect = 5;
66+
if (RingsInGroupCount > minNodesInGroup) {
67+
RingsInGroupCount = minNodesInGroup;
6568
}
66-
ReplicasInRingCount = 1 + minNodesInGroup / 1000;
69+
NToSelect = RingsInGroupCount < 3 ? 1 : (RingsInGroupCount < 5 ? 3 : 5);
70+
ReplicasInRingCount = OverrideReplicasInRingCount > 0 ? OverrideReplicasInRingCount : (1 + minNodesInGroup / 1000);
6771
} else {
68-
RingsInGroupCount = minNodesInGroup < 3 ? 1 : 3;
72+
if (OverrideRingsCount == 3 || OverrideRingsCount == 9) {
73+
RingsInGroupCount = OverrideRingsCount / 3;
74+
} else {
75+
RingsInGroupCount = minNodesInGroup < 3 ? 1 : 3;
76+
}
6977
NToSelect = RingsInGroupCount < 3 ? 3 : 9;
7078
ui32 nodesCnt = 0;
7179
for (auto& n : NodeGroups) {
7280
nodesCnt += n.Nodes.size();
7381
}
74-
ReplicasInRingCount = 1 + nodesCnt / 1000;
75-
if (ReplicasInRingCount * RingsInGroupCount > minNodesInGroup) {
76-
ReplicasInRingCount = 1;
77-
}
82+
ReplicasInRingCount = OverrideReplicasInRingCount > 0 ? OverrideReplicasInRingCount : (1 + nodesCnt / 1000);
83+
}
84+
if (ReplicasInRingCount * RingsInGroupCount > minNodesInGroup) {
85+
ReplicasInRingCount = 1;
7886
}
7987
}
8088

ydb/core/blobstorage/nodewarden/distconf_statestorage_config_generator.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ namespace NKikimr::NStorage {
1212
const std::unordered_map<ui32, ui32>& selfHealNodesState,
1313
TBridgePileId pileId,
1414
std::unordered_set<ui32>& usedNodes,
15-
const NKikimrConfig::TDomainsConfig::TStateStorage& oldConfig);
15+
const NKikimrConfig::TDomainsConfig::TStateStorage& oldConfig,
16+
ui32 overrideReplicasInRingCount,
17+
ui32 overrideRingsCount
18+
);
1619
bool IsGoodConfig() const;
1720
void AddRingGroup(NKikimrConfig::TDomainsConfig::TStateStorage *ss);
1821

@@ -41,5 +44,7 @@ namespace NKikimr::NStorage {
4144
ui32 RingsInGroupCount = 1;
4245
ui32 ReplicasInRingCount = 1;
4346
ui32 NToSelect = 1;
47+
ui32 OverrideReplicasInRingCount = 0;
48+
ui32 OverrideRingsCount = 0;
4449
};
4550
}

ydb/core/blobstorage/nodewarden/distconf_ut.cpp

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,19 +23,29 @@ namespace NBlobStorageNodeWardenTest{
2323

2424
Y_UNIT_TEST_SUITE(TDistconfGenerateConfigTest) {
2525

26-
NKikimrConfig::TDomainsConfig::TStateStorage GenerateSimpleStateStorage(ui32 nodes, std::unordered_set<ui32> usedNodes = {}) {
26+
NKikimrConfig::TDomainsConfig::TStateStorage GenerateSimpleStateStorage(ui32 nodes, std::unordered_set<ui32> usedNodes = {}, ui32 overrideReplicasInRingCount = 0, ui32 overrideRingsCount = 0) {
2727
NKikimr::NStorage::TDistributedConfigKeeper keeper(nullptr, nullptr, true);
2828
NKikimrConfig::TDomainsConfig::TStateStorage ss;
2929
NKikimrBlobStorage::TStorageConfig config;
3030
for (ui32 i : xrange(nodes)) {
3131
auto *node = config.AddAllNodes();
3232
node->SetNodeId(i + 1);
3333
}
34-
keeper.GenerateStateStorageConfig(&ss, config, usedNodes);
34+
keeper.GenerateStateStorageConfig(&ss, config, usedNodes, {}, overrideReplicasInRingCount, overrideRingsCount);
3535
return ss;
3636
}
3737

38-
NKikimrConfig::TDomainsConfig::TStateStorage GenerateDCStateStorage(ui32 dcCnt, ui32 racksCnt, ui32 nodesInRack, std::unordered_map<ui32, ui32> nodesState = {}, std::unordered_set<ui32> usedNodes = {}, std::vector<ui32> oldConfig = {}, ui32 oldNToSelect = 9) {
38+
NKikimrConfig::TDomainsConfig::TStateStorage GenerateDCStateStorage(
39+
ui32 dcCnt
40+
, ui32 racksCnt
41+
, ui32 nodesInRack
42+
, std::unordered_map<ui32, ui32> nodesState = {}
43+
, std::unordered_set<ui32> usedNodes = {}
44+
, std::vector<ui32> oldConfig = {}
45+
, ui32 oldNToSelect = 9
46+
, ui32 overrideReplicasInRingCount = 0
47+
, ui32 overrideRingsCount = 0
48+
) {
3949
NKikimrBlobStorage::TStorageConfig config;
4050
ui32 nodeId = 1;
4151
NKikimr::NStorage::TDistributedConfigKeeper keeper(nullptr, nullptr, true);
@@ -63,7 +73,7 @@ Y_UNIT_TEST_SUITE(TDistconfGenerateConfigTest) {
6373
for (auto [nodeId, state] : nodesState) {
6474
keeper.SelfHealNodesState[nodeId] = state;
6575
}
66-
keeper.GenerateStateStorageConfig(&ss, config, usedNodes, oldSS);
76+
keeper.GenerateStateStorageConfig(&ss, config, usedNodes, oldSS, overrideReplicasInRingCount, overrideRingsCount);
6777
return ss;
6878
}
6979

@@ -173,6 +183,24 @@ Y_UNIT_TEST_SUITE(TDistconfGenerateConfigTest) {
173183
// DC disconnected - use previous config for this DC
174184
CheckStateStorage(GenerateDCStateStorage(3, 3, 3, { {10, 2}, {11, 4}, {13, 3}, {14, 4}, {15, 2} }, {}, {1, 5, 8, 10, 14, 17, 19, 22, 25}, 9), 9, {1, 4, 7, 10, 14, 17, 19, 22, 25});
175185
}
186+
187+
Y_UNIT_TEST(GenerateConfigReplicasDensity) {
188+
CheckStateStorage(GenerateSimpleStateStorage(100, {}, 0, 0), 5, {1, 2, 3, 4, 5, 6, 7, 8});
189+
CheckStateStorage(GenerateSimpleStateStorage(100, {}, 1, 1), 1, {1});
190+
CheckStateStorage2(GenerateSimpleStateStorage(100, {}, 3, 3),
191+
"{ RingGroups { NToSelect: 3 Ring { Node: 1 Node: 2 Node: 3 }"
192+
" Ring { Node: 4 Node: 5 Node: 6 } Ring { Node: 7 Node: 8 Node: 9 } } }");
193+
CheckStateStorage(GenerateSimpleStateStorage(100, {}, 20, 10), 5, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10});
194+
CheckStateStorage2(GenerateSimpleStateStorage(16, {}, 4, 2), "{ RingGroups { NToSelect: 1 Ring { Node: 1 Node: 2 Node: 3 Node: 4 } Ring { Node: 5 Node: 6 Node: 7 Node: 8 } } }");
195+
CheckStateStorage(GenerateDCStateStorage(3, 3, 3, {}, {}, {}, 9, 0, 0), 9, {1, 4, 7, 10, 13, 16, 19, 22, 25});
196+
CheckStateStorage(GenerateDCStateStorage(3, 3, 3, {}, {}, {}, 9, 1, 3), 3, {1, 10, 19});
197+
CheckStateStorage2(GenerateDCStateStorage(3, 3, 3, {}, {}, {}, 9, 2, 3), "{ RingGroups { NToSelect: 3 Ring { Node: 1 Node: 2 } Ring { Node: 10 Node: 11 } Ring { Node: 19 Node: 20 } } }");
198+
CheckStateStorage2(GenerateDCStateStorage(3, 3, 3, {}, {}, {}, 9, 3, 3), "{ RingGroups { NToSelect: 3 Ring { Node: 1 Node: 2 Node: 3 } Ring { Node: 10 Node: 11 Node: 12 } Ring { Node: 19 Node: 20 Node: 21 } } }");
199+
CheckStateStorage2(GenerateDCStateStorage(3, 3, 3, {}, {}, {}, 9, 2, 1),"{ RingGroups { NToSelect: 9 "
200+
"Ring { Node: 1 Node: 2 } Ring { Node: 4 Node: 5 } Ring { Node: 7 Node: 8 } "
201+
"Ring { Node: 10 Node: 11 } Ring { Node: 13 Node: 14 } Ring { Node: 16 Node: 17 } "
202+
"Ring { Node: 19 Node: 20 } Ring { Node: 22 Node: 23 } Ring { Node: 25 Node: 26 } } }");
203+
}
176204
}
177205
}
178206
}

ydb/core/cms/config.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ struct TCmsSentinelConfig {
2121
TDuration WaitForConfigStep;
2222
TDuration RelaxTime;
2323
bool PileupReplicas;
24+
ui32 OverrideReplicasInRingCount;
25+
ui32 OverrideRingsCount;
2426

2527
void Serialize(NKikimrCms::TCmsConfig::TSentinelConfig::TStateStorageSelfHealConfig &config) const {
2628
config.SetEnable(Enable);
@@ -30,6 +32,8 @@ struct TCmsSentinelConfig {
3032
config.SetWaitForConfigStep(WaitForConfigStep.GetValue());
3133
config.SetRelaxTime(RelaxTime.GetValue());
3234
config.SetPileupReplicas(PileupReplicas);
35+
config.SetOverrideReplicasInRingCount(OverrideReplicasInRingCount);
36+
config.SetOverrideRingsCount(OverrideRingsCount);
3337
}
3438

3539
void Deserialize(const NKikimrCms::TCmsConfig::TSentinelConfig::TStateStorageSelfHealConfig &config) {
@@ -40,6 +44,8 @@ struct TCmsSentinelConfig {
4044
WaitForConfigStep = TDuration::MicroSeconds(config.GetWaitForConfigStep());
4145
RelaxTime = TDuration::MicroSeconds(config.GetRelaxTime());
4246
PileupReplicas = config.GetPileupReplicas();
47+
OverrideReplicasInRingCount = config.GetOverrideReplicasInRingCount();
48+
OverrideRingsCount = config.GetOverrideRingsCount();
4349
}
4450
};
4551

ydb/core/cms/sentinel.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,8 @@ class TSentinel: public TActorBootstrapped<TSentinel> {
11511151
updateRequest->SetWaitForConfigStep(Config.StateStorageSelfHealConfig.WaitForConfigStep.GetValue() / 1000000); // milliseconds -> seconds
11521152
updateRequest->SetEnableSelfHealStateStorage(Config.StateStorageSelfHealConfig.Enable);
11531153
updateRequest->SetPileupReplicas(Config.StateStorageSelfHealConfig.PileupReplicas);
1154+
updateRequest->SetOverrideReplicasInRingCount(Config.StateStorageSelfHealConfig.OverrideReplicasInRingCount);
1155+
updateRequest->SetOverrideRingsCount(Config.StateStorageSelfHealConfig.OverrideRingsCount);
11541156
for (auto& [nodeId, node] : SentinelState->Nodes) {
11551157
SentinelState->NeedSelfHealStateStorage |= node.Compute();
11561158
auto* nodeState = updateRequest->AddNodesState();

ydb/core/protos/blobstorage_distributed_config.proto

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,12 +225,16 @@ message TEvNodeConfigInvokeOnRoot {
225225
optional bool Recommended = 1;
226226
optional bool PileupReplicas = 2;
227227
optional bool NodesState = 3;
228+
optional uint32 OverrideReplicasInRingCount = 4;
229+
optional uint32 OverrideRingsCount = 5;
228230
}
229231

230232
message TSelfHealStateStorage {
231233
optional uint32 WaitForConfigStep = 1;
232234
optional bool ForceHeal = 2;
233235
optional bool PileupReplicas = 3;
236+
optional uint32 OverrideReplicasInRingCount = 4;
237+
optional uint32 OverrideRingsCount = 5;
234238
}
235239

236240
message TSelfHealNodesStateUpdate {
@@ -242,6 +246,8 @@ message TEvNodeConfigInvokeOnRoot {
242246
optional uint32 WaitForConfigStep = 2;
243247
repeated TNodeState NodesState = 3;
244248
optional bool PileupReplicas = 4;
249+
optional uint32 OverrideReplicasInRingCount = 5;
250+
optional uint32 OverrideRingsCount = 6;
245251
}
246252

247253
message TAdvanceGeneration

0 commit comments

Comments
 (0)