]> git-server-git.apps.pok.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>
Wed, 1 May 2024 13:30:48 +0000 (09:30 -0400)
This is an optimization to obviate repeated calls to acquire_locks.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit fca346d29fca4470290f8419214c4908e6a242b1)

src/mds/MDCache.cc

index 0226ce32f719a70ebeb56c9a86f29c2b2a4dc0ac..3ca1ca47e9bd42a2e4145192f3d13d4911bebf42 100644 (file)
@@ -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;
+        }
+      }
     }
   }