Skip to content

Commit 1b2baab

Browse files
authored
Configurable PDisk chunk color limits (#2409)
1 parent bccfc7b commit 1b2baab

9 files changed

+197
-10
lines changed

ydb/core/blobstorage/pdisk/blobstorage_pdisk_chunk_tracker.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ using TColor = NKikimrBlobStorage::TPDiskSpaceColor;
303303
}
304304

305305
SharedQuota->SetName("SharedQuota");
306-
TColorLimits chunkLimits = TColorLimits::MakeChunkLimits();
306+
TColorLimits chunkLimits = TColorLimits::MakeChunkLimits(params.ChunkBaseLimit);
307307
SharedQuota->ForceHardLimit(GlobalQuota->GetHardLimit(OwnerBeginUser), chunkLimits);
308308
OwnerQuota->Reset(GlobalQuota->GetHardLimit(OwnerBeginUser), chunkLimits);
309309
OwnerQuota->SetExpectedOwnerCount(params.ExpectedOwnerCount);

ydb/core/blobstorage/pdisk/blobstorage_pdisk_color_limits.h

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -51,16 +51,26 @@ struct TColorLimits {
5151
str << " Cyan = Total * " << Cyan.ToString() << "\n";
5252
}
5353

54-
static TColorLimits MakeChunkLimits() {
54+
static TColorLimits MakeChunkLimits(i64 cyan) {
55+
cyan = Min<i64>(130, cyan);
56+
cyan = Max<i64>(13, cyan);
57+
58+
i64 lightYellow = cyan * 100 / 130;
59+
i64 yellow = cyan * 80 / 130;
60+
i64 lightOrange = cyan * 65 / 130;
61+
i64 preOrange = cyan * 50 / 130;
62+
i64 orange = cyan * 30 / 130;
63+
i64 red = cyan * 10 / 130;
64+
5565
return {
5666
{1, 1000, 2}, // Black: Leave bare minimum for disaster recovery
57-
{10, 1000, 3}, // Red
58-
{30, 1000, 4}, // Orange
59-
{50, 1000, 4}, // PreOrange
60-
{65, 1000, 5}, // LightOrange
61-
{80, 1000, 6}, // Yellow: Stop serving user writes at 8% free space
62-
{100, 1000, 7}, // LightYellow: Ask tablets to move to another group at 10% free space
63-
{130, 1000, 8}, // Cyan: 13% free space or less
67+
{red, 1000, 3}, // Red
68+
{orange, 1000, 4}, // Orange
69+
{preOrange, 1000, 4}, // PreOrange
70+
{lightOrange, 1000, 5}, // LightOrange
71+
{yellow, 1000, 6}, // Yellow: Stop serving user writes at 8% (by default) free space
72+
{lightYellow, 1000, 7}, // LightYellow: Ask tablets to move to another group at 10% (by default) free space
73+
{cyan, 1000, 8}, // Cyan: 13% (by default) free space or less
6474
};
6575
}
6676

@@ -107,6 +117,24 @@ struct TColorLimits {
107117
Y_ABORT();
108118
}
109119
}
120+
121+
i64 GetQuotaForColor(NKikimrBlobStorage::TPDiskSpaceColor::E color, i64 total) {
122+
switch (color) {
123+
case NKikimrBlobStorage::TPDiskSpaceColor::CYAN: return Cyan.CalculateQuota(total);
124+
case NKikimrBlobStorage::TPDiskSpaceColor::LIGHT_YELLOW: return LightYellow.CalculateQuota(total);
125+
case NKikimrBlobStorage::TPDiskSpaceColor::YELLOW: return Yellow.CalculateQuota(total);
126+
case NKikimrBlobStorage::TPDiskSpaceColor::LIGHT_ORANGE: return LightOrange.CalculateQuota(total);
127+
case NKikimrBlobStorage::TPDiskSpaceColor::PRE_ORANGE: return PreOrange.CalculateQuota(total);
128+
case NKikimrBlobStorage::TPDiskSpaceColor::ORANGE: return Orange.CalculateQuota(total);
129+
case NKikimrBlobStorage::TPDiskSpaceColor::RED: return Red.CalculateQuota(total);
130+
case NKikimrBlobStorage::TPDiskSpaceColor::BLACK: return Black.CalculateQuota(total);
131+
132+
case NKikimrBlobStorage::TPDiskSpaceColor_E_TPDiskSpaceColor_E_INT_MIN_SENTINEL_DO_NOT_USE_:
133+
case NKikimrBlobStorage::TPDiskSpaceColor_E_TPDiskSpaceColor_E_INT_MAX_SENTINEL_DO_NOT_USE_:
134+
default:
135+
Y_ABORT();
136+
}
137+
}
110138
};
111139

