return;
}
+ m_event_replay_tracker.start_op();
if (m_replay_tag_valid && m_replay_tag.tid == m_replay_tag_tid) {
preprocess_entry();
return;
void ImageReplayer<I>::replay_flush() {
dout(20) << dendl;
+ bool interrupted = false;
{
Mutex::Locker locker(m_lock);
if (m_state != STATE_REPLAYING) {
dout(20) << "replay interrupted" << dendl;
- return;
+ interrupted = true;
+ } else {
+ m_state = STATE_REPLAY_FLUSHING;
}
- m_state = STATE_REPLAY_FLUSHING;
+ }
+
+ if (interrupted) {
+ m_event_replay_tracker.finish_op();
+ return;
}
// shut down the replay to flush all IO and ops and create a new
if (r < 0) {
derr << "replay flush encountered an error: " << cpp_strerror(r) << dendl;
+ m_event_replay_tracker.finish_op();
handle_replay_complete(r, "replay flush encountered an error");
return;
} else if (on_replay_interrupted()) {
+ m_event_replay_tracker.finish_op();
return;
}
if (r < 0) {
derr << "failed to retrieve remote tag " << m_replay_tag_tid << ": "
<< cpp_strerror(r) << dendl;
+ m_event_replay_tracker.finish_op();
handle_replay_complete(r, "failed to retrieve remote tag");
return;
}
if (r < 0) {
derr << "failed to allocate journal tag: " << cpp_strerror(r) << dendl;
+ m_event_replay_tracker.finish_op();
handle_replay_complete(r, "failed to allocate journal tag");
return;
}
int r = m_local_replay->decode(&it, &m_event_entry);
if (r < 0) {
derr << "failed to decode journal event" << dendl;
+ m_event_replay_tracker.finish_op();
handle_replay_complete(r, "failed to decode journal event");
return;
}
if (r < 0) {
derr << "failed to preprocess journal event" << dendl;
+ m_event_replay_tracker.finish_op();
handle_replay_complete(r, "failed to preprocess journal event");
return;
}
ImageReplayer, &ImageReplayer<I>::handle_process_entry_ready>(this);
Context *on_commit = new C_ReplayCommitted(this, std::move(m_replay_entry));
- m_event_replay_tracker.start_op();
m_local_replay->process(m_event_entry, on_ready, on_commit);
}