aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorserg-belyakov <serg-belyakov@yandex-team.com>2022-08-31 17:48:48 +0300
committerserg-belyakov <serg-belyakov@yandex-team.com>2022-08-31 17:48:48 +0300
commit4945c3934e4ab4eea56dfe0e24ac58488846a179 (patch)
treef11673c37eaf8be3283220b89ea45daa0671f877
parentbc36654b8c3d511ea51c097d69ea9b1775a5b37e (diff)
downloadydb-4945c3934e4ab4eea56dfe0e24ac58488846a179.tar.gz
DATA_DECOMMITTED state test,
DecommitWithInflight
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp86
1 files changed, 84 insertions, 2 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
index d1219e1aa3..cc7e24858a 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp
@@ -1041,7 +1041,6 @@ std::atomic<ui64> TVDiskMock::OwnerRound = 2;
TVDiskMock mock(&testCtx);
mock.Init();
-
ui32 vdisksNum = 100;
std::vector<TVDiskMock> mocks;
for (ui32 i = 0; i < vdisksNum; ++i) {
@@ -1102,7 +1101,6 @@ std::atomic<ui64> TVDiskMock::OwnerRound = 2;
TVDiskMock mock(&testCtx);
mock.Init();
-
ui32 vdisksNum = 100;
std::vector<TVDiskMock> mocks;
for (ui32 i = 0; i < vdisksNum; ++i) {
@@ -1153,5 +1151,89 @@ std::atomic<ui64> TVDiskMock::OwnerRound = 2;
testCtx.Recv<NPDisk::TEvHarakiriResult>();
}
}
+
+ Y_UNIT_TEST(DecommitWithInflight) {
+ THPTimer timer;
+ ui32 timeLimit = 20;
+ while (timer.Passed() < timeLimit) {
+ TActorTestContext testCtx(false);
+ ui32 dataSize = 1024;
+
+ auto logNoTest = [&](TVDiskMock& mock, NPDisk::TCommitRecord rec) {
+ auto evLog = MakeHolder<NPDisk::TEvLog>(mock.PDiskParams->Owner, mock.PDiskParams->OwnerRound, 0, PrepareData(1),
+ mock.GetLsnSeg(), nullptr);
+ evLog->Signature.SetCommitRecord();
+ evLog->CommitRecord = std::move(rec);
+ testCtx.Send(evLog.Release());
+ };
+
+ auto sendManyReads = [&](TVDiskMock& mock, TChunkIdx chunk, ui32 number, ui64& cookie) {
+ for (ui32 i = 0; i < number; ++i) {
+ testCtx.Send(new NPDisk::TEvChunkRead(mock.PDiskParams->Owner, mock.PDiskParams->OwnerRound,
+ chunk, 0, dataSize, 0, (void*)(cookie++)));
+ }
+ };
+
+ auto sendManyWrites = [&](TVDiskMock& mock, TChunkIdx chunk, ui32 number, ui64& cookie) {
+ for (ui32 i = 0; i < number; ++i) {
+ TString data = PrepareData(dataSize);
+ testCtx.Send(new NPDisk::TEvChunkWrite(mock.PDiskParams->Owner, mock.PDiskParams->OwnerRound,
+ chunk, 0, new NPDisk::TEvChunkWrite::TStrokaBackedUpParts(data), (void*)(cookie++), false, 0));
+ }
+ };
+
+ TVDiskMock mock(&testCtx);
+ mock.Init();
+
+ ui32 reservedChunks = 10;
+ for (ui32 i = 0; i < reservedChunks; ++i) {
+ mock.ReserveChunk();
+ }
+
+ {
+ auto& chunkIds = mock.Chunks[EChunkState::COMMITTED];
+ for (auto it = chunkIds.begin(); it != chunkIds.end(); ++it) {
+ TString data = PrepareData(dataSize);
+ testCtx.TestResponce<NPDisk::TEvChunkWriteResult>(new NPDisk::TEvChunkWrite(mock.PDiskParams->Owner, mock.PDiskParams->OwnerRound,
+ *it, 0, new NPDisk::TEvChunkWrite::TStrokaBackedUpParts(data), (void*)10, false, 0),
+ NKikimrProto::OK);
+ }
+ }
+
+ mock.CommitReservedChunks();
+
+ ui32 inflight = 100;
+ auto& chunkIds = mock.Chunks[EChunkState::COMMITTED];
+
+ ui64 cookie = 0;
+ for (auto it = chunkIds.begin(); it != chunkIds.end(); ++it) {
+ sendManyWrites(mock, *it, inflight, cookie);
+ sendManyReads(mock, *it, inflight, cookie);
+ NPDisk::TCommitRecord rec;
+ rec.DeleteChunks.push_back(*it);
+ rec.DeleteToDecommitted = true;
+ logNoTest(mock, rec);
+ sendManyWrites(mock, *it, inflight, cookie);
+ sendManyReads(mock, *it, inflight, cookie);
+ }
+ mock.Chunks[EChunkState::COMMITTED].clear();
+
+
+ for (ui32 i = 0; i < inflight * 2 * reservedChunks; ++i) {
+ {
+ auto res = testCtx.Recv<NPDisk::TEvChunkReadResult>();
+ UNIT_ASSERT_VALUES_EQUAL_C(res->Status, NKikimrProto::OK, res->ToString());
+ }
+ {
+ auto res = testCtx.Recv<NPDisk::TEvChunkWriteResult>();
+ UNIT_ASSERT_VALUES_EQUAL_C(res->Status, NKikimrProto::OK, res->ToString());
+ }
+ }
+ for (ui32 i = 0; i < reservedChunks; ++i) {
+ testCtx.TestResponce<NPDisk::TEvChunkForgetResult>(new NPDisk::TEvChunkForget(mock.PDiskParams->Owner, mock.PDiskParams->OwnerRound),
+ NKikimrProto::OK);
+ }
+ }
+ }
}
} // namespace NKikimr