]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix incorrect "unconnected snaprealm xxx" warning
authorYan, Zheng <zyan@redhat.com>
Mon, 11 Jul 2016 02:51:13 +0000 (10:51 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 20 Jul 2016 02:38:40 +0000 (10:38 +0800)
If a snaprealm has no child/parent snaprelam, and the snaprealm inode
is not in the cache while client reconnects. The snaprealm does not
get properly removed from MDCache::reconnected_snaplrealm. This causes
incorrect "unconnected snaprealm xxx" warning

Signed-off-by: Yan, Zheng <zyan@redhat.com>
(cherry picked from commit 85e687de876ca7e0174734ba81130949c4ab6a40)

src/mds/MDCache.cc
src/mds/MDCache.h

index fe59bea2e49ca68a82463856edde256bad268456..f4e122505f2124b161611a340068db775d8777b7 100644 (file)
@@ -5349,12 +5349,21 @@ bool MDCache::process_imported_caps()
   return false;
 }
 
-void MDCache::check_realm_past_parents(SnapRealm *realm)
+void MDCache::check_realm_past_parents(SnapRealm *realm, bool reconnect)
 {
   // are this realm's parents fully open?
   if (realm->have_past_parents_open()) {
     dout(10) << " have past snap parents for realm " << *realm 
             << " on " << *realm->inode << dendl;
+    if (reconnect) {
+      // finish off client snaprealm reconnects?
+      auto p = reconnected_snaprealms.find(realm->inode->ino());
+      if (p != reconnected_snaprealms.end()) {
+       for (auto q = p->second.begin(); q != p->second.end(); ++q)
+         finish_snaprealm_reconnect(q->first, realm, q->second);
+       reconnected_snaprealms.erase(p);
+      }
+    }
   } else {
     if (!missing_snap_parents.count(realm->inode)) {
       dout(10) << " MISSING past snap parents for realm " << *realm
@@ -5436,7 +5445,7 @@ void MDCache::choose_lock_states_and_reconnect_caps()
 
     SnapRealm *realm = in->find_snaprealm();
 
-    check_realm_past_parents(realm);
+    check_realm_past_parents(realm, realm == in->snaprealm);
 
     if (p != reconnected_caps.end()) {
       bool missing_snap_parent = false;
@@ -6119,10 +6128,6 @@ void MDCache::identify_files_to_recover()
       in->auth_pin(&in->filelock);
       in->filelock.set_state(LOCK_PRE_SCAN);
       rejoin_recover_q.push_back(in);
-
-      // make sure past parents are open/get opened
-      SnapRealm *realm = in->find_snaprealm();
-      check_realm_past_parents(realm);
     } else {
       rejoin_check_q.push_back(in);
     }
index 54e8c4199af2d256c0d5845ea993c6e530a5ee82..c93b7f4c4ff0fc107f7d4c5733e07491452c2dfd 100644 (file)
@@ -606,7 +606,7 @@ public:
   void do_delayed_cap_imports();
   void rebuild_need_snapflush(CInode *head_in, SnapRealm *realm, client_t client,
                              snapid_t snap_follows);
-  void check_realm_past_parents(SnapRealm *realm);
+  void check_realm_past_parents(SnapRealm *realm, bool reconnect);
   void open_snap_parents();
 
   bool open_undef_inodes_dirfrags();