]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: properly open parents of snaprealm
authorYan, Zheng <zyan@redhat.com>
Tue, 19 May 2015 06:12:10 +0000 (14:12 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 1 Jun 2015 06:02:48 +0000 (14:02 +0800)
make sure snaprealm's parents are opened before building
cached_snaps/cached_snap_context/cached_snap_trace

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/MDCache.cc
src/mds/Server.cc
src/mds/SnapRealm.cc

index 809144a2e8d394debda58e652afdac92dd1e9391..3a1a1882aac61896497dbd666386bd755aeb9166 100644 (file)
@@ -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);
index 12de267e9e2c0354b7326b1e6944f593c378daa5..09eda66fb1c3e9cf42d6aca1dd9a29732a3ee19a 100644 (file)
@@ -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)) {
index 60d417514e4c711a62a550e2c3e8131bbf4f943e..35a0f757a14f5613868edaefe895466b062c74d5 100644 (file)
@@ -225,6 +225,7 @@ void SnapRealm::build_snap_set(set<snapid_t> &s,
 
 void SnapRealm::check_cache()
 {
+  assert(open);
   if (cached_seq >= srnode.seq)
     return;