]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: Enable --journal_check mode.
authorGreg Farnum <gregf@hq.newdream.net>
Wed, 10 Nov 2010 16:11:23 +0000 (08:11 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Wed, 10 Nov 2010 16:14:04 +0000 (08:14 -0800)
This replaces the old --shadow option, which didn't work.
It starts up the MDS daemon, then replays the journal for
another MDS, and then shuts down.

Also minimally modifies the MDSMonitor to enable this
behavior; since it requires shared state.

src/cmds.cc
src/mds/MDS.cc
src/mds/MDS.h
src/mon/MDSMonitor.cc

index fbb4bd8364264be32efd9fe60e3955eea2b46fbd..3fe9e28559c921f60882baec52d260d46e646ec0 100644 (file)
@@ -38,7 +38,7 @@ using namespace std;
 
 void usage()
 {
-  cerr << "usage: cmds -i name [flags] [--mds rank] [--shadow rank]\n";
+  cerr << "usage: cmds -i name [flags] [--mds rank] [--journal_check]\n";
   cerr << "  -m monitorip:port\n";
   cerr << "        connect to monitor at given address\n";
   cerr << "  --debug_mds n\n";
@@ -53,6 +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;
 
   common_set_defaults(true);
 #ifdef HAVE_LIBTCMALLOC
@@ -67,16 +68,20 @@ int main(int argc, const char **argv)
   // mds specific args
   for (unsigned i=0; i<args.size(); i++) {
     if (!strcmp(args[i], "--dump-journal")) {
-      if (i + 2 < args.size()) // another argument?
+      if (i + 1 < args.size() &&
+          (args[i+1][0] != '-')) { // another argument?
         dump_file = args[i+1];
-      else
+        ++i;
+      } else
         dump_file = "mds.journal.dump";
       dump_journal = true;
       dout(0) << "dumping journal" << dendl;
-      ++i;
+    } else if (!strcmp(args[i], "--journal_check")) {
+      dout(0) << "checking journal"  << dendl;
+      shadow = true;
     } else {
-    cerr << "unrecognized arg " << args[i] << std::endl;
-    usage();
+      cerr << "unrecognized arg " << args[i] << std::endl;
+      usage();
     }
   }
   if (!g_conf.id) {
@@ -130,7 +135,10 @@ int main(int argc, const char **argv)
     mds->orig_argc = argc;
     mds->orig_argv = argv;
 
-    mds->init();
+    if (shadow)
+      mds->init(MDSMap::STATE_STANDBY);
+    else
+      mds->init();
 
     messenger->wait();
 
index f155b7edf82a50cdd27f5f2597914456ccf9f6ab..8a15be250d472730de8425402b875160f7272ebf 100644 (file)
@@ -81,7 +81,6 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) :
   name(n),
   whoami(-1), incarnation(0),
   standby_for_rank(-1),
-  standby_replay_for(-1),
   messenger(m),
   monc(mc),
   logclient(messenger, &mc->monmap, mc),
@@ -418,7 +417,7 @@ void MDS::send_message_client(Message *m, Session *session)
   }
 }
 
-int MDS::init()
+int MDS::init(int wanted_state)
 {
   dout(10) << sizeof(MDSCacheObject) << "\tMDSCacheObject" << dendl;
   dout(10) << sizeof(CInode) << "\tCInode" << dendl;
@@ -454,7 +453,9 @@ int MDS::init()
   mds_lock.Lock();
 
   // starting beacon.  this will induce an MDSMap from the monitor
-  want_state = MDSMap::STATE_BOOT;
+  want_state = wanted_state;
+  if (wanted_state == MDSMap::STATE_STANDBY && g_conf.id)
+    standby_for_rank = strtol(g_conf.id, NULL, 0);
   beacon_start();
   whoami = -1;
   messenger->set_myname(entity_name_t::MDS(whoami));
@@ -837,7 +838,7 @@ void MDS::handle_mds_map(MMDSMap *m)
     want_state = state = MDSMap::STATE_STANDBY;
     dout(1) << "handle_mds_map standby" << dendl;
 
-    if (standby_replay_for >= 0)
+    if (standby_for_rank >= 0)
       request_state(MDSMap::STATE_STANDBY_REPLAY);
 
     goto out;
@@ -860,7 +861,6 @@ void MDS::handle_mds_map(MMDSMap *m)
   }
 
   // ??
-  assert(whoami >= 0);
   incarnation = mdsmap->get_inc(whoami);
 
   if (oldwhoami != whoami)
@@ -984,7 +984,8 @@ void MDS::handle_mds_map(MMDSMap *m)
        mdcache->migrator->handle_mds_failure_or_stop(*p);
   }
 
-  balancer->try_rebalance();
+  if (standby_for_rank < 0) //if we're not replaying
+    balancer->try_rebalance();
 
  out:
   m->put();
index eb34c88752bd68536f8c34d2f3f7d1a451dc09e5..787211365b982cfc6b621bdb5f3792ba9d86c507 100644 (file)
@@ -148,7 +148,6 @@ class MDS : public Dispatcher {
 
   int standby_for_rank;
   string standby_for_name;
-  int standby_replay_for;
 
   Messenger    *messenger;
   MonClient    *monc;
@@ -339,7 +338,7 @@ class MDS : public Dispatcher {
   void send_message(Message *m, Connection *c);
 
   // start up, shutdown
-  int init();
+  int init(int wanted_state=MDSMap::STATE_BOOT);
 
   void open_logger();
 
index 70f945c098ff1533755f85b0e308a5e3dd8b6038..4c591da81df91fe16d6e10d4f0006a78caac5dd5 100644 (file)
@@ -206,7 +206,9 @@ bool MDSMonitor::preprocess_beacon(MMDSBeacon *m)
     goto out;
   }
 
-  if (mdsmap.get_epoch() != m->get_last_epoch_seen()) {
+  if (mdsmap.get_epoch() != m->get_last_epoch_seen()
+      && !((info.state == MDSMap::STATE_STANDBY) ||
+          (info.state == MDSMap::STATE_STANDBY_REPLAY))){
     dout(10) << "mds_beacon " << *m
             << " ignoring requested state, because mds hasn't seen latest map" << dendl;
     goto ignore;
@@ -233,8 +235,10 @@ bool MDSMonitor::preprocess_beacon(MMDSBeacon *m)
     if (info.state == MDSMap::STATE_STANDBY &&
        state == MDSMap::STATE_STANDBY_REPLAY &&
        (pending_mdsmap.is_degraded() ||
-        pending_mdsmap.get_state(info.rank) < MDSMap::STATE_ACTIVE)) {
-      dout(10) << "mds_beacon can't standby-replay mds" << info.rank << " at this time (cluster degraded, or mds not active)" << dendl;
+        pending_mdsmap.get_state(m->get_standby_for_rank()) < MDSMap::STATE_ACTIVE)) {
+      dout(10) << "mds_beacon can't standby-replay mds" << m->get_standby_for_rank() << " at this time (cluster degraded, or mds not active)" << dendl;
+      dout(10) << "pending_mdsmap.is_degraded()==" << pending_mdsmap.is_degraded()
+          << " rank state: " << ceph_mds_state_name(pending_mdsmap.get_state(m->get_standby_for_rank())) << dendl;
       goto ignore;
     }
     _note_beacon(m);
@@ -363,6 +367,8 @@ bool MDSMonitor::prepare_beacon(MMDSBeacon *m)
     } else {
       info.state = state;
       info.state_seq = seq;
+      if (state == MDSMap::STATE_STANDBY_REPLAY)
+        info.rank = m->get_standby_for_rank();
     }
   }