From 7dcbfb81f5f3bb0fe4acddf711f2cfdb4b38e1da Mon Sep 17 00:00:00 2001 From: Greg Farnum Date: Thu, 2 Dec 2010 16:36:22 -0800 Subject: [PATCH] MDS: make use of the hooks to start standby-replay. This doesn't include trim, and there's no way to exit the replay! Signed-off-by: Greg Farnum --- src/cmds.cc | 19 +++++++++++++++---- src/mds/MDS.cc | 9 +++++++-- src/mds/MDS.h | 1 + 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/cmds.cc b/src/cmds.cc index a0696308e85b9..347b7576d0656 100644 --- a/src/cmds.cc +++ b/src/cmds.cc @@ -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(); diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 8968c5e24ff16..f408b9593bf6a 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -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; } diff --git a/src/mds/MDS.h b/src/mds/MDS.h index 5f05f185f0c73..9b37105c08891 100644 --- a/src/mds/MDS.h +++ b/src/mds/MDS.h @@ -147,6 +147,7 @@ class MDS : public Dispatcher { int incarnation; int standby_for_rank; + int standby_type; string standby_for_name; Messenger *messenger; -- 2.39.5