aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorserg-belyakov <serg-belyakov@yandex-team.com>2022-10-04 11:40:53 +0300
committerserg-belyakov <serg-belyakov@yandex-team.com>2022-10-04 11:40:53 +0300
commita04bcbd6d1f7cef1565bd1a474f3860e8f2238a0 (patch)
tree67b87646dc3bd124adb898807b601cc7765c4527
parent5022741aa2ff5ed64a52cd6b58ec20d36d34dc3b (diff)
downloadydb-a04bcbd6d1f7cef1565bd1a474f3860e8f2238a0.tar.gz
Add mutexes to stabilize ChunkTracker,
-rw-r--r--ydb/core/blobstorage/pdisk/blobstorage_pdisk_impl.cpp29
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();