]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: always reply mdsbeacon 5199/head
authorKefu Chai <kchai@redhat.com>
Fri, 15 May 2015 14:50:36 +0000 (22:50 +0800)
committerNathan Cutler <ncutler@suse.com>
Fri, 10 Jul 2015 20:16:42 +0000 (22:16 +0200)
the MDS (Beacon) is always expecting the reply for the mdsbeacon messages from
the lead mon, and it uses the delay as a metric for the laggy-ness of the
Beacon. when it comes to the MDSMonitor on a peon, it will remove the route
session at seeing a reply (route message) from leader, so a reply to
mdsbeacon will stop the peon from resending the mdsbeacon request to the
leader.

if the MDSMonitor re-forwards the unreplied requests after they are
outdated, there are chances that the requests reflecting old and even wrong
state of the MDSs mislead the lead monitor. for example, the MDSs which sent
the outdated messages could be dead.

Fixes: #11590
Signed-off-by: Kefu Chai <kchai@redhat.com>
(cherry picked from commit b3555e9c328633c9e1fbc27d652c004b30535e5b)

src/mon/MDSMonitor.cc

index 0ef219da06e37a4b9d392de8a5299f5929729bbe..b05b8e8e322258387bf9eeb0c233aaf4ed216399 100644 (file)
@@ -280,7 +280,7 @@ bool MDSMonitor::preprocess_beacon(MMDSBeacon *m)
     goto ignore;
   }
   // is there a state change here?
-  if (info.state != state) {    
+  if (info.state != state) {
     // legal state change?
     if ((info.state == MDSMap::STATE_STANDBY ||
         info.state == MDSMap::STATE_STANDBY_REPLAY ||
@@ -528,8 +528,14 @@ void MDSMonitor::_updated(MMDSBeacon *m)
   if (m->get_state() == MDSMap::STATE_STOPPED) {
     // send the map manually (they're out of the map, so they won't get it automatic)
     mon->send_reply(m, new MMDSMap(mon->monmap->fsid, &mdsmap));
+  } else {
+    mon->send_reply(m, new MMDSBeacon(mon->monmap->fsid,
+                                     m->get_global_id(),
+                                     m->get_name(),
+                                     mdsmap.get_epoch(),
+                                     m->get_state(),
+                                     m->get_seq()));
   }
-
   m->put();
 }