diff options
author | serg-belyakov <[email protected]> | 2022-12-05 19:33:11 +0300 |
---|---|---|
committer | serg-belyakov <[email protected]> | 2022-12-05 19:33:11 +0300 |
commit | bbf7640e200dd461b284fba2366158567c642921 (patch) | |
tree | 9a48ad731b500c0cab221909b9793f29c43cb146 | |
parent | b8215ceed46ee2d1bdab63b3cee2925295a966e0 (diff) |
Format small disks with minimal chunk size,
Format small disks with smaller chunk size
9 files changed, 54 insertions, 12 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp index 3e35c8b6e95..2cddd788fa6 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp @@ -362,9 +362,15 @@ public: TPDiskConfig *cfg = actor->Cfg.Get(); try { - FormatPDisk(cfg->GetDevicePath(), 0, cfg->SectorSize, cfg->ChunkSize, + try { + FormatPDisk(cfg->GetDevicePath(), 0, cfg->SectorSize, cfg->ChunkSize, cfg->PDiskGuid, chunkKey, logKey, sysLogKey, actor->MainKey.back(), TString(), false, cfg->FeatureFlags.GetTrimEntireDeviceOnStartup(), cfg->SectorMap); + } catch (NPDisk::TPDiskFormatBigChunkException) { + FormatPDisk(cfg->GetDevicePath(), 0, cfg->SectorSize, NPDisk::SmallDiskMaximumChunkSize, + cfg->PDiskGuid, chunkKey, logKey, sysLogKey, actor->MainKey.back(), TString(), false, + cfg->FeatureFlags.GetTrimEntireDeviceOnStartup(), cfg->SectorMap); + } actorSystem->Send(pDiskActor, new TEvPDiskFormattingFinished(true, "")); } catch (yexception ex) { LOG_ERROR_S(*actorSystem, NKikimrServices::BS_PDISK, "Formatting error, what#" << ex.what()); diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_data.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_data.h index c80fd915cd9..12a2e8829b2 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_data.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_data.h @@ -35,6 +35,9 @@ constexpr ui32 DefaultSectorSize = 4 * (1 << 10); // 4 KiB constexpr ui32 ReplicationFactor = 3; constexpr ui32 RecordsInSysLog = 16; +constexpr ui64 FullSizeDiskMinimumSize = 800ull * (1 << 30); // 800GB, all disks smaller are considered "small" +constexpr ui32 SmallDiskMaximumChunkSize = 32 * (1 << 20); // 32MB + #define PDISK_FORMAT_VERSION 3 #define PDISK_DATA_VERSION 2 #define PDISK_DATA_VERSION_2 3 @@ -787,6 +790,9 @@ struct TCheckDiskFormatResult { {} }; +struct TPDiskFormatBigChunkException : public yexception { +}; + } // NPDisk } // NKikimr diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp index 34d062cce53..78ceee79eca 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp @@ -75,7 +75,15 @@ void FormatPDisk(TString path, ui64 diskSizeBytes, ui32 sectorSizeBytes, ui32 us ->DetectFileParameters(path, diskSizeBytes, isBlockDevice); } } - Y_VERIFY_S(diskSizeBytes > 0 && diskSizeBytes / userAccessibleChunkSizeBytes > 200, + if (diskSizeBytes > 0 && diskSizeBytes < NPDisk::FullSizeDiskMinimumSize && + userAccessibleChunkSizeBytes > NPDisk::SmallDiskMaximumChunkSize) { + throw NPDisk::TPDiskFormatBigChunkException() << "diskSizeBytes# " << diskSizeBytes << + " userAccessibleChunkSizeBytes# " << userAccessibleChunkSizeBytes << + " bool(sectorMap)# " << bool(sectorMap) << + " sectorMap->DeviceSize# " << (sectorMap ? sectorMap->DeviceSize : 0); + } + Y_VERIFY_S(diskSizeBytes < NPDisk::FullSizeDiskMinimumSize || (diskSizeBytes > 0 && + diskSizeBytes / userAccessibleChunkSizeBytes > 200), " diskSizeBytes# " << diskSizeBytes << " userAccessibleChunkSizeBytes# " << userAccessibleChunkSizeBytes << " bool(sectorMap)# " << bool(sectorMap) << diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp index 28e3e6057e5..302f09918dd 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp @@ -772,5 +772,16 @@ Y_UNIT_TEST_SUITE(TPDiskTest) { new NPDisk::TEvYardControl(NPDisk::TEvYardControl::PDiskStart, (void*)(&testCtx.MainKey)), NKikimrProto::CORRUPTED); } + + Y_UNIT_TEST(SmallDisk) { + for (ui64 diskSizeGb : {512, 200, 100, 80, 40, 20}) { + Cerr << "DiskSize " << diskSizeGb << "GB" << Endl; + ui64 diskSize = diskSizeGb << 30; + TActorTestContext testCtx({ + .IsBad = false, + .DiskSize = diskSize, + }); + } + } } } // namespace NKikimr diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_actions.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_actions.cpp index 672f45e7e79..2577225b9bd 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_actions.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_actions.cpp @@ -1800,7 +1800,7 @@ void TTestChunkPriorityBlock::TestFSM(const TActorContext &ctx) { Owner = LastResponse.Owner; OwnerRound = LastResponse.OwnerRound; SafeSize = ((ENABLE_VALGRIND_REQUESTS | IS_SLOW_MACHINE) ? (8 << 20) : - (128 << 20)) / LastResponse.AppendBlockSize * LastResponse.AppendBlockSize; + (32 << 20)) / LastResponse.AppendBlockSize * LastResponse.AppendBlockSize; ChunkWriteData = PrepareData(SafeSize); ctx.Send(Yard, new NPDisk::TEvChunkReserve(Owner, OwnerRound, 5)); break; diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h index f05e0da4f01..8789f804490 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h @@ -3,6 +3,7 @@ #include <ydb/core/blobstorage/pdisk/mock/pdisk_mock.h> #include "blobstorage_pdisk_ut.h" #include "blobstorage_pdisk_ut_defs.h" +#include "blobstorage_pdisk_data.h" #include "blobstorage_pdisk_abstract.h" #include "blobstorage_pdisk_impl.h" @@ -22,7 +23,7 @@ public: bool UsePDiskMock = false; ui64 DiskSize = 0; EDiskMode DiskMode = EDiskMode::DM_NONE; - ui32 ChunkSize = MIN_CHUNK_SIZE; + ui32 ChunkSize = 128 * (1 << 20); }; private: @@ -41,7 +42,11 @@ public: TString path; EntropyPool().Read(&TestCtx.PDiskGuid, sizeof(TestCtx.PDiskGuid)); ui64 formatGuid = TestCtx.PDiskGuid + static_cast<ui64>(isBad); - FormatPDiskForTest(path, formatGuid, Settings.ChunkSize, false, TestCtx.SectorMap); + if (Settings.DiskSize) { + FormatPDiskForTest(path, formatGuid, Settings.ChunkSize, Settings.DiskSize, false, TestCtx.SectorMap); + } else { + FormatPDiskForTest(path, formatGuid, Settings.ChunkSize, false, TestCtx.SectorMap); + } ui64 pDiskCategory = 0; TIntrusivePtr<TPDiskConfig> pDiskConfig = new TPDiskConfig(path, TestCtx.PDiskGuid, 1, pDiskCategory); diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.cpp index 8897b26d385..68dd70c70d6 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.cpp @@ -37,7 +37,7 @@ TString MakePDiskPath(const char *dir) { } } -void FormatPDiskForTest(TString path, ui64 guid, ui32 chunkSize, ui64 diskSize, bool isErasureEncodeUserLog, +void FormatPDiskForTest(TString path, ui64 guid, ui32& chunkSize, ui64 diskSize, bool isErasureEncodeUserLog, TIntrusivePtr<NPDisk::TSectorMap> sectorMap) { NPDisk::TKey chunkKey; NPDisk::TKey logKey; @@ -46,11 +46,17 @@ void FormatPDiskForTest(TString path, ui64 guid, ui32 chunkSize, ui64 diskSize, EntropyPool().Read(&logKey, sizeof(NKikimr::NPDisk::TKey)); EntropyPool().Read(&sysLogKey, sizeof(NKikimr::NPDisk::TKey)); - FormatPDisk(path, diskSize, 4 << 10, chunkSize, guid, chunkKey, logKey, sysLogKey, - NPDisk::YdbDefaultPDiskSequence, "Info", isErasureEncodeUserLog, false, sectorMap); + try { + FormatPDisk(path, diskSize, 4 << 10, chunkSize, guid, chunkKey, logKey, sysLogKey, + NPDisk::YdbDefaultPDiskSequence, "Info", isErasureEncodeUserLog, false, sectorMap); + } catch (NPDisk::TPDiskFormatBigChunkException) { + chunkSize = NPDisk::SmallDiskMaximumChunkSize; + FormatPDisk(path, diskSize, 4 << 10, chunkSize, guid, chunkKey, logKey, sysLogKey, + NPDisk::YdbDefaultPDiskSequence, "Info", isErasureEncodeUserLog, false, sectorMap); + } } -void FormatPDiskForTest(TString path, ui64 guid, ui32 chunkSize, bool isErasureEncodeUserLog, +void FormatPDiskForTest(TString path, ui64 guid, ui32& chunkSize, bool isErasureEncodeUserLog, TIntrusivePtr<NPDisk::TSectorMap> sectorMap) { ui64 diskSizeHeuristic = (ui64)chunkSize * 1000; FormatPDiskForTest(path, guid, chunkSize, diskSizeHeuristic, isErasureEncodeUserLog, sectorMap); diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.h index c5d606306c3..ba530cab62b 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.h +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.h @@ -13,9 +13,9 @@ TString PrepareData(ui32 size, ui32 flavor = 0); TString StatusToString(const NKikimrProto::EReplyStatus status); TString MakeDatabasePath(const char *dir); TString MakePDiskPath(const char *dir); -void FormatPDiskForTest(TString path, ui64 guid, ui32 chunkSize, ui64 diskSize, bool isErasureEncodeUserLog, +void FormatPDiskForTest(TString path, ui64 guid, ui32& chunkSize, ui64 diskSize, bool isErasureEncodeUserLog, TIntrusivePtr<NPDisk::TSectorMap> sectorMap); -void FormatPDiskForTest(TString path, ui64 guid, ui32 chunkSize, bool isErasureEncodeUserLog, +void FormatPDiskForTest(TString path, ui64 guid, ui32& chunkSize, bool isErasureEncodeUserLog, TIntrusivePtr<NPDisk::TSectorMap> sectorMap); void ReadPdiskFile(TTestContext *tc, ui32 dataSize, NPDisk::TAlignedData &outData); diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_sectormap.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_sectormap.cpp index 5e3e1dae094..232869c3824 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_sectormap.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_sectormap.cpp @@ -60,7 +60,7 @@ Y_UNIT_TEST_SUITE(TSectorMap) { using EDiskMode = NPDisk::NSectorMap::EDiskMode; auto test = [&](EDiskMode diskMode, ui32 diskSizeGb, ui32 dataSizeMb, bool toFirstSector, bool testRead, ui32 tries) { - if (!TestSectorMapPerformance(diskMode, diskSizeGb, dataSizeMb, toFirstSector, testRead, tries, 0.05, &time)) { + if (!TestSectorMapPerformance(diskMode, diskSizeGb, dataSizeMb, toFirstSector, testRead, tries, 0.1, &time)) { failedTests.push_back(TStringBuilder() << diskSizeGb << "GB " << NPDisk::NSectorMap::DiskModeToString(diskMode) << (testRead ? " read " : " write ") << dataSizeMb << " MB to" << (toFirstSector ? " first " : " last ") << "sector, timeExpected=" << time.first << ", timeAverage=" << time.second); |