summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorserg-belyakov <[email protected]>2022-12-05 19:33:11 +0300
committerserg-belyakov <[email protected]>2022-12-05 19:33:11 +0300
commitbbf7640e200dd461b284fba2366158567c642921 (patch)
tree9a48ad731b500c0cab221909b9793f29c43cb146
parentb8215ceed46ee2d1bdab63b3cee2925295a966e0 (diff)
Format small disks with minimal chunk size,
Format small disks with smaller chunk size
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_actor.cpp8
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_data.h6
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.cpp10
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp11
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_actions.cpp2
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_env.h9
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.cpp14
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_helpers.h4
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_sectormap.cpp2
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);