diff options
author | serg-belyakov <serg-belyakov@yandex-team.com> | 2022-08-31 17:48:48 +0300 |
---|---|---|
committer | serg-belyakov <serg-belyakov@yandex-team.com> | 2022-08-31 17:48:48 +0300 |
commit | 4945c3934e4ab4eea56dfe0e24ac58488846a179 (patch) | |
tree | f11673c37eaf8be3283220b89ea45daa0671f877 | |
parent | bc36654b8c3d511ea51c097d69ea9b1775a5b37e (diff) | |
download | ydb-4945c3934e4ab4eea56dfe0e24ac58488846a179.tar.gz |
DATA_DECOMMITTED state test,
DecommitWithInflight
-rw-r--r-- | ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut.cpp | 86 |
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 |