]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: queue a delay cap flushing if there are ditry caps/snapcaps 54466/head
authorXiubo Li <xiubli@redhat.com>
Thu, 21 Sep 2023 07:02:38 +0000 (15:02 +0800)
committerXiubo Li <xiubli@redhat.com>
Mon, 13 Nov 2023 00:36:24 +0000 (08:36 +0800)
We should queue a cap release anyway if there are dirty caps/snapcaps
for the inodes when trimming caps.

Fixes: https://tracker.ceph.com/issues/62979
Signed-off-by: Xiubo Li <xiubli@redhat.com>
(cherry picked from commit d14752ff1f56da93ad0d9c94fcf101945fdacadd)

src/client/Client.cc

index 2b7db5a894d1cc325e2fd2a3d2d7a114d24484e1..24fa625f1ab2eee0407e61166a3f5e45887453fb 100644 (file)
@@ -4773,6 +4773,9 @@ void Client::trim_caps(MetaSession *s, uint64_t max)
     // is deleted inside remove_cap
     ++p;
 
+    if (in->dirty_caps || in->cap_snaps.size())
+      cap_delay_requeue(in.get());
+
     if (in->caps.size() > 1 && cap != in->auth_cap) {
       int mine = cap->issued | cap->implemented;
       int oissued = in->auth_cap ? in->auth_cap->issued : 0;
@@ -4810,7 +4813,8 @@ void Client::trim_caps(MetaSession *s, uint64_t max)
       }
       if (all && in->ino != CEPH_INO_ROOT) {
         ldout(cct, 20) << __func__ << " counting as trimmed: " << *in << dendl;
-       trimmed++;
+       if (!in->dirty_caps && !in->cap_snaps.size())
+         trimmed++;
       }
     }
   }