]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: queue a delay cap flushing if there are ditry caps/snapcaps 54472/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 08:06:52 +0000 (16:06 +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 1944e6081a03e787e4708675f7abc4c9205c55f0..83a4e0b233f349fd374a44a3afe744011405e456 100644 (file)
@@ -4691,6 +4691,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;
@@ -4728,7 +4731,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++;
       }
     }
   }