void handle_enable_mirroring(int r) {
mirror->handle_enable_mirroring(filesystem, peers, r);
+ mirror->_unset_restarting(filesystem);
delete this;
}
auto failed = mirror_action.fs_mirror && mirror_action.fs_mirror->is_failed();
auto blocklisted = mirror_action.fs_mirror && mirror_action.fs_mirror->is_blocklisted();
- if (check_failure && !mirror_action.action_in_progress && failed) {
+ if (check_failure && !mirror_action.action_in_progress &&
+ !_is_restarting(filesystem) && failed) {
// about to restart failed mirror instance -- nothing
// should interfere
dout(5) << ": filesystem=" << filesystem << " failed mirroring -- restarting" << dendl;
+ _set_restarting(filesystem);
auto peers = mirror_action.fs_mirror->get_peers();
auto ctx = new C_RestartMirroring(this, filesystem, mirror_action.pool_id, peers);
ctx->complete(0);
- } else if (check_blocklist && !mirror_action.action_in_progress && blocklisted) {
+ } else if (check_blocklist && !mirror_action.action_in_progress &&
+ !_is_restarting(filesystem) && blocklisted) {
// about to restart blocklisted mirror instance -- nothing
// should interfere
+ _set_restarting(filesystem);
dout(5) << ": filesystem=" << filesystem << " is blocklisted -- restarting" << dendl;
auto peers = mirror_action.fs_mirror->get_peers();
auto ctx = new C_RestartMirroring(this, filesystem, mirror_action.pool_id, peers);
uint64_t pool_id; // for restarting blocklisted mirror instance
bool action_in_progress = false;
+ bool restarting = false;
std::list<Context *> action_ctxs;
std::unique_ptr<FSMirror> fs_mirror;
};
void update_fs_mirrors();
void reopen_logs();
+
+ void _set_restarting(const Filesystem &filesystem) {
+ auto &mirror_action = m_mirror_actions.at(filesystem);
+ mirror_action.restarting = true;
+ }
+
+ void _unset_restarting(const Filesystem &filesystem) {
+ auto &mirror_action = m_mirror_actions.at(filesystem);
+ mirror_action.restarting = false;
+ }
+
+ bool _is_restarting(const Filesystem &filesystem) {
+ auto &mirror_action = m_mirror_actions.at(filesystem);
+ return mirror_action.restarting;
+ }
};
} // namespace mirror