]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: set/test ALL_LOCKED on fragment_dir request
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 29 Apr 2024 14:51:39 +0000 (10:51 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Mon, 29 Apr 2024 21:08:39 +0000 (17:08 -0400)
This is an optimization to obviate repeated calls to acquire_locks.

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

index a092854d22b02895e0e14363f248b5fdddd1f4a6..c818a6071e02dd03e6de91b435874105a0259197 100644 (file)
@@ -12086,15 +12086,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;
+        }
+      }
     }
   }