OPTION(mds_bal_minchunk, 0, OPT_FLOAT, .001), // never take anything smaller than this
OPTION(mds_bal_target_removal_min, 0, OPT_INT, 5), // min balance iterations before old target is removed
OPTION(mds_bal_target_removal_max, 0, OPT_INT, 10), // max balance iterations before old target is removed
+ OPTION(mds_replay_interval, 0, OPT_FLOAT, 1.0), // time to wait before starting replay again
OPTION(mds_trim_on_rejoin, 0, OPT_BOOL, true),
OPTION(mds_shutdown_check, 0, OPT_INT, 0),
OPTION(mds_verify_export_dirauth, 0, OPT_BOOL, true),
int mds_bal_target_removal_min;
int mds_bal_target_removal_max;
+ float mds_replay_interval;
+
bool mds_trim_on_rejoin;
int mds_shutdown_check;
uint64_t get_read_pos();
uint64_t get_write_pos();
uint64_t get_safe_pos();
+ Journaler *get_journaler() { return journaler; }
bool empty() { return segments.empty(); }
bool is_capped() { return capped; }
#include "osd/OSDMap.h"
#include "osdc/Objecter.h"
#include "osdc/Filer.h"
+#include "osdc/Journaler.h"
#include "MDSMap.h"
if (is_active()) {
active_start();
- } else if (is_replay() || is_oneshot_replay()) {
+ } else if (is_replay() || is_oneshot_replay() ||
+ is_standby_replay()) {
replay_start();
} else if (is_resolve()) {
resolve_start();
}
case 3:
- if (is_replay() || is_oneshot_replay()) {
+ if (is_replay() || is_oneshot_replay() || is_standby_replay()) {
dout(2) << "boot_start " << step << ": replaying mds log" << dendl;
mdlog->replay(new C_MDS_BootStart(this, 4));
break;
}
case 4:
- if (is_replay() || is_oneshot_replay()) {
+ if (is_replay() || is_oneshot_replay() || is_standby_replay()) {
replay_done();
break;
}
}
}
+
+inline void MDS::standby_replay_restart()
+{
+ mdlog->get_journaler()->reread_head_and_probe(new C_MDS_BootStart(this, 3));
+}
+
+class MDS::C_Standby_replay_start : public Context {
+ MDS *mds;
+public:
+ C_Standby_replay_start(MDS *m) : mds(m) {}
+ void finish(int r) {
+ assert(!r);
+ mds->standby_replay_restart();
+ }
+};
+
void MDS::replay_done()
{
dout(1) << "replay_done in=" << mdsmap->get_num_mds()
return;
}
+ if (is_standby_replay()) {
+ standby_trim_segments();
+ timer.add_event_after(g_conf.mds_replay_interval,
+ new C_Standby_replay_start(this));
+ return;
+ }
+
if (g_conf.mds_wipe_sessions) {
dout(1) << "wiping out client sessions" << dendl;
sessionmap.wipe();
}
}
+void MDS::standby_trim_segments()
+{
+ return;
+}
+
void MDS::resolve_start()
{
bool is_starting() { return state == MDSMap::STATE_STARTING; }
bool is_standby() { return state == MDSMap::STATE_STANDBY; }
bool is_replay() { return state == MDSMap::STATE_REPLAY; }
+ bool is_standby_replay() { return state == MDSMap::STATE_STANDBY_REPLAY; }
bool is_resolve() { return state == MDSMap::STATE_RESOLVE; }
bool is_reconnect() { return state == MDSMap::STATE_RECONNECT; }
bool is_rejoin() { return state == MDSMap::STATE_REJOIN; }
void creating_done();
void starting_done();
void replay_done();
+ void standby_replay_restart();
+ void standby_trim_segments();
+ class C_Standby_replay_start;
void resolve_start();
void resolve_done();