Skip to content

Commit 5a9b265

Browse files
authored
Merge 8dea906 into a8d35a6
2 parents a8d35a6 + 8dea906 commit 5a9b265

File tree

2 files changed

+55
-44
lines changed

2 files changed

+55
-44
lines changed

.github/config/muted_ya.txt

-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ ydb/core/blobstorage/dsproxy/ut TBlobStorageProxySequenceTest.TestBlock42PutWith
22
ydb/core/blobstorage/dsproxy/ut_fat TBlobStorageProxyTest.TestBatchedPutRequestDoesNotContainAHugeBlob
33
ydb/core/blobstorage/pdisk/ut TSectorMap.*
44
ydb/core/blobstorage/ut_blobstorage/ut_read_only_vdisk ReadOnlyVDisk.TestStorageLoad
5-
ydb/core/blobstorage/ut_blobstorage CostMetricsGetBlock4Plus2.TestGet4Plus2BlockRequests10000Inflight1BlobSize1000
65
ydb/core/blobstorage/ut_blobstorage Defragmentation.DoesItWork
76
ydb/core/blobstorage/ut_blobstorage SpaceCheckForDiskReassign.*
87
ydb/core/blobstorage/ut_blobstorage ScrubFast.SingleBlob

ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_sectormap.cpp

+55-43
Original file line numberDiff line numberDiff line change
@@ -11,34 +11,52 @@
1111

