on_init = create_context_callback<Context>(on_init, this);
- ldout(m_image_ctx.cct, 10) << dendl;
+ ldout(m_image_ctx.cct, 10) << ": features=" << features << dendl;
{
std::lock_guard locker{ML<I>::m_lock};
ML<I>::set_state_initializing();
}
- auto ctx = new LambdaContext([this, features, on_init](int r) {
- handle_init_complete(r, features, on_init);
+ m_image_dispatch = exclusive_lock::ImageDispatch<I>::create(&m_image_ctx);
+ m_image_ctx.io_image_dispatcher->register_dispatch(m_image_dispatch);
+
+ on_init = new LambdaContext([this, on_init](int r) {
+ {
+ std::lock_guard locker{ML<I>::m_lock};
+ ML<I>::set_state_unlocked();
+ }
+
+ on_init->complete(r);
});
- m_image_ctx.io_image_dispatcher->block_writes(ctx);
+
+ bool pwl_enabled = cache::util::is_pwl_enabled(m_image_ctx);
+ if (m_image_ctx.clone_copy_on_read ||
+ (features & RBD_FEATURE_JOURNALING) != 0 ||
+ pwl_enabled) {
+ m_image_dispatch->set_require_lock(true, io::DIRECTION_BOTH, on_init);
+ } else {
+ m_image_dispatch->set_require_lock(true, io::DIRECTION_WRITE, on_init);
+ }
}
template <typename I>
});
}
-template <typename I>
-void ExclusiveLock<I>::handle_init_complete(int r, uint64_t features,
- Context* on_finish) {
- if (r < 0) {
- m_image_ctx.io_image_dispatcher->unblock_writes();
- on_finish->complete(r);
- return;
- }
-
- ldout(m_image_ctx.cct, 10) << ": features=" << features << dendl;
-
- m_image_dispatch = exclusive_lock::ImageDispatch<I>::create(&m_image_ctx);
- m_image_ctx.io_image_dispatcher->register_dispatch(m_image_dispatch);
-
- on_finish = new LambdaContext([this, on_finish](int r) {
- m_image_ctx.io_image_dispatcher->unblock_writes();
-
- {
- std::lock_guard locker{ML<I>::m_lock};
- ML<I>::set_state_unlocked();
- }
-
- on_finish->complete(r);
- });
-
- bool rwl_enabled = cache::util::is_pwl_enabled(m_image_ctx);
- if (m_image_ctx.clone_copy_on_read ||
- (features & RBD_FEATURE_JOURNALING) != 0 ||
- rwl_enabled) {
- m_image_dispatch->set_require_lock(true, io::DIRECTION_BOTH, on_finish);
- } else {
- m_image_dispatch->set_require_lock(true, io::DIRECTION_WRITE, on_finish);
- }
-}
-
template <typename I>
void ExclusiveLock<I>::shutdown_handler(int r, Context *on_finish) {
ldout(m_image_ctx.cct, 10) << dendl;
EXPECT_CALL(mock_image_dispatch, unset_require_lock(io::DIRECTION_BOTH));
}
- void expect_block_writes(MockExclusiveLockImageCtx &mock_image_ctx,
- MockImageDispatch& mock_image_dispatch) {
- EXPECT_CALL(*mock_image_ctx.io_image_dispatcher, block_writes(_))
- .WillOnce(CompleteContext(0, mock_image_ctx.image_ctx->op_work_queue));
- }
-
- void expect_unblock_writes(MockExclusiveLockImageCtx &mock_image_ctx) {
- EXPECT_CALL(*mock_image_ctx.io_image_dispatcher, unblock_writes());
- }
-
void expect_register_dispatch(MockExclusiveLockImageCtx &mock_image_ctx) {
EXPECT_CALL(*mock_image_ctx.io_image_dispatcher, register_dispatch(_));
}
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));
InSequence seq;
expect_set_state_initializing(exclusive_lock);
MockImageDispatch mock_image_dispatch;
- expect_block_writes(mock_image_ctx, mock_image_dispatch);
expect_register_dispatch(mock_image_ctx);
expect_set_require_lock(mock_image_ctx, mock_image_dispatch, true);
- expect_unblock_writes(mock_image_ctx);
expect_set_state_unlocked(exclusive_lock);
ASSERT_EQ(0, when_init(mock_image_ctx, exclusive_lock));