summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorserg-belyakov <[email protected]>2022-12-05 19:16:40 +0300
committerserg-belyakov <[email protected]>2022-12-05 19:16:40 +0300
commitb8215ceed46ee2d1bdab63b3cee2925295a966e0 (patch)
tree7a8fdcc3773b60b322a2d55246b6453c1a2ece70
parent3eec43dd0e58c78c87f23c930b9ecf977a4d8fc0 (diff)
revert OperationLog,
Revert "Add diagnostic information to TOwnerData," This reverts commit 5f54c21bac8edbf124178965a012636c8dafb866, reversing changes made to 247eeb8d9722b4d9f4b32dd7240a7e525da61ce1.
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h1
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp35
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_http.cpp14
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp2
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_logreader.cpp4
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_requestimpl.h34
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h61
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h25
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_races.cpp63
9 files changed, 17 insertions, 222 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
index 7ec5566846f..6c565d07a7d 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_defs.h
@@ -104,3 +104,4 @@ template<>
inline void Out<NKikimr::NPDisk::TOwner>(IOutputStream& os, const NKikimr::NPDisk::TPrintable_ui8& x) {
os << static_cast<ui64>(x);
}
+
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
index 18e03f09556..6ec5cd7b687 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp
@@ -727,7 +727,6 @@ void TPDisk::AskVDisksToCutLogs(TOwner ownerFilter, bool doForce) {
ActorSystem->Send(new IEventHandle(OwnerData[chunkOwner].CutLogId, PDiskActor, cutLog.Release(),
IEventHandle::FlagTrackDelivery, 0));
OwnerData[chunkOwner].AskedToCutLogAt = now;
- // ADD_OPERATION_TO_LOG(OwnerData[chunkOwner].OperationLog, "System owner asked to cut log at " << now);
} else {
LOG_INFO_S(*ActorSystem, NKikimrServices::BS_PDISK,
"PDiskId# " << (ui32)PDiskId
@@ -771,7 +770,6 @@ void TPDisk::AskVDisksToCutLogs(TOwner ownerFilter, bool doForce) {
ActorSystem->Send(new IEventHandle(OwnerData[ownerFilter].CutLogId, PDiskActor, cutLog.Release(),
IEventHandle::FlagTrackDelivery, 0));
OwnerData[ownerFilter].AskedToCutLogAt = now;
- // ADD_OPERATION_TO_LOG(OwnerData[ownerFilter].OperationLog, "User owner asked to cut log at " << now);
} else {
LOG_INFO_S(*ActorSystem, NKikimrServices::BS_PDISK,
"PDiskId# " << (ui32)PDiskId
@@ -1721,7 +1719,6 @@ bool TPDisk::YardInitForKnownVDisk(TYardInit &evYardInit, TOwner owner) {
TVDiskID vDiskId = evYardInit.VDiskIdWOGeneration();
TOwnerData &ownerData = OwnerData[owner];
- ADD_OPERATION_TO_LOG(ownerData.OperationLog, "YardInitForKnownVDisk, evYardInit# " << evYardInit.ToString());
ownerData.OwnerRound = evYardInit.OwnerRound;
TOwnerRound ownerRound = evYardInit.OwnerRound;
@@ -1803,8 +1800,7 @@ bool TPDisk::YardInitStart(TYardInit &evYardInit) {
}
// TODO REPLY ERROR
TOwnerData &data = OwnerData[owner];
- Y_VERIFY_S(!data.HaveRequestsInFlight(), "owner# " << owner <<
- ", State: " << data.ToString() << ", Operation log: " << data.OperationLog.Print());
+ Y_VERIFY_S(!data.HaveRequestsInFlight(), "owner# " << owner);
}
evYardInit.Owner = owner;
@@ -1821,7 +1817,6 @@ bool TPDisk::YardInitStart(TYardInit &evYardInit) {
}
// Update round and wait for all pending requests of old owner to finish
- ADD_OPERATION_TO_LOG(ownerData.OperationLog, "YardInitStart, new OwnerRound# " << evYardInit.OwnerRound << ", State# " << ownerData.ToString());
ownerData.OwnerRound = evYardInit.OwnerRound;
return true;
}
@@ -1844,23 +1839,22 @@ void TPDisk::YardInitFinish(TYardInit &evYardInit) {
// TODO(cthulhu): don't allocate more owners than expected
Keeper.AddOwner(owner, vDiskId);
- TOwnerData& ownerData = OwnerData[owner];
- ownerData.Reset(false);
+ OwnerData[owner].Reset(false);
+
// A new owner is created.
AtomicIncrement(TotalOwners);
- ownerData.VDiskId = vDiskId;
+ OwnerData[owner].VDiskId = vDiskId;
Y_VERIFY(SysLogFirstNoncesToKeep.FirstNonceToKeep[owner] <= SysLogRecord.Nonces.Value[NonceLog]);
SysLogFirstNoncesToKeep.FirstNonceToKeep[owner] = SysLogRecord.Nonces.Value[NonceLog];
- ownerData.CutLogId = evYardInit.CutLogId;
- ownerData.WhiteboardProxyId = evYardInit.WhiteboardProxyId;
- ownerData.VDiskSlotId = evYardInit.SlotId;
- ownerData.OwnerRound = evYardInit.OwnerRound;
+ OwnerData[owner].CutLogId = evYardInit.CutLogId;
+ OwnerData[owner].WhiteboardProxyId = evYardInit.WhiteboardProxyId;
+ OwnerData[owner].VDiskSlotId = evYardInit.SlotId;
+ OwnerData[owner].OwnerRound = evYardInit.OwnerRound;
VDiskOwners[vDiskId] = owner;
- ownerData.Status = TOwnerData::VDISK_STATUS_SENT_INIT;
+ OwnerData[owner].Status = TOwnerData::VDISK_STATUS_SENT_INIT;
SysLogRecord.OwnerVDisks[owner] = vDiskId;
- ownerRound = ownerData.OwnerRound;
- ADD_OPERATION_TO_LOG(ownerData.OperationLog, "YardInitFinish, OwnerData# " << ownerData.ToString());
+ ownerRound = OwnerData[owner].OwnerRound;
AddCbsSet(owner);
@@ -1868,8 +1862,8 @@ void TPDisk::YardInitFinish(TYardInit &evYardInit) {
<< " new owner is created. ownerId# " << owner
<< " vDiskId# " << vDiskId.ToStringWOGeneration()
<< " FirstNonceToKeep# " << SysLogFirstNoncesToKeep.FirstNonceToKeep[owner]
- << " CutLogId# " << ownerData.CutLogId
- << " ownerRound# " << ownerData.OwnerRound
+ << " CutLogId# " << OwnerData[owner].CutLogId
+ << " ownerRound# " << OwnerData[owner].OwnerRound
<< " Marker# BPD02");
AskVDisksToCutLogs(OwnerSystem, false);
@@ -1998,7 +1992,6 @@ void TPDisk::KillOwner(TOwner owner, TOwnerRound killOwnerRound, TCompletionEven
if (state.CommitState == TChunkState::DATA_ON_QUARANTINE) {
if (!pushedOwnerIntoQuarantine) {
pushedOwnerIntoQuarantine = true;
- ADD_OPERATION_TO_LOG(OwnerData[owner].OperationLog, "KillOwner(), Add owner to quarantine, DATA_ON_QUARANTINE, OwnerId# " << (ui32)owner);
QuarantineOwners.push_back(owner);
LOG_NOTICE_S(*ActorSystem, NKikimrServices::BS_PDISK, "PDiskId# " << PDiskId
<< " push ownerId# " << owner
@@ -2034,7 +2027,6 @@ void TPDisk::KillOwner(TOwner owner, TOwnerRound killOwnerRound, TCompletionEven
if (!pushedOwnerIntoQuarantine) {
pushedOwnerIntoQuarantine = true;
- ADD_OPERATION_TO_LOG(OwnerData[owner].OperationLog, "KillOwner(), Add owner to quarantine, OwnerId# " << (ui32)owner);
QuarantineOwners.push_back(owner);
LOG_NOTICE_S(*ActorSystem, NKikimrServices::BS_PDISK, "PDiskId# " << PDiskId
<< " push ownerId# " << owner << " into quarantine");
@@ -2045,7 +2037,6 @@ void TPDisk::KillOwner(TOwner owner, TOwnerRound killOwnerRound, TCompletionEven
}
}
if (!pushedOwnerIntoQuarantine) {
- ADD_OPERATION_TO_LOG(OwnerData[owner].OperationLog, "KillOwner(), Remove owner without quarantine, OwnerId# " << (ui32)owner);
Keeper.RemoveOwner(owner);
LOG_NOTICE_S(*ActorSystem, NKikimrServices::BS_PDISK, "PDiskId# " << PDiskId
<< " removed ownerId# " << owner << " from chunks Keeper");
@@ -2298,7 +2289,6 @@ void TPDisk::ClearQuarantineChunks() {
return Keeper.GetOwnerUsed(i);
});
for (auto delIt = it; delIt != QuarantineOwners.end(); ++delIt) {
- ADD_OPERATION_TO_LOG(OwnerData[*delIt].OperationLog, "Remove owner from quarantine, OwnerId# " << (ui32)(*delIt));
Keeper.RemoveOwner(*delIt);
LOG_NOTICE_S(*ActorSystem, NKikimrServices::BS_PDISK, "PDiskId# " << PDiskId
<< " removed ownerId# " << *delIt << " from chunks Keeper through QuarantineOwners");
@@ -2856,7 +2846,6 @@ bool TPDisk::PreprocessRequest(TRequestBase *request) {
new TEvChunkWriteResult(NKikimrProto::OK, ev.ChunkIdx, ev.Cookie,
GetStatusFlags(ev.Owner, ev.OwnerGroupType), TString()));
- // ADD_OPERATION_TO_LOG(ownerData.OperationLog, "Preprocessing chunk write request, write size# " << ev.TotalSize);
++state.OperationsInProgress;
++ownerData.InFlight->ChunkWrites;
auto onDestroy = [&, inFlight = ownerData.InFlight]() {
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_http.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_http.cpp
index 102ed626fe7..0df4d828ed4 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_http.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_http.cpp
@@ -202,7 +202,6 @@ void TPDisk::OutputHtmlOwners(TStringStream &str) {
TABLEH() { str << "FirstNonceToKeep"; }
TABLEH() { str << "AskedToCutLogAt"; }
TABLEH() { str << "CutLogAt"; }
- TABLEH() { str << "OperationLog"; }
}
}
TABLEBODY() {
@@ -227,19 +226,6 @@ void TPDisk::OutputHtmlOwners(TStringStream &str) {
str << data.CutLogAt;
}
}
- TABLED() {
- str << "<button type='button' class='btn btn-default' data-toggle='collapse' style='margin:5px' \
- data-target='#operationLogCollapse" << owner <<
- "'>Show last " << OwnerData[owner].OperationLog.Size << " operations</button>";
-
- str << "<div id='operationLogCollapse" << owner << "' class='collapse'>";
- for (ui32 i = OwnerData[owner].OperationLog.RecordIdx, ctr = 0;
- ctr < OwnerData[owner].OperationLog.Size;
- ++ctr, i = (i == 0) ? OwnerData[owner].OperationLog.Size - 1 : i - 1) {
- str << OwnerData[owner].OperationLog.Records[i] << "<br>";
- }
- str << "</div>";
- }
}
}
}
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp
index 3dd40d6864f..3ce5c470e0f 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl_log.cpp
@@ -217,7 +217,6 @@ void TPDisk::ProcessChunk0(const NPDisk::TEvReadLogResult &readLogResult) {
id.GroupGeneration = -1; // Clear GroupGeneration in sys log record (for compatibility)
OwnerData[i].VDiskId = id;
OwnerData[i].Status = TOwnerData::VDISK_STATUS_HASNT_COME;
- ADD_OPERATION_TO_LOG(OwnerData[i].OperationLog, "Processing Chunk0, vdisk id# " << id.ToString());
if (id != TVDiskID::InvalidId) {
VDiskOwners[id] = TOwner(i);
AtomicIncrement(TotalOwners);
@@ -434,7 +433,6 @@ void TPDisk::ProcessLogReadQueue() {
{
TLogRead &logRead = *static_cast<TLogRead*>(req);
auto& ownerData = OwnerData[logRead.Owner];
-
ownerData.Status = TOwnerData::VDISK_STATUS_READING_LOG;
TLogPosition logStartPosition{0, 0};
if (logRead.Owner < OwnerData.size() && ownerData.VDiskId != TVDiskID::InvalidId) {
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_logreader.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_logreader.cpp
index b5c14971905..05a22e0a537 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_logreader.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_logreader.cpp
@@ -165,7 +165,6 @@ void TPDisk::ProcessReadLogRecord(TLogRecordHeader &header, TString &data, NPDis
{
TGuard<TMutex> guard(StateMutex);
TOwnerData &ownerData = OwnerData[header.OwnerId];
-
if (ownerData.VDiskId != TVDiskID::InvalidId) {
if (!ownerData.IsNextLsnOk(header.OwnerLsn)) {
TStringStream str;
@@ -176,7 +175,7 @@ void TPDisk::ProcessReadLogRecord(TLogRecordHeader &header, TString &data, NPDis
<< " header.OwnerLsn# " << header.OwnerLsn
<< " nonce# " << nonce
<< Endl;
- Y_FAIL_S(str.Str() << " operation log# " << ownerData.OperationLog.Print());
+ Y_FAIL_S(str.Str());
}
ownerData.LastSeenLsn = header.OwnerLsn;
}
@@ -958,7 +957,6 @@ void TLogReader::ReplyOk() {
}
// End of log reached
if (OwnerVDiskId != TVDiskID::InvalidId) {
- ADD_OPERATION_TO_LOG(ownerData.OperationLog, "Has read the whole log");
ownerData.HasReadTheWholeLog = true;
}
}
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_requestimpl.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_requestimpl.h
index 0099c9eb36b..7e981933fbb 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_requestimpl.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_requestimpl.h
@@ -141,16 +141,6 @@ public:
v.GroupGeneration = -1;
return v;
}
-
- TString ToString() const {
- TStringStream str;
- str << "TYardInit {";
- str << "VDisk# " << VDisk.ToString();
- str << " PDiskGuid# " << PDiskGuid;
- str << " SlotId# " << SlotId;
- str << "}";
- return str.Str();
- }
};
//
@@ -321,18 +311,6 @@ public:
void SetOnDestroy(std::function<void()> onDestroy) {
OnDestroy = std::move(onDestroy);
}
-
- TString ToString() const {
- TStringStream str;
- str << "TLogWrite {";
- str << "EstimatedChunkIdx# " << EstimatedChunkIdx;
- str << " LsnSegmentStart# " << LsnSegmentStart;
- str << " Lsn# " << Lsn;
- str << " Result# " << (!Result ? "is empty" : Result->ToString());
- str << " OnDestroy is " << (!OnDestroy ? "not " : "") << "set";
- str << "}";
- return str.Str();
- }
};
class TCompletionChunkRead;
@@ -933,18 +911,6 @@ public:
ERequestType GetType() const override {
return ERequestType::RequestLogCommitDone;
}
-
- TString ToString() const {
- TStringStream str;
- str << "TLogCommitDone {";
- str << "OwnerId# " << (ui32)OwnerId;
- str << " OwnerRound# " << OwnerRound;
- str << " Lsn# " << Lsn;
- str << " CommitedChunks.size()# " << CommitedChunks.size();
- str << " DeletedChunks.size()# " << DeletedChunks.size();
- str << "}";
- return str.Str();
- }
};
//
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h
index 87284fde948..66d6c384360 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_state.h
@@ -3,7 +3,6 @@
#include "blobstorage_pdisk.h"
#include "blobstorage_pdisk_logreader_base.h"
-#include "blobstorage_pdisk_tools.h"
#include <ydb/core/util/metrics.h>
@@ -81,8 +80,6 @@ struct TOwnerData {
bool OnQuarantine = false;
- TOperationLog<8> OperationLog;
-
TOwnerData()
: InFlight(new TOwnerInflight)
{}
@@ -142,65 +139,11 @@ struct TOwnerData {
}
bool HaveRequestsInFlight() const {
- return LogReader || InFlight->ChunkWrites.load() || InFlight->ChunkReads.load() || InFlight->LogWrites.load();
- }
-
- TString ToString() const {
- TStringStream str;
- str << "TOwnerData {";
- str << "VDiskId# " << VDiskId.ToString();
- str << " Status# " << RenderStatus(Status);
- str << " CurrentFirstLsnToKeep# " << CurrentFirstLsnToKeep;
- str << " LastWrittenCommitLsn# " << LastWrittenCommitLsn;
- str << " LogRecordsInitiallyRead# " << LogRecordsInitiallyRead;
- str << " LogRecordsConsequentlyRead# " << LogRecordsConsequentlyRead;
- str << " OwnerRound# " << OwnerRound;
- str << " AskedToCutLogAt# " << AskedToCutLogAt;
- str << " CutLogAt# " << CutLogAt;
- str << " LastSeenLsn# " << LastSeenLsn;
- if (HasAlreadyLoggedThisIncarnation) {
- str << " HasAlreadyLoggedThisIncarnation";
- }
- if (HasReadTheWholeLog) {
- str << " HasReadTheWholeLog";
- }
- str << " VDiskSlotId# " << VDiskSlotId;
- if (InFlight) {
- str << " Inflight {";
- str << " ChunkWrites# " << InFlight->ChunkWrites.load();
- str << " ChunkReads# " << InFlight->ChunkReads.load();
- str << " LogWrites# " << InFlight->LogWrites.load();
- str << " }";
- }
- str << "}";
-
- return str.Str();
+ return LogReader || InFlight->ChunkWrites || InFlight->ChunkReads || InFlight->LogWrites;
}
void Reset(bool quarantine = false) {
- StartingPoints.clear();
- VDiskId = TVDiskID::InvalidId;
- Status = EVDiskStatus::VDISK_STATUS_DEFAULT;
- CurrentFirstLsnToKeep = 0;
- LastWrittenCommitLsn = 0;
- CutLogId = TActorId();
- WhiteboardProxyId = TActorId();
- LogRecordsInitiallyRead = 0;
- LogRecordsConsequentlyRead = 0;
- OwnerRound = 0;
- AskedToCutLogAt = TInstant();
- CutLogAt = TInstant();
- LastSeenLsn = 0;
- HasAlreadyLoggedThisIncarnation = false;
- HasReadTheWholeLog = false;
- LogStartPosition = TLogPosition{0, 0};
- ReadThroughput = NMetrics::TDecayingAverageValue<ui64, NMetrics::DurationPerMinute, NMetrics::DurationPerSecond>();
- WriteThroughput = NMetrics::TDecayingAverageValue<ui64, NMetrics::DurationPerMinute, NMetrics::DurationPerSecond>();
- VDiskSlotId = 0;
-
- LogReader.Reset();
- InFlight.Reset(TIntrusivePtr<TOwnerInflight>(new TOwnerInflight));
-
+ *this = TOwnerData{};
OnQuarantine = quarantine;
}
};
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h
index 221bccb7733..47021792407 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_tools.h
@@ -50,29 +50,6 @@ bool ReadPDiskFormatInfo(const TString &path, const NPDisk::TMainKey &mainKey, T
const bool doLock = false, TIntrusivePtr<NPDisk::TSectorMap> sectorMap = nullptr);
-// Size is better to be 2^n, to optimize mod operation
-template <ui32 S>
-struct TOperationLog {
- constexpr static ui32 Size = S;
- std::array<TString, S> Records;
- std::atomic<ui64> RecordIdx = std::atomic<ui64>(0);
-
- TString Print() const {
- TStringStream str;
- str << "[ " ;
- /* Print OperationLog records from newer to older */
- for (ui32 i = RecordIdx.load(), ctr = 0; ctr < Size; ++ctr, i = (i == 0) ? Size - 1 : i - 1) {
- str << "Record# " << ctr << ": { " << Records[i] << " }, ";
- }
- str << " ]";
- return str.Str();
- }
-};
-
} // NKikimr
-#define ADD_OPERATION_TO_LOG(log, record) \
- do { \
- ui32 idx = log.RecordIdx.fetch_add(1); \
- log.Records[idx % log.Size] = TStringBuilder() << TInstant::Now().ToString() << " " << record; \
- } while (false)
+
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_races.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_races.cpp
index f1f435dd898..2f104d1c3d5 100644
--- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_races.cpp
+++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_ut_races.cpp
@@ -8,7 +8,6 @@
#include <ydb/core/testlib/actors/test_runtime.h>
#include <util/system/hp_timer.h>
-#include <util/random/random.h>
namespace NKikimr {
@@ -260,68 +259,6 @@ Y_UNIT_TEST_SUITE(TPDiskRaces) {
Y_UNIT_TEST(KillOwnerWhileDecommittingWithInflightMock) {
TestKillOwnerWhileDecommitting(true, 20, 0, 10, 100);
}
-
- void OwnerRecreationRaces(bool usePDiskMock, ui32 timeLimit, ui32 vdisksNum) {
- TActorTestContext testCtx({ false, usePDiskMock });
- const TString data = PrepareData(8);
-
- std::vector<TVDiskMock> mocks;
- enum EMockState {
- Empty,
- InitStarted,
- InitFinished,
- KillStarted,
- KillFinished
- };
- std::vector<EMockState> mockState(vdisksNum, EMockState::Empty);
- for (ui32 i = 0; i < vdisksNum; ++i) {
- mocks.push_back(TVDiskMock(&testCtx));
- }
-
- THPTimer timer;
- while (timer.Passed() < timeLimit) {
- ui32 i = RandomNumber(vdisksNum);
- ui32 action = RandomNumber<ui32>(10);
- if (action != 0 && mocks[i].PDiskParams) {
- auto evLog = MakeHolder<NPDisk::TEvLog>(mocks[i].PDiskParams->Owner, mocks[i].PDiskParams->OwnerRound, 0, TContiguousData(data),
- mocks[i].GetLsnSeg(), nullptr);
- evLog->Signature = TLogSignature::SignatureLogoBlobOpt;
- testCtx.Send(evLog.Release());
- } else {
- switch (mockState[i]) {
- case EMockState::InitStarted:
- {
- auto res = testCtx.Recv<NPDisk::TEvYardInitResult>();
- UNIT_ASSERT_VALUES_EQUAL(res->Status, NKikimrProto::OK);
- mocks[i].PDiskParams = res->PDiskParams;
- mocks[i].OwnerRound = res->PDiskParams->OwnerRound;
- }
- break;
- case EMockState::InitFinished:
- {
- auto evSlay = MakeHolder<NPDisk::TEvSlay>(mocks[i].VDiskID, mocks[i].OwnerRound++, 0, 0);
- testCtx.Send(evSlay.Release());
- }
- break;
- case EMockState::KillStarted:
- {
- auto res = testCtx.Recv<NPDisk::TEvSlayResult>();
- }
- break;
- case EMockState::Empty: case EMockState::KillFinished:
- {
- auto evInit = MakeHolder<NPDisk::TEvYardInit>(mocks[i].OwnerRound++, mocks[i].VDiskID, testCtx.TestCtx.PDiskGuid);
- testCtx.Send(evInit.Release());
- }
- break;
- }
- }
- }
- }
-
- Y_UNIT_TEST(OwnerRecreationRaces) {
- OwnerRecreationRaces(false, 20, 1);
- }
}
}