}
template <typename I>
-void ImageReplayer<I>::start(Context *on_finish, bool manual)
+void ImageReplayer<I>::start(Context *on_finish, bool manual, bool restart)
{
dout(10) << "on_finish=" << on_finish << dendl;
dout(5) << "stopped manually, ignoring start without manual flag"
<< dendl;
r = -EPERM;
+ } else if (restart && !m_restart_requested) {
+ dout(10) << "canceled restart" << dendl;
+ r = -ECANCELED;
} else {
m_state = STATE_STARTING;
m_last_r = 0;
m_state_desc.clear();
m_manual_stop = false;
m_delete_requested = false;
+ m_restart_requested = false;
if (on_finish != nullptr) {
ceph_assert(m_on_start_finish == nullptr);
}
template <typename I>
-void ImageReplayer<I>::stop(Context *on_finish, bool manual, int r,
- const std::string& desc)
+void ImageReplayer<I>::stop(Context *on_finish, bool manual, bool restart)
{
dout(10) << "on_finish=" << on_finish << ", manual=" << manual
- << ", desc=" << desc << dendl;
+ << ", restart=" << restart << dendl;
image_replayer::BootstrapRequest<I> *bootstrap_request = nullptr;
bool shut_down_replay = false;
{
Mutex::Locker locker(m_lock);
+ if (restart) {
+ m_restart_requested = true;
+ }
+
if (!is_running_()) {
running = false;
+ if (!restart && m_restart_requested) {
+ dout(10) << "canceling restart" << dendl;
+ m_restart_requested = false;
+ }
} else {
if (!is_stopped_()) {
if (m_state == STATE_STARTING) {
}
if (shut_down_replay) {
- on_stop_journal_replay(r, desc);
+ on_stop_journal_replay();
} else if (on_finish != nullptr) {
on_finish->complete(0);
}
template <typename I>
void ImageReplayer<I>::restart(Context *on_finish)
{
+ {
+ Mutex::Locker locker(m_lock);
+ m_restart_requested = true;
+ }
+
FunctionContext *ctx = new FunctionContext(
[this, on_finish](int r) {
if (r < 0) {
// Try start anyway.
}
- start(on_finish, true);
+ start(on_finish, true, true);
});
- stop(ctx);
+ stop(ctx, false, true);
}
template <typename I>
if (client.state != cls::journal::CLIENT_STATE_CONNECTED) {
dout(0) << "client flagged disconnected, stopping image replay" << dendl;
- stop(nullptr, false, -ENOTCONN, "disconnected");
+ stop(nullptr, false, false);
}
}
return m_global_image_id;
}
- void start(Context *on_finish = nullptr, bool manual = false);
+ void start(Context *on_finish = nullptr, bool manual = false,
+ bool restart = false);
void stop(Context *on_finish = nullptr, bool manual = false,
- int r = 0, const std::string& desc = "");
+ bool restart = false);
void restart(Context *on_finish = nullptr);
void flush();
* @endverbatim
*/
- virtual void on_start_fail(int r, const std::string &desc);
- virtual bool on_start_interrupted();
- virtual bool on_start_interrupted(Mutex& lock);
+ void on_start_fail(int r, const std::string &desc);
+ bool on_start_interrupted();
+ bool on_start_interrupted(Mutex& lock);
- virtual void on_stop_journal_replay(int r = 0, const std::string &desc = "");
+ void on_stop_journal_replay(int r = 0, const std::string &desc = "");
bool on_replay_interrupted();
bool m_finished = false;
bool m_delete_requested = false;
bool m_resync_requested = false;
+ bool m_restart_requested = false;
image_replayer::EventPreprocessor<ImageCtxT> *m_event_preprocessor = nullptr;
image_replayer::ReplayStatusFormatter<ImageCtxT> *m_replay_status_formatter =