From 6ed6a68e62683aee1ae979bf3b1db7e599040a69 Mon Sep 17 00:00:00 2001 From: "Yan, Zheng" Date: Tue, 19 May 2015 14:12:10 +0800 Subject: [PATCH] mds: properly open parents of snaprealm make sure snaprealm's parents are opened before building cached_snaps/cached_snap_context/cached_snap_trace Signed-off-by: Yan, Zheng --- src/mds/MDCache.cc | 21 +++++++++++++-------- src/mds/Server.cc | 5 +++++ src/mds/SnapRealm.cc | 1 + 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 809144a2e8d39..3a1a1882aac61 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -7627,6 +7627,12 @@ int MDCache::path_traverse(MDRequestRef& mdr, Message *req, MDSInternalContextBa if (cur->state_test(CInode::STATE_PURGING)) return -ESTALE; + // make sure snaprealm are open... + if (mdr && cur->snaprealm && !cur->snaprealm->open && + !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) { + return 1; + } + // start trace if (pdnvec) pdnvec->clear(); @@ -7707,13 +7713,6 @@ int MDCache::path_traverse(MDRequestRef& mdr, Message *req, MDSInternalContextBa } */ - // make sure snaprealm parents are open... - if (cur->snaprealm && !cur->snaprealm->open && mdr && - !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) { - return 1; - } - - // dentry CDentry *dn = curdir->lookup(path[depth], snapid); CDentry::linkage_t *dnl = dn ? dn->get_projected_linkage() : 0; @@ -7780,8 +7779,14 @@ int MDCache::path_traverse(MDRequestRef& mdr, Message *req, MDSInternalContextBa } } - // add to trace, continue. cur = in; + // make sure snaprealm are open... + if (mdr && cur->snaprealm && !cur->snaprealm->open && + !cur->snaprealm->open_parents(_get_waiter(mdr, req, fin))) { + return 1; + } + + // add to trace, continue. touch_inode(cur); if (pdnvec) pdnvec->push_back(dn); diff --git a/src/mds/Server.cc b/src/mds/Server.cc index 12de267e9e2c0..09eda66fb1c3e 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -2687,6 +2687,11 @@ void Server::handle_client_lookup_ino(MDRequestRef& mdr, return; } + if (mdr && in->snaprealm && + !in->snaprealm->open_parents(new C_MDS_RetryRequest(mdcache, mdr))) { + return; + } + CDentry *dn = in->get_projected_parent_dn(); CInode *diri = dn ? dn->get_dir()->inode : NULL; if (dn && (want_parent || want_dentry)) { diff --git a/src/mds/SnapRealm.cc b/src/mds/SnapRealm.cc index 60d417514e4c7..35a0f757a14f5 100644 --- a/src/mds/SnapRealm.cc +++ b/src/mds/SnapRealm.cc @@ -225,6 +225,7 @@ void SnapRealm::build_snap_set(set &s, void SnapRealm::check_cache() { + assert(open); if (cached_seq >= srnode.seq) return; -- 2.39.5