From 58a73b7334c19bc93d5d3de27ccccda5afabe3cf Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Tue, 19 Apr 2022 14:21:49 +0800 Subject: [PATCH] mds: trigger to flush the mdlog in handle_find_ino() If the the CInode was just created by using openc in current auth MDS, but the client just sends a getattr request to another replica MDS. Then here it will make a path of '#INODE-NUMBER' only because the CInode hasn't been linked yet, and the replica MDS will keep retrying until the auth MDS flushes the mdlog and the C_MDS_openc_finish and link_primary_inode are called at most 5 seconds later. Fixes: https://tracker.ceph.com/issues/55240 Signed-off-by: Xiubo Li (cherry picked from commit 5d6dd5d1acf94eade4a2c0f48777c95473d454ae) --- src/mds/MDCache.cc | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index a87e4e33208b5..8696c6d929aa8 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -9326,6 +9326,19 @@ void MDCache::handle_find_ino(const cref_t &m) if (in) { in->make_path(r->path); dout(10) << " have " << r->path << " " << *in << dendl; + + /* + * If the the CInode was just created by using openc in current + * auth MDS, but the client just sends a getattr request to another + * replica MDS. Then here it will make a path of '#INODE-NUMBER' + * only because the CInode hasn't been linked yet, and the replica + * MDS will keep retrying until the auth MDS flushes the mdlog and + * the C_MDS_openc_finish and link_primary_inode are called at most + * 5 seconds later. + */ + if (!in->get_parent_dn() && in->is_auth()) { + mds->mdlog->flush(); + } } mds->send_message_mds(r, mds_rank_t(m->get_source().num())); } -- 2.39.5