From eee7d9e01976433e5b59f1c6128ce01a210f7c1a Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Thu, 18 Feb 2016 20:56:08 -0500 Subject: [PATCH] librbd: helper method for flushing journal commit positions Signed-off-by: Jason Dillaman --- src/librbd/Journal.cc | 10 ++++++++++ src/librbd/Journal.h | 2 ++ src/test/librbd/test_mock_Journal.cc | 30 ++++++++++++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/src/librbd/Journal.cc b/src/librbd/Journal.cc index 5bd1759864e0..486ac53037df 100644 --- a/src/librbd/Journal.cc +++ b/src/librbd/Journal.cc @@ -288,6 +288,16 @@ void Journal::close(Context *on_finish) { wait_for_steady_state(on_finish); } +template +void Journal::flush_commit_position(Context *on_finish) { + CephContext *cct = m_image_ctx.cct; + ldout(cct, 20) << this << " " << __func__ << dendl; + + Mutex::Locker locker(m_lock); + assert(m_journaler != nullptr); + m_journaler->flush_commit_position(on_finish); +} + template uint64_t Journal::append_io_event(AioCompletion *aio_comp, journal::EventEntry &&event_entry, diff --git a/src/librbd/Journal.h b/src/librbd/Journal.h index 2a03907afca9..673151dcb67f 100644 --- a/src/librbd/Journal.h +++ b/src/librbd/Journal.h @@ -112,6 +112,8 @@ public: void open(Context *on_finish); void close(Context *on_finish); + void flush_commit_position(Context *on_finish); + uint64_t append_io_event(AioCompletion *aio_comp, journal::EventEntry &&event_entry, const AioObjectRequests &requests, diff --git a/src/test/librbd/test_mock_Journal.cc b/src/test/librbd/test_mock_Journal.cc index 483b0a05db29..b797ac838d5f 100644 --- a/src/test/librbd/test_mock_Journal.cc +++ b/src/test/librbd/test_mock_Journal.cc @@ -85,6 +85,7 @@ struct MockJournaler { MOCK_METHOD3(get_metadata, void(uint8_t *order, uint8_t *splay_width, int64_t *pool_id)); MOCK_METHOD1(init, void(Context*)); + MOCK_METHOD1(flush_commit_position, void(Context*)); MOCK_METHOD1(start_replay, void(::journal::ReplayHandler *replay_handler)); MOCK_METHOD1(try_pop_front, bool(MockReplayEntryProxy *replay_entry)); @@ -133,6 +134,10 @@ struct MockJournalerProxy { MockJournaler::get_instance().init(on_finish); } + void flush_commit_position(Context *on_finish) { + MockJournaler::get_instance().flush_commit_position(on_finish); + } + void start_replay(::journal::ReplayHandler *replay_handler) { MockJournaler::get_instance().start_replay(replay_handler); } @@ -371,6 +376,11 @@ public: EXPECT_CALL(mock_future, is_valid()).WillOnce(Return(false)); } + void expect_flush_commit_position(::journal::MockJournaler &mock_journaler) { + EXPECT_CALL(mock_journaler, flush_commit_position(_)) + .WillOnce(CompleteContext(0, NULL)); + } + int when_open(MockJournal &mock_journal) { C_SaferCond ctx; mock_journal.open(&ctx); @@ -914,4 +924,24 @@ TEST_F(TestMockJournal, IOCommitError) { mock_journal.commit_io_event(1U, -EINVAL); } +TEST_F(TestMockJournal, FlushCommitPosition) { + REQUIRE_FEATURE(RBD_FEATURE_JOURNALING); + + librbd::ImageCtx *ictx; + ASSERT_EQ(0, open_image(m_image_name, &ictx)); + + MockImageCtx mock_image_ctx(*ictx); + MockJournal mock_journal(mock_image_ctx); + ::journal::MockJournaler mock_journaler; + open_journal(mock_image_ctx, mock_journal, mock_journaler); + BOOST_SCOPE_EXIT_ALL(&) { + close_journal(mock_journal, mock_journaler); + }; + + expect_flush_commit_position(mock_journaler); + C_SaferCond ctx; + mock_journal.flush_commit_position(&ctx); + ASSERT_EQ(0, ctx.wait()); +} + } // namespace librbd -- 2.47.3