From: Jason Dillaman Date: Mon, 12 Feb 2018 22:50:01 +0000 (-0500) Subject: librbd: flush journal commit position after stopping replay X-Git-Tag: v13.0.2~272^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bcfcbcfe0b575822a4f44a1adc20a840b7f0f1b5;p=ceph.git librbd: flush journal commit position after stopping replay Signed-off-by: Jason Dillaman --- diff --git a/src/librbd/Journal.cc b/src/librbd/Journal.cc index 90cd5e08f811..b336ffe196b7 100644 --- a/src/librbd/Journal.cc +++ b/src/librbd/Journal.cc @@ -1266,6 +1266,10 @@ void Journal::handle_replay_complete(int r) { handle_flushing_replay(); } }); + ctx = new FunctionContext([this, ctx](int r) { + // ensure the commit position is flushed to disk + m_journaler->flush_commit_position(ctx); + }); ctx = new FunctionContext([this, cct, cancel_ops, ctx](int r) { ldout(cct, 20) << this << " handle_replay_complete: " << "shut down replay" << dendl; @@ -1312,7 +1316,13 @@ void Journal::handle_replay_process_safe(ReplayEntry replay_entry, int r) { m_lock.Unlock(); // stop replay, shut down, and restart - Context *ctx = new FunctionContext([this, cct](int r) { + Context* ctx = create_context_callback< + Journal, &Journal::handle_flushing_restart>(this); + ctx = new FunctionContext([this, ctx](int r) { + // ensure the commit position is flushed to disk + m_journaler->flush_commit_position(ctx); + }); + ctx = new FunctionContext([this, cct, ctx](int r) { ldout(cct, 20) << this << " handle_replay_process_safe: " << "shut down replay" << dendl; { @@ -1320,8 +1330,7 @@ void Journal::handle_replay_process_safe(ReplayEntry replay_entry, int r) { assert(m_state == STATE_FLUSHING_RESTART); } - m_journal_replay->shut_down(true, create_context_callback< - Journal, &Journal::handle_flushing_restart>(this)); + m_journal_replay->shut_down(true, ctx); }); m_journaler->stop_replay(ctx); return; diff --git a/src/test/librbd/test_mock_Journal.cc b/src/test/librbd/test_mock_Journal.cc index 5b2da9837877..7cf231d679b3 100644 --- a/src/test/librbd/test_mock_Journal.cc +++ b/src/test/librbd/test_mock_Journal.cc @@ -488,6 +488,7 @@ public: expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); expect_committed(mock_journaler, 0); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); ASSERT_EQ(0, when_open(mock_journal)); } @@ -548,6 +549,7 @@ TEST_F(TestMockJournal, StateTransitions) { expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); expect_committed(mock_journaler, 3); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); @@ -604,6 +606,7 @@ TEST_F(TestMockJournal, ReplayCompleteError) { MockJournalReplay mock_journal_replay; expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0, true); + expect_flush_commit_position(mock_journaler); expect_shut_down_journaler(mock_journaler); // replay failure should result in replay-restart @@ -617,6 +620,7 @@ TEST_F(TestMockJournal, ReplayCompleteError) { expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); ASSERT_EQ(0, when_open(mock_journal)); @@ -655,6 +659,7 @@ TEST_F(TestMockJournal, FlushReplayError) { std::bind(&invoke_replay_complete, _1, 0)); expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, -EINVAL); + expect_flush_commit_position(mock_journaler); expect_shut_down_journaler(mock_journaler); // replay flush failure should result in replay-restart @@ -668,6 +673,7 @@ TEST_F(TestMockJournal, FlushReplayError) { expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); ASSERT_EQ(0, when_open(mock_journal)); @@ -704,6 +710,7 @@ TEST_F(TestMockJournal, CorruptEntry) { EXPECT_CALL(mock_journal_replay, decode(_, _)).WillOnce(Return(-EBADMSG)); expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0, true); + expect_flush_commit_position(mock_journaler); expect_shut_down_journaler(mock_journaler); // replay failure should result in replay-restart @@ -716,6 +723,7 @@ TEST_F(TestMockJournal, CorruptEntry) { std::bind(&invoke_replay_complete, _1, 0)); expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); ASSERT_EQ(0, when_open(mock_journal)); @@ -749,6 +757,7 @@ TEST_F(TestMockJournal, StopError) { MockJournalReplay mock_journal_replay; expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); ASSERT_EQ(0, when_open(mock_journal)); @@ -794,6 +803,7 @@ TEST_F(TestMockJournal, ReplayOnDiskPreFlushError) { mock_replay_entry); expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0, true); + expect_flush_commit_position(mock_journaler); expect_shut_down_journaler(mock_journaler); // replay write-to-disk failure should result in replay-restart @@ -808,6 +818,7 @@ TEST_F(TestMockJournal, ReplayOnDiskPreFlushError) { expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); C_SaferCond ctx; @@ -871,6 +882,7 @@ TEST_F(TestMockJournal, ReplayOnDiskPostFlushError) { EXPECT_CALL(mock_journal_replay, shut_down(false, _)) .WillOnce(DoAll(SaveArg<1>(&on_flush), InvokeWithoutArgs(this, &TestMockJournal::wake_up))); + expect_flush_commit_position(mock_journaler); // replay write-to-disk failure should result in replay-restart expect_shut_down_journaler(mock_journaler); @@ -884,6 +896,7 @@ TEST_F(TestMockJournal, ReplayOnDiskPostFlushError) { expect_stop_replay(mock_journaler); expect_shut_down_replay(mock_image_ctx, mock_journal_replay, 0); + expect_flush_commit_position(mock_journaler); expect_start_append(mock_journaler); C_SaferCond ctx;