From: Xiubo Li Date: Wed, 30 Dec 2020 01:41:01 +0000 (+0800) Subject: client: fire the finish_cap_snap() after buffer being flushed X-Git-Tag: v17.1.0~2460^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a34d0c242a73d7c29956b6894a430d9979225632;p=ceph-ci.git 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 --- diff --git a/src/client/Client.cc b/src/client/Client.cc index 97ff171bcec..a46e8c129db 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -3307,7 +3307,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; @@ -3835,6 +3835,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 { @@ -3910,7 +3911,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;