diff options
author | robdrynkin <robdrynkin@yandex-team.com> | 2023-10-19 17:45:08 +0300 |
---|---|---|
committer | robdrynkin <robdrynkin@yandex-team.com> | 2023-10-19 19:00:33 +0300 |
commit | ae2a0658c32a7e4b1e9686930b0f70b83c74ff82 (patch) | |
tree | 367333cce6e7bd1d97954e1bd38a90c789525afb | |
parent | daf7f8c2fc7abbc32673f9517f22d9714d79724c (diff) | |
download | ydb-ae2a0658c32a7e4b1e9686930b0f70b83c74ff82.tar.gz |
KIKIMR-19736: Increase log chunks limit if start with no free chunks
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 ¶ms, TString &outErrorReason) { + bool Reset(const TKeeperParams ¶ms, 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 |