wait_for_steady_state(on_finish);
}
+template <typename I>
+void Journal<I>::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 <typename I>
uint64_t Journal<I>::append_io_event(AioCompletion *aio_comp,
journal::EventEntry &&event_entry,
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,
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));
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);
}
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);
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