From: Greg Farnum Date: Wed, 19 Jan 2011 23:59:46 +0000 (-0800) Subject: mds: Adjust replay state changes and options parsing. X-Git-Tag: v0.25~251^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=54bdac7041878fd1b1c93e8bbd41b56069802d2b;p=ceph.git mds: Adjust replay state changes and options parsing. 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 --- diff --git a/src/cmds.cc b/src/cmds.cc index abe417e54fa2..8bed0f7d5af0 100644 --- a/src/cmds.cc +++ b/src/cmds.cc @@ -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(); diff --git a/src/mds/MDS.cc b/src/mds/MDS.cc index 21d7ff74d2b8..93c1d48d473f 100644 --- a/src/mds/MDS.cc +++ b/src/mds/MDS.cc @@ -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()