Skip to content

Commit 30604fb

Browse files
UgnineSirdisalexv-smirnov
authored andcommitted
Apply patch between 24.1.18 and 24.1.18-stream-nb-1 tags - Nebius specific (#7170)
1 parent 6817342 commit 30604fb

11 files changed

+240
-13
lines changed

.github/CODEOWNERS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
* @ydb-platform/ReleaseApprovers
1+
* @ydb-platform/ReleaseApprovers @mvgorbunov @dcherednik @va-kuznecov

ydb/core/blobstorage/pdisk/blobstorage_pdisk_chunk_tracker.h

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

308308
SharedQuota->SetName("SharedQuota");
309-
TColorLimits chunkLimits = TColorLimits::MakeChunkLimits();
309+
TColorLimits chunkLimits = TColorLimits::MakeChunkLimits(params.ChunkBaseLimit);
310310
SharedQuota->ForceHardLimit(GlobalQuota->GetHardLimit(OwnerBeginUser), chunkLimits);
311311
OwnerQuota->Reset(GlobalQuota->GetHardLimit(OwnerBeginUser), chunkLimits);
312312
OwnerQuota->SetExpectedOwnerCount(params.ExpectedOwnerCount);

ydb/core/blobstorage/pdisk/blobstorage_pdisk_color_limits.h

Lines changed: 36 additions & 9 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 / 130.0 * 100;
59+
i64 yellow = cyan / 130.0 * 80;
60+
i64 lightOrange = cyan / 130.0 * 65;
61+
i64 preOrange = cyan / 130.0 * 50;
62+
i64 orange = cyan / 130.0 * 30;
63+
i64 red = cyan / 130.0 * 10;
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% free space
72+
{lightYellow, 1000, 7}, // LightYellow: Ask tablets to move to another group at 10% free space
73+
{cyan, 1000, 8}, // Cyan: 13% free space or less
6474
};
6575
}
6676

@@ -107,8 +117,25 @@ 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
113141
} // NKikimr
114-

ydb/core/blobstorage/pdisk/blobstorage_pdisk_config.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,9 @@ struct TPDiskConfig : public TThrRefBase {
132132

133133
ui64 ExpectedSlotCount = 0;
134134

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

137140
ui64 MinLogChunksTotal = 4ull; // for tiny disks
@@ -376,6 +379,10 @@ struct TPDiskConfig : public TThrRefBase {
376379
if (cfg->HasExpectedSlotCount()) {
377380
ExpectedSlotCount = cfg->GetExpectedSlotCount();
378381
}
382+
383+
if (cfg->HasChunkBaseLimit()) {
384+
ChunkBaseLimit = cfg->GetChunkBaseLimit();
385+
}
379386
}
380387
};
381388

ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,6 +1449,7 @@ void TPDisk::ProcessReadLogResult(const NPDisk::TEvReadLogResult &evReadLogResul
14491449
}
14501450
params.CommonLogSize = LogChunks.size();
14511451
params.SpaceColorBorder = Cfg->SpaceColorBorder;
1452+
params.ChunkBaseLimit = Cfg->ChunkBaseLimit;
14521453
for (ui32 ownerId = OwnerBeginUser; ownerId < OwnerEndUser; ++ownerId) {
14531454
if (OwnerData[ownerId].VDiskId != TVDiskID::InvalidId) {
14541455
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
@@ -40,6 +40,9 @@ struct TKeeperParams {
4040

4141
// Small disk
4242
bool SeparateCommonLog = true;
43+
44+
// Free chunk permille that triggers Cyan color (e.g. 100 is 10%). Between 130 (default) and 13.
45+
ui32 ChunkBaseLimit = 130;
4346
};
4447

4548
} // 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/mind/bscontroller/ut_bscontroller/main.cpp

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,6 +321,51 @@ Y_UNIT_TEST_SUITE(BsControllerConfig) {
321321
UNIT_ASSERT(env.ParsePDisks(response.GetStatus(baseConfigIndex).GetBaseConfig()) == env.ExpectedPDisks); });
322322
}
323323

324+
Y_UNIT_TEST(PDiskUpdate) {
325+
TEnvironmentSetup env(10, 1);
326+
RunTestWithReboots(env.TabletIds, [&] { return env.PrepareInitialEventsFilter(); }, [&](const TString& dispatchName, std::function<void(TTestActorRuntime&)> setup, bool& outActiveZone) {
327+
TFinalizer finalizer(env);
328+
env.Prepare(dispatchName, setup, outActiveZone);
329+
330+
{
331+
NKikimrBlobStorage::TConfigRequest request;
332+
env.DefineBox(1, "test box", {
333+
{"/dev/disk1", NKikimrBlobStorage::ROT, false, false, 0},
334+
}, env.GetNodes(), request);
335+
336+
size_t baseConfigIndex = request.CommandSize();
337+
request.AddCommand()->MutableQueryBaseConfig();
338+
339+
NKikimrBlobStorage::TConfigResponse response = env.Invoke(request);
340+
UNIT_ASSERT(response.GetSuccess());
341+
UNIT_ASSERT(env.ParsePDisks(response.GetStatus(baseConfigIndex).GetBaseConfig()) == env.ExpectedPDisks);
342+
}
343+
344+
{
345+
NKikimrBlobStorage::TConfigRequest request;
346+
347+
auto& hostcfg = *request.AddCommand()->MutableDefineHostConfig();
348+
hostcfg.SetHostConfigId(env.NextHostConfigId - 1);
349+
hostcfg.SetItemConfigGeneration(1);
350+
351+
auto& drive = *hostcfg.AddDrive();
352+
drive.SetPath("/dev/disk1");
353+
drive.SetType(NKikimrBlobStorage::ROT);
354+
drive.SetSharedWithOs(false);
355+
drive.SetReadCentric(false);
356+
drive.SetKind(0);
357+
drive.MutablePDiskConfig()->SetChunkBaseLimit(65);
358+
359+
size_t baseConfigIndex = request.CommandSize();
360+
request.AddCommand()->MutableQueryBaseConfig();
361+
362+
NKikimrBlobStorage::TConfigResponse response = env.Invoke(request);
363+
UNIT_ASSERT(response.GetSuccess());
364+
UNIT_ASSERT(env.ParsePDisks(response.GetStatus(baseConfigIndex).GetBaseConfig()) == env.ExpectedPDisks);
365+
}
366+
});
367+
}
368+
324369
Y_UNIT_TEST(ManyPDisksRestarts) {
325370
int nodes = 100;
326371
TEnvironmentSetup env(nodes, 1);

0 commit comments

Comments
 (0)