diff options
author | serg-belyakov <serg-belyakov@yandex-team.com> | 2022-10-04 11:40:53 +0300 |
---|---|---|
committer | serg-belyakov <serg-belyakov@yandex-team.com> | 2022-10-04 11:40:53 +0300 |
commit | a04bcbd6d1f7cef1565bd1a474f3860e8f2238a0 (patch) | |
tree | 67b87646dc3bd124adb898807b601cc7765c4527 | |
parent | 5022741aa2ff5ed64a52cd6b58ec20d36d34dc3b (diff) | |
download | ydb-a04bcbd6d1f7cef1565bd1a474f3860e8f2238a0.tar.gz |
Add mutexes to stabilize ChunkTracker,
-rw-r--r-- | ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp index 14e876426d..f22671d35c 100644 --- a/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp +++ b/ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp @@ -1770,8 +1770,9 @@ bool TPDisk::YardInitStart(TYardInit &evYardInit) { } TOwner owner; - TVDiskID vDiskId = evYardInit.VDiskIdWOGeneration(); + + TGuard<TMutex> guard(StateMutex); auto it = VDiskOwners.find(vDiskId); if (it != VDiskOwners.end()) { // Owner is already known, but use next ownerRound to decrease probability of errors @@ -1791,6 +1792,7 @@ bool TPDisk::YardInitStart(TYardInit &evYardInit) { TOwnerData &ownerData = OwnerData[owner]; ui64 prevOwnerRound = ownerData.OwnerRound; if (prevOwnerRound >= evYardInit.OwnerRound) { + guard.Release(); TStringStream str; str << "requested OwnerRound# " << evYardInit.OwnerRound << " <= prevoiuslyUsedOwnerRound# " << prevOwnerRound @@ -3220,19 +3222,24 @@ void TPDisk::ProcessPausedQueue() { void TPDisk::ProcessYardInitSet() { for (ui32 owner = 0; owner < OwnerData.size(); ++owner) { TOwnerData &data = OwnerData[owner]; - if (data.LogReader && data.LogReader->GetIsReplied()) { - data.LogReader = nullptr; + if (data.LogReader) { + TGuard<TMutex> guard(StateMutex); + if (data.LogReader && data.LogReader->GetIsReplied()) { + data.LogReader = nullptr; + } } } - - // Process pending queue - for (auto it = PendingYardInits.begin(); it != PendingYardInits.end();) { - if (!OwnerData[(*it)->Owner].HaveRequestsInFlight()) { - YardInitFinish(**it); - it = PendingYardInits.erase(it); - } else { - ++it; + if (!PendingYardInits.empty()) { + TGuard<TMutex> guard(StateMutex); + // Process pending queue + for (auto it = PendingYardInits.begin(); it != PendingYardInits.end();) { + if (!OwnerData[(*it)->Owner].HaveRequestsInFlight()) { + YardInitFinish(**it); + it = PendingYardInits.erase(it); + } else { + ++it; + } } } *Mon.PendingYardInits = PendingYardInits.size(); |