41
cerr << "usage: cmds -i name [flags] [--mds rank] [--journal_check]\n";
42
cerr << " -m monitorip:port\n";
43
cerr << " connect to monitor at given address\n";
44
cerr << " --debug_mds n\n";
45
cerr << " debug MDS level (e.g. 10)\n";
43
derr << "usage: cmds -i name [flags] [[--journal_check rank]|[--hot-standby][rank]]\n"
44
<< " -m monitorip:port\n"
45
<< " connect to monitor at given address\n"
47
<< " debug MDS level (e.g. 10)\n"
48
<< " --dump-journal rank filename\n"
49
<< " dump the MDS journal for rank. Defaults to mds.journal.dump\n"
50
<< " --journal-check rank\n"
51
<< " replay the journal for rank, then exit\n"
52
<< " --hot-standby rank\n"
53
<< " stat up as a hot standby for rank\n"
54
<< " --reset-journal rank\n"
55
<< " discard the MDS journal for rank, and replace it with a single\n"
56
<< " event that updates/resets inotable and sessionmap on replay.\n"
46
58
generic_server_usage();
49
61
int main(int argc, const char **argv)
63
DEFINE_CONF_VARS(usage);
51
64
vector<const char*> args;
52
65
argv_to_vec(argc, argv, args);
54
bool dump_journal = false;
68
common_init(args, CEPH_ENTITY_TYPE_MDS, CODE_ENVIRONMENT_DAEMON, 0);
69
keyring_init(&g_conf);
73
int dump_journal = -1;
55
74
const char *dump_file = NULL;
58
common_set_defaults(true);
59
#ifdef HAVE_LIBTCMALLOC
60
g_conf.profiler_start = HeapProfilerStart;
61
g_conf.profiler_running = IsHeapProfilerRunning;
62
g_conf.profiler_stop = HeapProfilerStop;
63
g_conf.profiler_dump = HeapProfilerDump;
64
g_conf.tcmalloc_have = true;
65
#endif //HAVE_LIBTCMALLOC
66
common_init(args, "mds", true);
69
for (unsigned i=0; i<args.size(); i++) {
70
if (!strcmp(args[i], "--dump-journal")) {
71
if (i + 1 < args.size() &&
72
(args[i+1][0] != '-')) { // another argument?
73
dump_file = args[i+1];
76
dump_file = "mds.journal.dump";
78
dout(0) << "dumping journal" << dendl;
79
} else if (!strcmp(args[i], "--journal_check")) {
80
dout(0) << "checking journal" << dendl;
75
int reset_journal = -1;
77
if (CEPH_ARGPARSE_EQ("dump-journal", '\0')) {
78
CEPH_ARGPARSE_SET_ARG_VAL(&dump_journal, OPT_INT);
79
CEPH_ARGPARSE_SET_ARG_VAL(&dump_file, OPT_STR);
80
dout(0) << "dumping journal for mds" << dump_journal << " to " << dump_file << dendl;
81
} else if (CEPH_ARGPARSE_EQ("reset-journal", '\0')) {
82
CEPH_ARGPARSE_SET_ARG_VAL(&reset_journal, OPT_INT);
83
} else if (CEPH_ARGPARSE_EQ("journal-check", '\0')) {
85
CEPH_ARGPARSE_SET_ARG_VAL(&check_rank, OPT_INT);
88
dout(0) << "Error: can only select one standby state" << dendl;
91
dout(0) << "requesting oneshot_replay for mds" << check_rank << dendl;
92
shadow = MDSMap::STATE_ONESHOT_REPLAY;
93
g_conf.mds_standby_for_rank = check_rank;
95
} else if (CEPH_ARGPARSE_EQ("hot-standby", '\0')) {
97
CEPH_ARGPARSE_SET_ARG_VAL(&check_rank, OPT_INT);
99
dout(0) << "Error: can only select one standby state" << dendl;
102
dout(0) << "requesting standby_replay for mds" << check_rank << dendl;
103
shadow = MDSMap::STATE_STANDBY_REPLAY;
104
g_conf.mds_standby_for_rank = check_rank;
83
cerr << "unrecognized arg " << args[i] << std::endl;
106
derr << "unrecognized arg " << args[i] << dendl;
88
cerr << "must specify '-i name' with the cmds instance name" << std::endl;
110
if (g_conf.name.has_default_id() && dump_journal < 0 && reset_journal < 0) {
111
derr << "must specify '-i name' with the cmds instance name" << dendl;
92
if (g_conf.clock_tare) g_clock.tare();
95
116
RotatingKeyRing rkeys(CEPH_ENTITY_TYPE_MDS, &g_keyring);
96
117
MonClient mc(&rkeys);
100
121
SimpleMessenger *messenger = new SimpleMessenger();
122
messenger->bind(getpid());
123
if (dump_journal >= 0) {
103
124
Dumper *journal_dumper = new Dumper(messenger, &mc);
104
journal_dumper->init();
125
journal_dumper->init(dump_journal);
105
126
journal_dumper->dump(dump_file);
128
} else if (reset_journal >= 0) {
129
Resetter *jr = new Resetter(messenger, &mc);
130
jr->init(reset_journal);
108
cout << "starting mds." << g_conf.id
109
<< " at " << messenger->get_ms_addr()
134
cout << "starting " << g_conf.name << " at " << messenger->get_ms_addr()
112
137
messenger->register_entity(entity_name_t::MDS(-1));
113
138
assert_warn(messenger);