}));
}
+ void expect_flush_repeatedly(MockReplay& mock_replay,
+ journal::MockJournaler& mock_journal) {
+ EXPECT_CALL(mock_replay, flush(_))
+ .WillRepeatedly(Invoke([this](Context* ctx) {
+ m_threads->work_queue->queue(ctx, 0);
+ }));
+ EXPECT_CALL(mock_journal, flush_commit_position(_))
+ .WillRepeatedly(Invoke([this](Context* ctx) {
+ m_threads->work_queue->queue(ctx, 0);
+ }));
+ }
+
void expect_trash_move(MockImageDeleter& mock_image_deleter,
const std::string& global_image_id,
bool ignore_orphan, int r) {
MockEventPreprocessor mock_event_preprocessor;
MockReplayStatusFormatter mock_replay_status_formatter;
+ expect_flush_repeatedly(mock_local_replay, mock_remote_journaler);
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
MockEventPreprocessor mock_event_preprocessor;
MockReplayStatusFormatter mock_replay_status_formatter;
+ expect_flush_repeatedly(mock_local_replay, mock_remote_journaler);
expect_get_or_send_update(mock_replay_status_formatter);
InSequence seq;
MockReplayStatusFormatter mock_replay_status_formatter;
::journal::MockReplayEntry mock_replay_entry;
+ expect_flush_repeatedly(mock_local_replay, mock_remote_journaler);
expect_get_or_send_update(mock_replay_status_formatter);
expect_get_commit_tid_in_debug(mock_replay_entry);
expect_get_tag_tid_in_debug(mock_local_journal);
MockReplayStatusFormatter mock_replay_status_formatter;
::journal::MockReplayEntry mock_replay_entry;
+ expect_flush_repeatedly(mock_local_replay, mock_remote_journaler);
expect_get_or_send_update(mock_replay_status_formatter);
expect_get_commit_tid_in_debug(mock_replay_entry);
expect_get_tag_tid_in_debug(mock_local_journal);
MockReplayStatusFormatter mock_replay_status_formatter;
::journal::MockReplayEntry mock_replay_entry;
+ expect_flush_repeatedly(mock_local_replay, mock_remote_journaler);
expect_get_or_send_update(mock_replay_status_formatter);
expect_get_commit_tid_in_debug(mock_replay_entry);
expect_get_tag_tid_in_debug(mock_local_journal);
template <typename I>
void ImageReplayer<I>::queue_mirror_image_status_update(const OptionalState &state) {
dout(15) << dendl;
- FunctionContext *ctx = new FunctionContext(
+
+ auto ctx = new FunctionContext(
[this, state](int r) {
send_mirror_status_update(state);
});
+
+ // ensure pending IO is flushed and the commit position is updated
+ // prior to updating the mirror status
+ ctx = new FunctionContext(
+ [this, ctx](int r) {
+ flush_local_replay(ctx);
+ });
m_threads->work_queue->queue(ctx, 0);
}