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";
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
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();
mds->orig_argv = argv;
if (shadow)
- mds->init(MDSMap::STATE_STANDBY);
+ mds->init(shadow);
else
mds->init();
name(n),
whoami(-1), incarnation(0),
standby_for_rank(-1),
+ standby_type(0),
messenger(m),
monc(mc),
logclient(messenger, &mc->monmap, mc),
// 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));
dout(1) << "handle_mds_map standby" << dendl;
if (standby_for_rank >= 0)
- request_state(MDSMap::STATE_ONESHOT_REPLAY);
+ request_state(standby_type);
goto out;
}