]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: use XLOCK_WAIT For local lock xlockers
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 4 Mar 2024 20:44:45 +0000 (15:44 -0500)
committerPatrick Donnelly <pdonnell@redhat.com>
Wed, 20 Mar 2024 14:56:57 +0000 (10:56 -0400)
This avoids waking up all waiters when only WAIT_XLOCK waiters should wake.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
src/mds/Locker.cc

index 300b94904e64b6d9a186baf3e08ef2a5934e90ff..6a72f2d3e4dc2731a87c27e491d233e253d186d3 100644 (file)
@@ -5486,7 +5486,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;
   }
 }
@@ -5500,9 +5500,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);
   }
 }
 
@@ -5515,7 +5515,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;
   }
 
@@ -5533,7 +5533,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);