]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: trigger tableserver active/recovery hook even for self
authorSage Weil <sage@inktank.com>
Tue, 2 Apr 2013 15:58:35 +0000 (08:58 -0700)
committerSage Weil <sage@inktank.com>
Tue, 2 Apr 2013 15:58:35 +0000 (08:58 -0700)
The tableserver now sends a READY message to clients when they go active;
we need to do this even for our own local tableclients, or else they do
not initialize and hang on first use after bringing up a fresh cluster.

Signed-off-by: Sage Weil <sage@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
src/mds/MDS.cc

index 99b14d963ea912d091e49f4d4833985b28600eb3..43618b8f1db864f0de7e37fc8ff2672e688c2c20 100644 (file)
@@ -1036,8 +1036,7 @@ void MDS::handle_mds_map(MMDSMap *m)
     mdsmap->get_mds_set(active, MDSMap::STATE_ACTIVE);
     mdsmap->get_mds_set(active, MDSMap::STATE_CLIENTREPLAY);
     for (set<int>::iterator p = active.begin(); p != active.end(); ++p) 
-      if (*p != whoami &&            // not me
-         oldactive.count(*p) == 0)  // newly so?
+      if (oldactive.count(*p) == 0)  // newly so?
        handle_mds_recovery(*p);
   }
 
@@ -1533,19 +1532,26 @@ void MDS::recovery_done()
   mdcache->populate_mydir();
 }
 
+// NOTE: called when any mds becomes active (even after creation)
 void MDS::handle_mds_recovery(int who) 
 {
   dout(5) << "handle_mds_recovery mds." << who << dendl;
   
-  mdcache->handle_mds_recovery(who);
+  if (who != whoami) {
+    mdcache->handle_mds_recovery(who);
+  }
 
+  // NOTE: trigger this even for self, so that we nudge the
+  // client side.
   if (mdsmap->get_tableserver() == whoami) {
     anchorserver->handle_mds_recovery(who);
     snapserver->handle_mds_recovery(who);
   }
 
-  queue_waiters(waiting_for_active_peer[who]);
-  waiting_for_active_peer.erase(who);
+  if (who != whoami) {
+    queue_waiters(waiting_for_active_peer[who]);
+    waiting_for_active_peer.erase(who);
+  }
 }
 
 void MDS::handle_mds_failure(int who)