]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: respawn (instead of suicide) on being marked down
authorSage Weil <sage@newdream.net>
Thu, 7 Oct 2010 14:52:50 +0000 (07:52 -0700)
committerSage Weil <sage@newdream.net>
Thu, 7 Oct 2010 14:52:50 +0000 (07:52 -0700)
This makes temporarily laggy daemons will restart and rejoin the cluster
in standby mode.

Signed-off-by: Sage Weil <sage@newdream.net>
src/cmds.cc
src/mds/MDS.cc
src/mds/MDS.h

index 549790d513c4d25f70c797f0158662baf287da66..e4e8375bad4907676641d214d703b12d5da2b9b6 100644 (file)
@@ -107,6 +107,11 @@ int main(int argc, const char **argv)
   
   // start mds
   MDS *mds = new MDS(g_conf.id, messenger, &mc);
+
+  // in case we have to respawn...
+  mds->orig_argc = argc;
+  mds->orig_argv = argv;
+
   mds->init();
   
   messenger->wait();
index 49969668d589495313c69656b2b9d45c44d38315..41d893a72e4298fcc42f96e2b127f443e4723aeb 100644 (file)
@@ -87,6 +87,9 @@ MDS::MDS(const char *n, Messenger *m, MonClient *mc) :
   logclient(messenger, &mc->monmap, mc),
   sessionmap(this) {
 
+  orig_argc = 0;
+  orig_argv = NULL;
+
   last_tid = 0;
 
   monc->set_messenger(messenger);
@@ -814,8 +817,8 @@ void MDS::handle_mds_map(MMDSMap *m)
       dout(10) << "not in map yet" << dendl;
     } else {
       dout(1) << "handle_mds_map i (" << addr
-             << ") dne in the mdsmap, killing myself" << dendl;
-      suicide();
+             << ") dne in the mdsmap, respawning myself" << dendl;
+      respawn();
     }
     goto out;
   }
@@ -1344,6 +1347,25 @@ void MDS::suicide()
   monc->shutdown();
 }
 
+void MDS::respawn()
+{
+  dout(1) << "respawn" << dendl;
+
+  char *new_argv[orig_argc+1];
+  dout(1) << " e: '" << orig_argv[0] << "'" << dendl;
+  for (int i=0; i<orig_argc; i++) {
+    new_argv[i] = (char *)orig_argv[i];
+    dout(1) << " " << i << ": '" << orig_argv[i] << "'" << dendl;
+  }
+  new_argv[orig_argc] = NULL;
+
+  dout(1) << " cwd " << get_current_dir_name() << dendl;
+
+  execv(orig_argv[0], new_argv);
+
+  dout(0) << "respawn execv " << orig_argv[0] << " failed with " << strerror(errno) << dendl;
+  suicide();
+}
 
 
 
index a8b0e70d73c8fd69b8b9e598c79f9d66932177d6..eb34c88752bd68536f8c34d2f3f7d1a451dc09e5 100644 (file)
@@ -178,6 +178,8 @@ class MDS : public Dispatcher {
 
   Logger       *logger, *mlogger;
 
+  int orig_argc;
+  const char **orig_argv;
 
  protected:
   // -- MDS state --
@@ -364,7 +366,9 @@ class MDS : public Dispatcher {
   void active_start();
   void stopping_start();
   void stopping_done();
+
   void suicide();
+  void respawn();
 
   void tick();