]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
MDS: make use of the hooks to start standby-replay.
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 3 Dec 2010 00:36:22 +0000 (16:36 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Thu, 6 Jan 2011 19:12:09 +0000 (11:12 -0800)
This doesn't include trim, and there's no way to exit the replay!

Signed-off-by: Greg Farnum <gregf@hq.newdream.net>
src/cmds.cc
src/mds/MDS.cc
src/mds/MDS.h

index a0696308e85b9942f699b3a825ae2387ac15c7d1..347b7576d065681056d155c7ac507d8ab514ad3b 100644 (file)
@@ -38,7 +38,7 @@ using namespace std;
 
 void usage()
 {
-  cerr << "usage: cmds -i name [flags] [--mds rank] [--journal_check]\n";
+  cerr << "usage: cmds -i name [flags] [--mds rank] [[--journal_check]|[--hot-standby]]\n";
   cerr << "  -m monitorip:port\n";
   cerr << "        connect to monitor at given address\n";
   cerr << "  --debug_mds n\n";
@@ -53,7 +53,7 @@ int main(int argc, const char **argv)
   env_to_vec(args);
   bool dump_journal = false;
   const char *dump_file = NULL;
-  bool shadow = false;
+  int shadow = 0;
 
   common_set_defaults(true);
 #ifdef HAVE_LIBTCMALLOC
@@ -78,7 +78,18 @@ int main(int argc, const char **argv)
       dout(0) << "dumping journal" << dendl;
     } else if (!strcmp(args[i], "--journal_check")) {
       dout(0) << "checking journal"  << dendl;
-      shadow = true;
+      if (shadow) {
+        dout(0) << "Error: can only select one standby state" << dendl;
+        return -1;
+      }
+      shadow = MDSMap::STATE_ONESHOT_REPLAY;
+    } else if (!strcmp(args[i], "--hot-standby")) {
+      dout(0) << "going into standby_replay" << dendl;
+      if (shadow) {
+        dout(0) << "Error: can only select one standby state" << dendl;
+        return -1;
+      }
+      shadow = MDSMap::STATE_STANDBY_REPLAY;
     } else {
       cerr << "unrecognized arg " << args[i] << std::endl;
       usage();
@@ -137,7 +148,7 @@ int main(int argc, const char **argv)
     mds->orig_argv = argv;
 
     if (shadow)
-      mds->init(MDSMap::STATE_STANDBY);
+      mds->init(shadow);
     else
       mds->init();
 
index 8968c5e24ff16ffe3e75df34d92fc34750184996..f408b9593bf6afc5821f788081ba338bb3f476bc 100644 (file)
@@ -82,6 +82,7 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) :
   name(n),
   whoami(-1), incarnation(0),
   standby_for_rank(-1),
+  standby_type(0),
   messenger(m),
   monc(mc),
   logclient(messenger, &mc->monmap, mc),
@@ -457,8 +458,12 @@ int MDS::init(int wanted_state)
 
   // starting beacon.  this will induce an MDSMap from the monitor
   want_state = wanted_state;
-  if (wanted_state == MDSMap::STATE_STANDBY && g_conf.id)
+  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);
+    want_state = MDSMap::STATE_STANDBY;
+    standby_type = wanted_state;
+  }
   beacon_start();
   whoami = -1;
   messenger->set_myname(entity_name_t::MDS(whoami));
@@ -842,7 +847,7 @@ void MDS::handle_mds_map(MMDSMap *m)
     dout(1) << "handle_mds_map standby" << dendl;
 
     if (standby_for_rank >= 0)
-      request_state(MDSMap::STATE_ONESHOT_REPLAY);
+      request_state(standby_type);
 
     goto out;
   }
index 5f05f185f0c737fb2e91d991b6e61ec9dd7b9c15..9b37105c08891b4a934137953a30008e5847a43a 100644 (file)
@@ -147,6 +147,7 @@ class MDS : public Dispatcher {
   int incarnation;
 
   int standby_for_rank;
+  int standby_type;
   string standby_for_name;
 
   Messenger    *messenger;