From: Patrick Donnelly Date: Mon, 29 Apr 2024 14:51:39 +0000 (-0400) Subject: mds: set/test ALL_LOCKED on fragment_dir request X-Git-Tag: v19.1.1~335^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=eb2960f1509fcada21ab5212225e88631ec891ec;p=ceph.git mds: set/test ALL_LOCKED on fragment_dir request This is an optimization to obviate repeated calls to acquire_locks. Signed-off-by: Patrick Donnelly (cherry picked from commit fca346d29fca4470290f8419214c4908e6a242b1) --- diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 0226ce32f719..3ca1ca47e9bd 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -12085,15 +12085,20 @@ void MDCache::dispatch_fragment_dir(const MDRequestRef& mdr) if (mdr->more()->peer_error) mdr->aborted = true; - if (!mdr->aborted) { - MutationImpl::LockOpVec lov; - lov.add_wrlock(&diri->dirfragtreelock); - // prevent a racing gather on any other scatterlocks too - lov.lock_scatter_gather(&diri->nestlock); - lov.lock_scatter_gather(&diri->filelock); - if (!mds->locker->acquire_locks(mdr, lov, NULL, {}, true)) { - if (!mdr->aborted) - return; + if (!(mdr->locking_state & MutationImpl::ALL_LOCKED)) { + if (!mdr->aborted) { + MutationImpl::LockOpVec lov; + lov.add_wrlock(&diri->dirfragtreelock); + // prevent a racing gather on any other scatterlocks too + lov.lock_scatter_gather(&diri->nestlock); + lov.lock_scatter_gather(&diri->filelock); + if (mds->locker->acquire_locks(mdr, lov, NULL, {}, true)) { + mdr->locking_state |= MutationImpl::ALL_LOCKED; + } else { + if (!mdr->aborted) { + return; + } + } } }