Skip to content

Commit aaca850

Browse files
authored
Fix NToSelect in state storage config auto generation in distconf 25-1-2 (#20390)
2 parents 294360f + eb2076d commit aaca850

File tree

3 files changed

+108
-4
lines changed

3 files changed

+108
-4
lines changed

ydb/core/blobstorage/nodewarden/distconf_generate.cpp

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,7 @@ namespace NKikimr::NStorage {
206206
pdiskInfo.Usable = false;
207207
pdiskInfo.WhyUnusable += 'S';
208208
}
209-
const bool usableInTermsOfDecommission =
209+
const bool usableInTermsOfDecommission =
210210
pdisk.GetDecommitStatus() == NKikimrBlobStorage::EDecommitStatus::DECOMMIT_NONE ||
211211
pdisk.GetDecommitStatus() == NKikimrBlobStorage::EDecommitStatus::DECOMMIT_REJECTED && !isSelfHealReasonDecommit;
212212
if (!usableInTermsOfDecommission) {
@@ -568,15 +568,29 @@ namespace NKikimr::NStorage {
568568

569569
const size_t maxNodesPerDataCenter = nodesByDataCenter.size() == 1 ? 8 : 3;
570570
for (auto& [_, v] : nodesByDataCenter) {
571-
auto r = pickNodes(v, Min<size_t>(v.size(), maxNodesPerDataCenter));
571+
size_t countToSelect = Min<size_t>(v.size(), maxNodesPerDataCenter);
572+
if (v.size() < maxNodesPerDataCenter && nodesByDataCenter.size() > 1) {
573+
countToSelect = 1;
574+
}
575+
auto r = pickNodes(v, countToSelect);
572576
nodes.insert(nodes.end(), r.begin(), r.end());
573577
}
574578

575579
for (ui32 nodeId : nodes) {
576580
ring->AddNode(nodeId);
577581
}
578-
579-
ring->SetNToSelect(nodes.size() / 2 + 1);
582+
ui32 nodesCnt = nodes.size();
583+
ui32 nToSelect = 1;
584+
if (nodesCnt <= 2) {
585+
nToSelect = 1;
586+
} else if (nodesCnt < 8) {
587+
nToSelect = 3;
588+
} else if (nodesCnt == 8) {
589+
nToSelect = 5;
590+
} else if (nodesCnt > 8) {
591+
nToSelect = 9;
592+
}
593+
ring->SetNToSelect(nToSelect);
580594
}
581595

582596
bool TDistributedConfigKeeper::UpdateConfig(NKikimrBlobStorage::TStorageConfig *config) {
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include <ydb/core/testlib/tablet_helpers.h>
2+
3+
#include <ydb/core/base/tablet_resolver.h>
4+
#include <ydb/core/base/statestorage_impl.h>
5+
#include <ydb/core/blobstorage/nodewarden/node_warden.h>
6+
#include <ydb/core/blobstorage/nodewarden/node_warden_impl.h>
7+
#include <ydb/core/blobstorage/base/blobstorage_events.h>
8+
#include <ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h>
9+
#include <ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_http_request.h>
10+
#include <ydb/core/mind/bscontroller/bsc.h>
11+
#include <ydb/core/util/actorsys_test/testactorsys.h>
12+
13+
#include <ydb/library/pdisk_io/sector_map.h>
14+
#include <ydb/core/util/random.h>
15+
16+
#include <google/protobuf/text_format.h>
17+
#include <library/cpp/testing/unittest/registar.h>
18+
19+
#include <ydb/core/blobstorage/nodewarden/distconf.h>
20+
21+
namespace NKikimr {
22+
namespace NBlobStorageNodeWardenTest{
23+
24+
Y_UNIT_TEST_SUITE(TDistconfGenerateConfigTest) {
25+
26+
NKikimrConfig::TDomainsConfig::TStateStorage GenerateSimpleStateStorage(ui32 nodes) {
27+
NKikimrConfig::TDomainsConfig::TStateStorage ss;
28+
NKikimrBlobStorage::TStorageConfig config;
29+
for (ui32 i : xrange(nodes)) {
30+
auto *node = config.AddAllNodes();
31+
node->SetNodeId(i + 1);
32+
}
33+
NKikimr::NStorage::TDistributedConfigKeeper keeper(nullptr, config, true);
34+
keeper.GenerateStateStorageConfig(&ss, config);
35+
return ss;
36+
}
37+
38+
NKikimrConfig::TDomainsConfig::TStateStorage GenerateDCStateStorage(ui32 dcCnt, ui32 racksCnt, ui32 nodesInRack) {
39+
NKikimrBlobStorage::TStorageConfig config;
40+
ui32 nodeId = 1;
41+
for (ui32 dc : xrange(dcCnt)) {
42+
for (ui32 rack : xrange(racksCnt)) {
43+
for (auto _ : xrange(nodesInRack)) {
44+
auto *node = config.AddAllNodes();
45+
node->SetNodeId(nodeId++);
46+
node->MutableLocation()->SetDataCenter("dc-" + std::to_string(dc));
47+
node->MutableLocation()->SetRack(std::to_string(rack));
48+
}
49+
}
50+
}
51+
NKikimrConfig::TDomainsConfig::TStateStorage ss;
52+
NKikimr::NStorage::TDistributedConfigKeeper keeper(nullptr, config, true);
53+
keeper.GenerateStateStorageConfig(&ss, config);
54+
return ss;
55+
}
56+
57+
void CheckStateStorage(const NKikimrConfig::TDomainsConfig::TStateStorage& ss, ui32 nToSelect, const std::unordered_set<ui32>& nodes) {
58+
auto &rg = ss.GetRing();
59+
Cerr << "Actual: " << ss << " Expected: NToSelect: " << nToSelect << Endl;
60+
UNIT_ASSERT_EQUAL(rg.GetNToSelect(), nToSelect);
61+
UNIT_ASSERT_EQUAL(rg.NodeSize(), nodes.size());
62+
std::unordered_set<ui32> usedNodes;
63+
for (ui32 i : xrange(nodes.size())) {
64+
auto n = rg.GetNode(i);
65+
UNIT_ASSERT(nodes.contains(n));
66+
UNIT_ASSERT(usedNodes.insert(n).second);
67+
}
68+
}
69+
70+
Y_UNIT_TEST(GenerateConfigSimpleCases) {
71+
CheckStateStorage(GenerateSimpleStateStorage(1), 1, {1});
72+
CheckStateStorage(GenerateSimpleStateStorage(2), 1, {1, 2});
73+
CheckStateStorage(GenerateSimpleStateStorage(3), 3, {1, 2, 3});
74+
CheckStateStorage(GenerateSimpleStateStorage(8), 5, {1, 2, 3, 4, 5, 6, 7, 8});
75+
CheckStateStorage(GenerateSimpleStateStorage(9), 5, {1, 2, 3, 4, 5, 6, 7, 8});
76+
CheckStateStorage(GenerateDCStateStorage(1, 1, 20), 5, {1, 2, 3, 4, 5, 6, 7, 8});
77+
CheckStateStorage(GenerateDCStateStorage(1, 10, 5), 5, {1, 6, 11, 16, 21, 26, 31, 36});
78+
}
79+
80+
Y_UNIT_TEST(GenerateConfig3DCCases) {
81+
CheckStateStorage(GenerateDCStateStorage(3, 1, 1), 3, {1, 2, 3});
82+
CheckStateStorage(GenerateDCStateStorage(3, 1, 2), 3, {1, 3, 5});
83+
CheckStateStorage(GenerateDCStateStorage(3, 1, 3), 9, {1, 2, 3, 4, 5, 6, 7, 8, 9});
84+
CheckStateStorage(GenerateDCStateStorage(3, 1, 18), 9, {1, 2, 3, 19, 20, 21, 37, 38, 39});
85+
CheckStateStorage(GenerateDCStateStorage(3, 3, 3), 9, {1, 4, 7, 10, 13, 16, 19, 22, 25});
86+
}
87+
}
88+
}
89+
}

ydb/core/blobstorage/nodewarden/ut/ya.make

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ PEERDIR(
1616
SRCS(
1717
blobstorage_node_warden_ut.cpp
1818
bind_queue_ut.cpp
19+
distconf_ut.cpp
1920
)
2021

2122
YQL_LAST_ABI_VERSION()

0 commit comments

Comments
 (0)