112140
} // NPDisk

ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,9 @@ struct TPDiskConfig : public TThrRefBase {
130130

131131
ui64 ExpectedSlotCount = 0;
132132

133+
// Free chunk permille that triggers Cyan color (e.g. 100 is 10%). Between 130 (default) and 13.
134+
ui32 ChunkBaseLimit = 130;
135+
133136
NKikimrConfig::TFeatureFlags FeatureFlags;
134137

135138
TControlWrapper MaxCommonLogChunks = 200;
@@ -378,6 +381,13 @@ struct TPDiskConfig : public TThrRefBase {
378381
if (cfg->HasExpectedSlotCount()) {
379382
ExpectedSlotCount = cfg->GetExpectedSlotCount();
380383
}
384+
385+
if (cfg->HasChunkBaseLimit()) {
386+
ui32 limit = cfg->GetChunkBaseLimit();
387+
limit = Min<ui32>(130, limit);
388+
limit = Max<ui32>(13, limit);
389+
ChunkBaseLimit = limit;
390+
}
381391
}
382392
};
383393

ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,7 @@ void TPDisk::ProcessReadLogResult(const NPDisk::TEvReadLogResult &evReadLogResul
14601460
params.CommonLogSize = LogChunks.size();
14611461
params.MaxCommonLogChunks = Cfg->MaxCommonLogChunks;
14621462
params.SpaceColorBorder = Cfg->SpaceColorBorder;
1463+
params.ChunkBaseLimit = Cfg->ChunkBaseLimit;
14631464
for (ui32 ownerId = OwnerBeginUser; ownerId < OwnerEndUser; ++ownerId) {
14641465
if (OwnerData[ownerId].VDiskId != TVDiskID::InvalidId) {
14651466
params.OwnersInfo[ownerId] = {usedForOwner[ownerId], OwnerData[ownerId].VDiskId};

ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper_params.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ struct TKeeperParams {
4242

4343
// Small disk
4444
bool SeparateCommonLog = true;
45+
46+
// Free chunk permille that triggers Cyan color (e.g. 100 is 10%). Between 130 (default) and 13.
47+
ui32 ChunkBaseLimit = 130;
4548
};
4649

4750
} // NPDisk

ydb/core/blobstorage/pdisk/blobstorage_pdisk_quota_record.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ class TQuotaRecord {
7878
#undef PRINT_DISK_SPACE_COLOR
7979
}
8080

81-
// Called only from the main trhead
81+
// Called only from the main thread
8282
// Returns number of chunks released (negative for chunks acquired)
8383
i64 ForceHardLimit(i64 hardLimit, const TColorLimits &limits) {
8484
i64 oldHardLimit = AtomicGet(HardLimit);
Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
#include "blobstorage_pdisk_abstract.h"
2+
#include "blobstorage_pdisk_impl.h"
3+
4+
#include "blobstorage_pdisk_ut.h"
5+
#include "blobstorage_pdisk_ut_actions.h"
6+
#include "blobstorage_pdisk_ut_helpers.h"
7+
#include "blobstorage_pdisk_ut_run.h"
8+
#include "blobstorage_pdisk_color_limits.h"
9+
10+
#include <ydb/core/blobstorage/crypto/default.h>
11+
12+
#include <ydb/core/testlib/actors/test_runtime.h>
13+
14+
namespace NKikimr {
15+
16+
Y_UNIT_TEST_SUITE(TColorLimitsTest) {
17+
// Define color codes
18+
enum class TDiskColor {
19+
Black,
20+
Red,
21+
Orange,
22+
PreOrange,
23+
LightOrange,
24+
Yellow,
25+
LightYellow,
26+
Cyan,
27+
Default
28+
};
29+
30+
// Function to set text color based on TDiskColor enum
31+
void SetColor(NKikimrBlobStorage::TPDiskSpaceColor_E color) {
32+
switch (color) {
33+
case NKikimrBlobStorage::TPDiskSpaceColor::BLACK:
34+
Cout << "\033[30m"; // Black
35+
break;
36+
case NKikimrBlobStorage::TPDiskSpaceColor::RED:
37+
Cout << "\033[31m"; // Red
38+
break;
39+
case NKikimrBlobStorage::TPDiskSpaceColor::GREEN:
40+
Cout << "\033[32m"; // Green
41+
break;
42+
case NKikimrBlobStorage::TPDiskSpaceColor::ORANGE:
43+
Cout << "\033[33m"; // Orange
44+
break;
45+
case NKikimrBlobStorage::TPDiskSpaceColor::PRE_ORANGE:
46+
Cout << "\033[38;5;208m"; // PreOrange (closest approximation)
47+
break;
48+
case NKikimrBlobStorage::TPDiskSpaceColor::LIGHT_ORANGE:
49+
Cout << "\033[38;5;215m"; // LightOrange (closest approximation)
50+
break;
51+
case NKikimrBlobStorage::TPDiskSpaceColor::YELLOW:
52+
Cout << "\033[93m"; // Yellow
53+
break;
54+
case NKikimrBlobStorage::TPDiskSpaceColor::LIGHT_YELLOW:
55+
Cout << "\033[38;5;229m"; // LightYellow (closest approximation)
56+
break;
57+
case NKikimrBlobStorage::TPDiskSpaceColor::CYAN:
58+
Cout << "\033[36m"; // Cyan
59+
break;
60+
default:
61+
// Default color (reset)
62+
break;
63+
}
64+
}
65+
66+
void ClearColor() {
67+
Cout << "\033[0m";
68+
}
69+
70+
Y_UNIT_TEST(Colors) {
71+
NKikimrBlobStorage::TPDiskSpaceColor_E colors[] = {
72+
NKikimrBlobStorage::TPDiskSpaceColor::BLACK,
73+
NKikimrBlobStorage::TPDiskSpaceColor::RED,
74+
NKikimrBlobStorage::TPDiskSpaceColor::ORANGE,
75+
NKikimrBlobStorage::TPDiskSpaceColor::PRE_ORANGE,
76+
NKikimrBlobStorage::TPDiskSpaceColor::LIGHT_ORANGE,
77+
NKikimrBlobStorage::TPDiskSpaceColor::YELLOW,
78+
NKikimrBlobStorage::TPDiskSpaceColor::LIGHT_YELLOW,
79+
NKikimrBlobStorage::TPDiskSpaceColor::CYAN
80+
};
81+
82+
auto printLimitsFn = [&colors](int percent) {
83+
NPDisk::TColorLimits limits = NPDisk::TColorLimits::MakeChunkLimits(percent);
84+
85+
Cout << "Print for " << (percent / 10.0) << "%" << Endl;
86+
87+
i64 chunks = 1000;
88+
89+
i64 cur = 0;
90+
i64 all = 0;
91+
92+
std::map<NKikimrBlobStorage::TPDiskSpaceColor_E, i64> sizeByColor;
93+
94+
for (auto color : colors) {
95+
i64 curChunks = limits.GetQuotaForColor(color, chunks);
96+
97+
SetColor(color);
98+
99+
i64 sz = curChunks - all;
100+
101+
sizeByColor[color] = sz;
102+
103+
for (i64 i = 0; i < sz; i++) {
104+
Cout << "#";
105+
106+
if ((++cur % 100) == 0) {
107+
cur = 0;
108+
Cout << Endl;
109+
}
110+
}
111+
112+
all = curChunks;
113+
}
114+
115+
SetColor(NKikimrBlobStorage::TPDiskSpaceColor::GREEN);
116+
for (i64 i = 0; i < (chunks - all); i++) {
117+
Cout << "#";
118+
119+
if ((++cur % 100) == 0) {
120+
cur = 0;
121+
Cout << Endl;
122+
}
123+
}
124+
125+
ClearColor();
126+
127+
Cout << Endl;
128+
129+
for (auto color : colors) {
130+
Cout << color << ": " << sizeByColor[color] << Endl;
131+
}
132+
133+
Cout << Endl;
134+
};
135+
136+
printLimitsFn(130);
137+
printLimitsFn(100);
138+
printLimitsFn(65);
139+
printLimitsFn(13);
140+
}
141+
}
142+
} // namespace NKikimr

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ SRCS(
3636
blobstorage_pdisk_ut_run.cpp
3737
blobstorage_pdisk_ut_sectormap.cpp
3838
blobstorage_pdisk_restore_ut.cpp
39+
blobstorage_pdisk_ut_color_limits.cpp
3940
mock/pdisk_mock.cpp
4041
)
4142

ydb/core/protos/blobstorage_pdisk_config.proto

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,7 @@ message TPDiskConfig {
8989
optional uint64 InsaneLogChunksMultiplier = 2000; // Log of cutThreshold * InsaneLogChunksMultiplier is insane
9090

9191
optional uint64 ExpectedSlotCount = 2001; // Number of slots to calculate per-vdisk disk space limit.
92+
93+
optional uint32 ChunkBaseLimit = 2002; // Free chunk permille that triggers Cyan color (e.g. 100 is 10%). Between 130 (default) and 13.
9294
};
9395

0 commit comments

Comments
 (0)