From c51da4afb47e7bb23080bc27f449efec36fe4b9c Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Thu, 21 Sep 2023 15:02:38 +0800 Subject: [PATCH] client: queue a delay cap flushing if there are ditry caps/snapcaps 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 (cherry picked from commit d14752ff1f56da93ad0d9c94fcf101945fdacadd) --- src/client/Client.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 2b7db5a894d..24fa625f1ab 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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++; } } } -- 2.39.5