]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: avoid sending duplicated discovers during recovery 1182/head
authorYan, Zheng <zheng.z.yan@intel.com>
Fri, 10 Jan 2014 01:55:50 +0000 (09:55 +0800)
committerYan, Zheng <zheng.z.yan@intel.com>
Tue, 4 Feb 2014 13:43:42 +0000 (21:43 +0800)
If MDS just entered the rejoin state, it should not kick discovers
because the discovers were just sent. Similarly, if MDS just entered
the clientreplay state, it should not call MDS::handle_mds_recovery()
because MDS::recovery_done() has already recovered the table server.

Also make MDCache::handle_mds_recovery() not wake the discover waiters
up. Because the MDCache::kick_discovers re-sends the discovers, their
replies will wake the discover waiter up.

Signed-off-by: Yan, Zheng <zheng.z.yan@intel.com>
src/mds/MDCache.cc
src/mds/MDS.cc

index eb20c06085a0c8603bac1e6a3d80dc717b6f427d..167a85e75f8e18e4c6dd9076e8777c655599b411 100644 (file)
@@ -2777,6 +2777,10 @@ void MDCache::handle_mds_recovery(int who)
 {
   dout(7) << "handle_mds_recovery mds." << who << dendl;
 
+  // exclude all discover waiters. kick_discovers() will do the job
+  static const uint64_t i_mask = CInode::WAIT_ANY_MASK & ~CInode::WAIT_DIR;
+  static const uint64_t d_mask = CDir::WAIT_ANY_MASK & ~CDir::WAIT_DENTRY;
+
   list<Context*> waiters;
 
   // wake up any waiters in their subtrees
@@ -2797,7 +2801,7 @@ void MDCache::handle_mds_recovery(int who)
     while (!q.empty()) {
       CDir *d = q.front();
       q.pop_front();
-      d->take_waiting(CDir::WAIT_ANY_MASK, waiters);
+      d->take_waiting(d_mask, waiters);
 
       // inode waiters too
       for (CDir::map_t::iterator p = d->items.begin();
@@ -2806,7 +2810,7 @@ void MDCache::handle_mds_recovery(int who)
        CDentry *dn = p->second;
        CDentry::linkage_t *dnl = dn->get_linkage();
        if (dnl->is_primary()) {
-         dnl->get_inode()->take_waiting(CInode::WAIT_ANY_MASK, waiters);
+         dnl->get_inode()->take_waiting(i_mask, waiters);
          
          // recurse?
          list<CDir*> ls;
@@ -9904,8 +9908,11 @@ void MDCache::kick_discovers(int who)
 {
   for (map<tid_t,discover_info_t>::iterator p = discovers.begin();
        p != discovers.end();
-       ++p)
+       ++p) {
+    if (p->second.mds != who)
+      continue;
     _send_discover(p->second);
+  }
 }
 
 
index b8ae455a60d02a29798902e78e519a3165319c18..a2e7228cbcdae46146a874139daa3937824f6a70 100644 (file)
@@ -1037,28 +1037,31 @@ void MDS::handle_mds_map(MMDSMap *m)
     if (g_conf->mds_dump_cache_after_rejoin &&
        oldmap->is_rejoining() && !mdsmap->is_rejoining()) 
       mdcache->dump_cache();      // for DEBUG only
-  
-    // ACTIVE|CLIENTREPLAY|REJOIN => we can discover from them.
-    set<int> olddis, dis;
-    oldmap->get_mds_set(olddis, MDSMap::STATE_ACTIVE);
-    oldmap->get_mds_set(olddis, MDSMap::STATE_CLIENTREPLAY);
-    oldmap->get_mds_set(olddis, MDSMap::STATE_REJOIN);
-    mdsmap->get_mds_set(dis, MDSMap::STATE_ACTIVE);
-    mdsmap->get_mds_set(dis, MDSMap::STATE_CLIENTREPLAY);
-    mdsmap->get_mds_set(dis, MDSMap::STATE_REJOIN);
-    for (set<int>::iterator p = dis.begin(); p != dis.end(); ++p) 
-      if (*p != whoami &&            // not me
-         olddis.count(*p) == 0) {  // newly so?
-       mdcache->kick_discovers(*p);
-       mdcache->kick_open_ino_peers(*p);
-      }
+
+    if (oldstate >= MDSMap::STATE_REJOIN) {
+      // ACTIVE|CLIENTREPLAY|REJOIN => we can discover from them.
+      set<int> olddis, dis;
+      oldmap->get_mds_set(olddis, MDSMap::STATE_ACTIVE);
+      oldmap->get_mds_set(olddis, MDSMap::STATE_CLIENTREPLAY);
+      oldmap->get_mds_set(olddis, MDSMap::STATE_REJOIN);
+      mdsmap->get_mds_set(dis, MDSMap::STATE_ACTIVE);
+      mdsmap->get_mds_set(dis, MDSMap::STATE_CLIENTREPLAY);
+      mdsmap->get_mds_set(dis, MDSMap::STATE_REJOIN);
+      for (set<int>::iterator p = dis.begin(); p != dis.end(); ++p)
+       if (*p != whoami &&            // not me
+           olddis.count(*p) == 0) {  // newly so?
+         mdcache->kick_discovers(*p);
+         mdcache->kick_open_ino_peers(*p);
+       }
+    }
   }
 
   if (oldmap->is_degraded() && !mdsmap->is_degraded() && state >= MDSMap::STATE_ACTIVE)
     dout(1) << "cluster recovered." << dendl;
 
   // did someone go active?
-  if (is_clientreplay() || is_active() || is_stopping()) {
+  if (oldstate >= MDSMap::STATE_CLIENTREPLAY &&
+      (is_clientreplay() || is_active() || is_stopping())) {
     set<int> oldactive, active;
     oldmap->get_mds_set(oldactive, MDSMap::STATE_ACTIVE);
     oldmap->get_mds_set(oldactive, MDSMap::STATE_CLIENTREPLAY);