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 <pdonnell@redhat.com>
This commit is contained in:
Patrick Donnelly 2024-03-04 15:44:45 -05:00
parent bddd3c7201
commit f813b8c511
No known key found for this signature in database
GPG Key ID: FA47FD0B0367D313

View 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);