aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrobdrynkin <robdrynkin@yandex-team.com>2023-10-19 17:45:08 +0300
committerrobdrynkin <robdrynkin@yandex-team.com>2023-10-19 19:00:33 +0300
commitae2a0658c32a7e4b1e9686930b0f70b83c74ff82 (patch)
tree367333cce6e7bd1d97954e1bd38a90c789525afb
parentdaf7f8c2fc7abbc32673f9517f22d9714d79724c (diff)
downloadydb-ae2a0658c32a7e4b1e9686930b0f70b83c74ff82.tar.gz
KIKIMR-19736: Increase log chunks limit if start with no free chunks
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_chunk_tracker.h4
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_color_limits.h13
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp7
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h4
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp27
5 files changed, 48 insertions, 7 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_chunk_tracker.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_chunk_tracker.h
index bb2285422cb..5a21ae8ad81 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_chunk_tracker.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_chunk_tracker.h
@@ -244,10 +244,10 @@ public:
, OwnerQuota(new TPerOwnerQuotaTracker())
{}
- bool Reset(const TKeeperParams &params, TString &outErrorReason) {
+ bool Reset(const TKeeperParams &params, const TColorLimits &limits, TString &outErrorReason) {
Params = params;
- GlobalQuota->Reset(params.TotalChunks, TColorLimits::MakeLogLimits());
+ GlobalQuota->Reset(params.TotalChunks, limits);
i64 unappropriated = params.TotalChunks;
unappropriated += GlobalQuota->AddSystemOwner(OwnerSystemLog, params.SysLogSize, "SysLog");
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_color_limits.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_color_limits.h
index 52d26c6aff0..dd5131b0b00 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_color_limits.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_color_limits.h
@@ -75,6 +75,19 @@ struct TColorLimits {
};
}
+ static TColorLimits MakeExtendedLogLimits() {
+ return {
+ {150, 1000}, // Black: Stop early to leave some space for disaster recovery
+ {200, 1000}, // Red
+ {500, 1000}, // Orange
+ {600, 1000}, // PreOrange
+ {700, 1000}, // LightOrange
+ {900, 1000}, // Yellow
+ {930, 1000}, // LightYellow
+ {982, 1000}, // Cyan: Ask to cut log
+ };
+ }
+
double GetOccupancyForColor(NKikimrBlobStorage::TPDiskSpaceColor::E color, i64 total) {
switch (color) {
case NKikimrBlobStorage::TPDiskSpaceColor::GREEN: return Cyan.CalculateOccupancy(total);
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp
index 62acd7963da..52e7827f289 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp
@@ -1453,9 +1453,10 @@ void TPDisk::ProcessReadLogResult(const NPDisk::TEvReadLogResult &evReadLogResul
}
TString errorReason;
- bool isOk = Keeper.Reset(params, errorReason);
-
- if (!isOk) {
+ if (
+ !Keeper.Reset(params, TColorLimits::MakeLogLimits(), errorReason) &&
+ !Keeper.Reset(params, TColorLimits::MakeExtendedLogLimits(), errorReason)
+ ) {
*Mon.PDiskState = NKikimrBlobStorage::TPDiskState::ChunkQuotaError;
*Mon.PDiskBriefState = TPDiskMon::TPDisk::Error;
*Mon.PDiskDetailedState = TPDiskMon::TPDisk::ErrorCalculatingChunkQuotas;
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h
index d783679945c..34bec40d136 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_keeper.h
@@ -40,8 +40,8 @@ public:
// Initialization
//
- bool Reset(const TKeeperParams& params, TString &outErrorReason) {
- return ChunkTracker.Reset(params, outErrorReason);
+ bool Reset(const TKeeperParams& params, const TColorLimits &limits, TString &outErrorReason) {
+ return ChunkTracker.Reset(params, limits, outErrorReason);
}
void InitialPushFree(TChunkIdx chunkIdx) {
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
index 2d05aecad56..3730dc8cd44 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
@@ -983,5 +983,32 @@ Y_UNIT_TEST_SUITE(TPDiskTest) {
);
}
+ Y_UNIT_TEST(PDiskIncreaseLogChunksLimitAfterRestart) {
+ TActorTestContext testCtx({ false });
+
+ TVDiskMock vdisk(&testCtx);
+ vdisk.InitFull();
+ vdisk.SendEvLogSync();
+
+ TRcBuf buf(TString(1_MB, 'a'));
+ auto writeLog = [&]() {
+ testCtx.Send(new NPDisk::TEvLog(vdisk.PDiskParams->Owner, vdisk.PDiskParams->OwnerRound, 0,
+ buf, vdisk.GetLsnSeg(), nullptr));
+ const auto logRes = testCtx.Recv<NPDisk::TEvLogResult>();
+ return logRes->Status;
+ };
+
+ while (writeLog() == NKikimrProto::OK) {}
+ UNIT_ASSERT_VALUES_EQUAL(writeLog(), NKikimrProto::OUT_OF_SPACE);
+
+ testCtx.Send(new TEvBlobStorage::TEvRestartPDisk(testCtx.GetPDisk()->PDiskId, testCtx.MainKey, nullptr));
+ testCtx.Recv<TEvBlobStorage::TEvRestartPDiskResult>();
+
+ vdisk.InitFull();
+ vdisk.SendEvLogSync();
+
+ UNIT_ASSERT_VALUES_EQUAL(writeLog(), NKikimrProto::OK);
+ }
+
}
} // namespace NKikimr