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.
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";
env_to_vec(args);
bool dump_journal = false;
const char *dump_file = NULL;
+ bool shadow = false;
common_set_defaults(true);
#ifdef HAVE_LIBTCMALLOC
// 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) {
mds->orig_argc = argc;
mds->orig_argv = argv;
- mds->init();
+ if (shadow)
+ mds->init(MDSMap::STATE_STANDBY);
+ else
+ mds->init();
messenger->wait();
name(n),
whoami(-1), incarnation(0),
standby_for_rank(-1),
- standby_replay_for(-1),
messenger(m),
monc(mc),
logclient(messenger, &mc->monmap, mc),
}
}
-int MDS::init()
+int MDS::init(int wanted_state)
{
dout(10) << sizeof(MDSCacheObject) << "\tMDSCacheObject" << dendl;
dout(10) << sizeof(CInode) << "\tCInode" << dendl;
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));
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;
}
// ??
- assert(whoami >= 0);
incarnation = mdsmap->get_inc(whoami);
if (oldwhoami != whoami)
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();
int standby_for_rank;
string standby_for_name;
- int standby_replay_for;
Messenger *messenger;
MonClient *monc;
void send_message(Message *m, Connection *c);
// start up, shutdown
- int init();
+ int init(int wanted_state=MDSMap::STATE_BOOT);
void open_logger();
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;
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);
} else {
info.state = state;
info.state_seq = seq;
+ if (state == MDSMap::STATE_STANDBY_REPLAY)
+ info.rank = m->get_standby_for_rank();
}
}