From: Patrick Donnelly Date: Mon, 4 Mar 2024 20:44:45 +0000 (-0500) Subject: mds: use XLOCK_WAIT For local lock xlockers X-Git-Tag: v19.1.0~193^2~10 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=5fdf9c56556963695147bc2a02aacea6e55c4b3d;p=ceph.git mds: use XLOCK_WAIT For local lock xlockers This avoids waking up all waiters when only WAIT_XLOCK waiters should wake. Signed-off-by: Patrick Donnelly (cherry picked from commit f813b8c511a50a7fab673c2b99587f00fb506323) --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 5b296dffa5784..efc134143f80b 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -5488,7 +5488,7 @@ bool Locker::local_wrlock_start(LocalLockC *lock, const MDRequestRef& mut) ceph_assert(it->is_wrlock()); return true; } else { - lock->add_waiter(SimpleLock::WAIT_WR|SimpleLock::WAIT_STABLE, new C_MDS_RetryRequest(mdcache, mut)); + lock->add_waiter(SimpleLock::WAIT_WR, new C_MDS_RetryRequest(mdcache, mut)); return false; } } @@ -5502,9 +5502,9 @@ void Locker::local_wrlock_finish(const MutationImpl::lock_iterator& it, Mutation lock->put_wrlock(); mut->locks.erase(it); if (lock->get_num_wrlocks() == 0) { - lock->finish_waiters(SimpleLock::WAIT_STABLE | - SimpleLock::WAIT_WR | - SimpleLock::WAIT_RD); + /* wrlocks do not wait unless an xlocker is waiting */ + ceph_assert(!lock->is_waiter_for(SimpleLock::WAIT_WR) || lock->is_waiter_for(SimpleLock::WAIT_XLOCK)); + lock->finish_waiters(SimpleLock::WAIT_XLOCK); } } @@ -5517,7 +5517,7 @@ bool Locker::local_xlock_start(LocalLockC *lock, const MDRequestRef& mut) invalidate_lock_caches(lock); } if (!lock->can_xlock_local()) { - lock->add_waiter(SimpleLock::WAIT_WR|SimpleLock::WAIT_STABLE, new C_MDS_RetryRequest(mdcache, mut)); + lock->add_waiter(SimpleLock::WAIT_XLOCK, new C_MDS_RetryRequest(mdcache, mut)); return false; } @@ -5535,7 +5535,7 @@ void Locker::local_xlock_finish(const MutationImpl::lock_iterator& it, MutationI lock->put_xlock(); mut->locks.erase(it); - lock->finish_waiters(SimpleLock::WAIT_STABLE | + lock->finish_waiters(SimpleLock::WAIT_XLOCK | SimpleLock::WAIT_WR | SimpleLock::WAIT_RD);