1212
namespace NKikimr {
1313

14-
Y_UNIT_TEST_SUITE(TSectorMap) {
14+
Y_UNIT_TEST_SUITE(TSectorMapPerformance) {
1515

16-
bool TestSectorMapPerformance(NPDisk::NSectorMap::EDiskMode diskMode, ui64 diskSizeGb, ui64 dataSizeMb, bool toFirstSector,
17-
bool testRead, ui32 tries, double deviationRange = 0.05, std::pair<double, double>* time = nullptr) {
16+
enum class ESectorPosition : ui8 {
17+
SectorFirst = 0,
18+
SectorLast,
19+
};
20+
21+
enum class EOperationType : ui8 {
22+
OperationRead = 0,
23+
OperationWrite,
24+
};
25+
26+
using EDiskMode = NPDisk::NSectorMap::EDiskMode;
27+
28+
bool TestSectorMapPerformance(EDiskMode diskMode, ui64 diskSizeGb, ui64 dataSizeMb, ESectorPosition sectorPosition,
29+
EOperationType operationType, ui32 tries, double deviationRange = 0.05, std::pair<double, double>* time = nullptr) {
1830
static TString data = PrepareData(1024 * 1024 * 1024);
1931
ui64 dataSize = dataSizeMb * 1024 * 1024;
2032
ui64 deviceSize = diskSizeGb * 1024 * 1024 * 1024;
2133

2234
auto deviceType = NPDisk::NSectorMap::DiskModeToDeviceType(diskMode);
2335
ui64 diskRate;
24-
if (testRead) {
25-
diskRate = toFirstSector ? NPDisk::DevicePerformance.at(deviceType).FirstSectorReadBytesPerSec :
26-
NPDisk::DevicePerformance.at(deviceType).LastSectorReadBytesPerSec;
36+
const auto& performanceParams = NPDisk::DevicePerformance.at(deviceType);
37+
if (operationType == EOperationType::OperationRead) {
38+
diskRate = (sectorPosition == ESectorPosition::SectorFirst)
39+
? performanceParams.FirstSectorReadBytesPerSec
40+
: performanceParams.LastSectorReadBytesPerSec;
2741
} else {
28-
diskRate = toFirstSector ? NPDisk::DevicePerformance.at(deviceType).FirstSectorWriteBytesPerSec :
29-
NPDisk::DevicePerformance.at(deviceType).LastSectorWriteBytesPerSec;
42+
diskRate = (sectorPosition == ESectorPosition::SectorFirst)
43+
? performanceParams.FirstSectorWriteBytesPerSec
44+
: performanceParams.LastSectorWriteBytesPerSec;
3045
}
3146

3247
ui64 sectorsNum = deviceSize / NPDisk::NSectorMap::SECTOR_SIZE;
33-
ui64 sectorPos = toFirstSector ? 0 : sectorsNum - dataSize / NPDisk::NSectorMap::SECTOR_SIZE - 2;
34-
double timeExpected = (double)dataSize / diskRate;
48+
ui64 sectorPos = (sectorPosition == ESectorPosition::SectorFirst)
49+
? 0
50+
: sectorsNum - dataSize / NPDisk::NSectorMap::SECTOR_SIZE - 2;
51+
52+
double timeExpected = (double)dataSize / diskRate + 1e-9 * performanceParams.SeekTimeNs;
3553
double timeSum = 0;
3654
for (ui32 i = 0; i < tries; ++i) {
3755
NPDisk::TSectorMap sectorMap(deviceSize, diskMode);
3856
sectorMap.ZeroInit(2);
3957

4058
double timeElapsed = 0;
41-
if (testRead) {
59+
if (operationType == EOperationType::OperationRead) {
4260
sectorMap.Write((ui8*)data.data(), dataSize, sectorPos * NPDisk::NSectorMap::SECTOR_SIZE);
4361
THPTimer timer;
4462
sectorMap.Read((ui8*)data.data(), dataSize, sectorPos * NPDisk::NSectorMap::SECTOR_SIZE);
@@ -50,44 +68,38 @@ Y_UNIT_TEST_SUITE(TSectorMap) {
5068
}
5169

5270
timeSum += timeElapsed;
53-
}
54-
double timeAvg = timeSum / tries;
55-
double relativeDeviation = (timeAvg - timeExpected) / timeExpected;
56-
if (time) {
57-
*time = { timeExpected, timeAvg };
71+
72+
double timeAvg = timeSum / tries;
73+
double relativeDeviation = (timeAvg - timeExpected) / timeExpected;
74+
if (time) {
75+
*time = { timeExpected, timeAvg };
76+
}
77+
if (std::abs(relativeDeviation) <= deviationRange) {
78+
return true;
79+
}
5880
}
5981

60-
return std::abs(relativeDeviation) <= deviationRange;
82+
return false;
6183
}
6284

63-
Y_UNIT_TEST(SectorMapPerformance) {
64-
std::vector<TString> failedTests;
6585

66-
std::pair<double, double> time;
86+
#define MAKE_TEST(diskMode, diskSizeGb, dataSizeMb, operationType, position) \
87+
Y_UNIT_TEST(Test##diskMode##diskSizeGb##GB##operationType##dataSizeMb##MB##On##position##Sector) { \
88+
std::pair<double, double> time; \
89+
UNIT_ASSERT_C(TestSectorMapPerformance(EDiskMode::DM_##diskMode, diskSizeGb, dataSizeMb, \
90+
ESectorPosition::Sector##position, EOperationType::Operation##operationType, 3, 0.1, &time), \
91+
"Time expected# " << time.first << " actual avg time#" << time.second); \
92+
}
6793

68-
using EDiskMode = NPDisk::NSectorMap::EDiskMode;
69-
auto test = [&](EDiskMode diskMode, ui32 diskSizeGb, ui32 dataSizeMb, bool toFirstSector, bool testRead, ui32 tries) {
70-
if (!TestSectorMapPerformance(diskMode, diskSizeGb, dataSizeMb, toFirstSector, testRead, tries, 0.1, &time)) {
71-
failedTests.push_back(TStringBuilder() << diskSizeGb << "GB " << NPDisk::NSectorMap::DiskModeToString(diskMode) <<
72-
(testRead ? " read " : " write ") << dataSizeMb << " MB to" << (toFirstSector ? " first " : " last ") <<
73-
"sector, timeExpected=" << time.first << ", timeAverage=" << time.second);
74-
}
75-
};
94+
MAKE_TEST(HDD, 1960, 100, Read, First);
95+
MAKE_TEST(HDD, 1960, 100, Read, Last);
96+
MAKE_TEST(HDD, 1960, 100, Write, First);
97+
MAKE_TEST(HDD, 1960, 100, Write, Last);
98+
MAKE_TEST(HDD, 1960, 1000, Read, First);
99+
MAKE_TEST(HDD, 1960, 1000, Read, Last);
100+
MAKE_TEST(HDD, 1960, 1000, Write, First);
101+
MAKE_TEST(HDD, 1960, 1000, Write, Last);
76102

77-
for (auto diskMode : { EDiskMode::DM_HDD, EDiskMode::DM_SSD }) {
78-
for (ui32 dataSizeMb : { 100, 1000 }) {
79-
for (bool testRead : { false, true }) {
80-
test(diskMode, 1960, dataSizeMb, true, testRead, 1);
81-
}
82-
}
83-
}
84-
test(EDiskMode::DM_HDD, 1960, 100, false, true, 1);
85-
test(EDiskMode::DM_HDD, 1960, 100, false, false, 1);
86-
87-
for (auto& testName : failedTests) {
88-
Cerr << testName << Endl;
89-
}
90-
UNIT_ASSERT(failedTests.empty());
91-
}
103+
#undef MAKE_TEST
92104
}
93105
}

0 commit comments

Comments
 (0)