]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Adjust replay state changes and options parsing.
authorGreg Farnum <gregory.farnum@dreamhost.com>
Wed, 19 Jan 2011 23:59:46 +0000 (15:59 -0800)
committerGreg Farnum <gregory.farnum@dreamhost.com>
Mon, 24 Jan 2011 18:57:30 +0000 (10:57 -0800)
The MDS used to interpret g_conf.id as a rank. It no longer does
so and requires that standby ranks/names be set via the g_conf options,
or else along with the replay command in the CLI. Remove the MDS versions
of standby_for_[rank|name] and just use the ones in g_conf for simplicity.

However, the MDS only looks at the rank when switching to standby;
making names usable will require an update to the MDSMonitor code to
plug in ranks from names.

Signed-off-by: Greg Farnum <gregory.farnum@dreamhost.com>
src/cmds.cc
src/mds/MDS.cc

index abe417e54fa2a7bb15441dc8af1a43c342e1fc1e..8bed0f7d5af027f76368d1a9707d0684ba23d206 100644 (file)
@@ -38,7 +38,7 @@ using namespace std;
 
 void usage()
 {
-  derr << "usage: cmds -i name [flags] [--mds rank] [[--journal_check]|[--hot-standby]]\n"
+  derr << "usage: cmds -i name [flags] [--mds rank] [[--journal_check]|[--hot-standby][rank]]\n"
        << "  -m monitorip:port\n"
        << "        connect to monitor at given address\n"
        << "  --debug_mds n\n"
@@ -83,6 +83,18 @@ int main(int argc, const char **argv)
         return -1;
       }
       shadow = MDSMap::STATE_ONESHOT_REPLAY;
+      char *endpoint = NULL;
+      int check_rank = strtol(args[i+1], &endpoint, 0);
+      if (*endpoint) {
+        if(g_conf.mds_standby_for_rank == -1 &&
+          !g_conf.mds_standby_for_name) {
+          dout(0) << "Error: no rank specified for journal replay!" << dendl;
+          return -1;
+        }
+      } else { // we got a rank from command line
+        g_conf.mds_standby_for_rank = check_rank;
+        ++i;
+      }
     } else if (!strcmp(args[i], "--hot-standby")) {
       dout(0) << "going into standby_replay" << dendl;
       if (shadow) {
@@ -90,6 +102,17 @@ int main(int argc, const char **argv)
         return -1;
       }
       shadow = MDSMap::STATE_STANDBY_REPLAY;
+      char *endpoint = NULL;
+      int check_rank = strtol(args[i+1], &endpoint, 0);
+      if (*endpoint) {
+        if(g_conf.mds_standby_for_rank == -1 &&
+          !g_conf.mds_standby_for_name) {
+          dout(0) << "no rank specified for standby, entering pool!" << dendl;
+        }
+      } else { // we got a rank from command line
+        g_conf.mds_standby_for_rank = check_rank;
+        ++i;
+      }
     } else {
       derr << "unrecognized arg " << args[i] << dendl;
       usage();
index 21d7ff74d2b8813540909a466da6438837a633d4..93c1d48d473f2a40706b0946ff6baed188615975 100644 (file)
@@ -81,7 +81,6 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) :
   timer(mds_lock),
   name(n),
   whoami(-1), incarnation(0),
-  standby_for_rank(-1),
   standby_type(0),
   continue_replay(false),
   messenger(m),
@@ -459,14 +458,24 @@ int MDS::init(int wanted_state)
 
   timer.init();
 
+  if (wanted_state==MDSMap::STATE_BOOT && g_conf.mds_standby_replay)
+    wanted_state = MDSMap::STATE_STANDBY_REPLAY;
   // starting beacon.  this will induce an MDSMap from the monitor
   want_state = wanted_state;
-  if (g_conf.id && (wanted_state==MDSMap::STATE_STANDBY_REPLAY ||
-                    wanted_state==MDSMap::STATE_ONESHOT_REPLAY)) {
-    standby_for_rank = strtol(g_conf.id, NULL, 0);
+  if (wanted_state==MDSMap::STATE_STANDBY_REPLAY ||
+      wanted_state==MDSMap::STATE_ONESHOT_REPLAY) {
+    g_conf.mds_standby_replay = true;
+    if ( wanted_state == MDSMap::STATE_ONESHOT_REPLAY &&
+        (g_conf.mds_standby_for_rank == -1) &&
+        !g_conf.mds_standby_for_name) {
+      // uh-oh, must specify one or the other!
+      dout(0) << "Specified oneshot replay mode but not an MDS!" << dendl;
+      suicide();
+    }
     want_state = MDSMap::STATE_STANDBY;
     standby_type = wanted_state;
   }
+
   beacon_start();
   whoami = -1;
   messenger->set_myname(entity_name_t::MDS(whoami));
@@ -584,8 +593,8 @@ void MDS::beacon_send()
   
   MMDSBeacon *beacon = new MMDSBeacon(monc->get_fsid(), monc->get_global_id(), name, mdsmap->get_epoch(), 
                                      want_state, beacon_last_seq);
-  beacon->set_standby_for_rank(standby_for_rank);
-  beacon->set_standby_for_name(standby_for_name);
+  beacon->set_standby_for_rank(g_conf.mds_standby_for_rank);
+  beacon->set_standby_for_name(g_conf.mds_standby_for_name);
 
   // include _my_ feature set
   beacon->set_compat(mdsmap_compat);
@@ -839,7 +848,7 @@ void MDS::handle_mds_map(MMDSMap *m)
     want_state = state = MDSMap::STATE_STANDBY;
     dout(1) << "handle_mds_map standby" << dendl;
 
-    if (standby_for_rank >= 0)
+    if (standby_type) // we want to be in standby_replay or oneshot_replay!
       request_state(standby_type);
 
     goto out;
@@ -898,7 +907,6 @@ void MDS::handle_mds_map(MMDSMap *m)
     if (oldstate == MDSMap::STATE_STANDBY_REPLAY) {
         dout(10) << "Monitor activated us! Deactivating replay loop" << dendl;
         assert (state == MDSMap::STATE_REPLAY);
-        standby_for_rank = -1;
     } else {
       // did i just recover?
       if ((is_active() || is_clientreplay()) &&
@@ -1202,6 +1210,8 @@ void MDS::replay_start()
   if (is_standby_replay())
     continue_replay = true;
   
+  standby_type = 0;
+
   calc_recovery_set();
 
   dout(1) << " need osdmap epoch " << mdsmap->get_last_failure_osd_epoch()