aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTor Brede Vekterli <vekterli@yahooinc.com>2023-01-13 13:13:28 +0100
committerGitHub <noreply@github.com>2023-01-13 13:13:28 +0100
commit6ea555de57ad11bae44e7f9abca4d2b06d3863ae (patch)
tree1f6ae291c8b95b443ac38f459c176bcf2340ba37
parent45bcd747f2affce11d670f4457678be4b0931aea (diff)
parent13dc64a8b04e2b8bf2205dc09f0ac8b897a89bcf (diff)
Merge pull request #25562 from vespa-engine/balder/make-lock-release-thread-safe-again
Move the checks to the safe section.
-rw-r--r--storage/src/vespa/storage/persistence/filestorage/filestorhandlerimpl.cpp8
1 files changed, 5 insertions, 3 deletions
diff --git a/storage/src/vespa/storage/persistence/filestorage/filestorhandlerimpl.cpp b/storage/src/vespa/storage/persistence/filestorage/filestorhandlerimpl.cpp
index f9709479126..12924c3b4f7 100644
--- a/storage/src/vespa/storage/persistence/filestorage/filestorhandlerimpl.cpp
+++ b/storage/src/vespa/storage/persistence/filestorage/filestorhandlerimpl.cpp
@@ -1162,8 +1162,9 @@ FileStorHandlerImpl::Stripe::release(const document::Bucket & bucket,
assert(iter != _lockedBuckets.end());
auto& entry = iter->second;
Clock::time_point start_time;
+ bool wasExclusive = (reqOfReleasedLock == api::LockingRequirements::Exclusive);
- if (reqOfReleasedLock == api::LockingRequirements::Exclusive) {
+ if (wasExclusive) {
assert(entry._exclusiveLock);
assert(entry._exclusiveLock->msgId == lockMsgId);
if (was_active_merge) {
@@ -1185,10 +1186,11 @@ FileStorHandlerImpl::Stripe::release(const document::Bucket & bucket,
if (!entry._exclusiveLock && entry._sharedLocks.empty()) {
_lockedBuckets.erase(iter); // No more locks held
}
+ bool emptySharedLocks = entry._sharedLocks.empty();
guard.unlock();
- if (entry._exclusiveLock) {
+ if (wasExclusive) {
_cond->notify_all();
- } else if (entry._sharedLocks.empty()) {
+ } else if (emptySharedLocks) {
_cond->notify_one();
}
}