From d1f2fe220a0ea8ea80a810e9b2798fd86d271775 Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Wed, 30 Dec 2020 09:41:01 +0800 Subject: [PATCH] client: fire the finish_cap_snap() after buffer being flushed When the inode has Fb cap and the used reference is none zero, the cap snap flushing will be delayed, so we need to make sure it will be invoked after the dirty buffer is flushed to osd. Fixes: https://tracker.ceph.com/issues/48679 Signed-off-by: Xiubo Li (cherry picked from commit a34d0c242a73d7c29956b6894a430d9979225632) --- src/client/Client.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 06f3996791edb..9e1403cd7f2b9 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3355,7 +3355,7 @@ void Client::put_cap_ref(Inode *in, int cap) int put_nref = 0; int drop = last & ~in->caps_issued(); if (in->snapid == CEPH_NOSNAP) { - if ((last & CEPH_CAP_FILE_WR) && + if ((last & (CEPH_CAP_FILE_WR | CEPH_CAP_FILE_BUFFER)) && !in->cap_snaps.empty() && in->cap_snaps.rbegin()->second.writing) { ldout(cct, 10) << __func__ << " finishing pending cap_snap on " << *in << dendl; @@ -3883,6 +3883,7 @@ void Client::finish_cap_snap(Inode *in, CapSnap &capsnap, int used) } if (used & CEPH_CAP_FILE_BUFFER) { + capsnap.writing = 1; ldout(cct, 10) << __func__ << " " << *in << " cap_snap " << &capsnap << " used " << used << " WRBUFFER, delaying" << dendl; } else { @@ -3958,7 +3959,7 @@ void Client::flush_snaps(Inode *in) << " on " << *in << dendl; if (capsnap.dirty_data || capsnap.writing) break; - + capsnap.flush_tid = ++last_flush_tid; session->flushing_caps_tids.insert(capsnap.flush_tid); in->flushing_cap_tids[capsnap.flush_tid] = 0; -- 2.39.5