MOCK_METHOD0(destroy, void());
MOCK_METHOD2(start, void(Context *, bool));
MOCK_METHOD2(stop, void(Context *, bool));
- MOCK_METHOD0(restart, void());
+ MOCK_METHOD1(restart, void(Context*));
MOCK_METHOD0(flush, void());
MOCK_METHOD2(print_status, void(Formatter *, stringstream *));
MOCK_METHOD2(add_peer, void(const std::string &, librados::IoCtx &));
EXPECT_CALL(mock_image_replayer, is_stopped()).WillOnce(Return(true));
EXPECT_CALL(mock_image_replayer, is_blacklisted()).WillOnce(Return(false));
EXPECT_CALL(mock_image_replayer, is_finished()).WillOnce(Return(false));
- EXPECT_CALL(mock_image_replayer, start(nullptr, false));
+ EXPECT_CALL(mock_image_replayer, start(_, false))
+ .WillOnce(CompleteContext(0));
expect_work_queue(mock_threads);
instance_replayer.acquire_image(&mock_instance_watcher, global_image_id,
EXPECT_CALL(mock_image_replayer, is_stopped()).WillOnce(Return(true));
EXPECT_CALL(mock_image_replayer, is_blacklisted()).WillOnce(Return(false));
EXPECT_CALL(mock_image_replayer, is_finished()).WillOnce(Return(false));
- EXPECT_CALL(mock_image_replayer, start(nullptr, false));
+ EXPECT_CALL(mock_image_replayer, start(_, false))
+ .WillOnce(CompleteContext(0));
expect_work_queue(mock_threads);
instance_replayer.acquire_image(&mock_instance_watcher, global_image_id,
EXPECT_CALL(mock_image_replayer, is_stopped()).WillOnce(Return(true));
EXPECT_CALL(mock_image_replayer, is_blacklisted()).WillOnce(Return(false));
EXPECT_CALL(mock_image_replayer, is_finished()).WillOnce(Return(false));
- EXPECT_CALL(mock_image_replayer, start(nullptr, false));
+ EXPECT_CALL(mock_image_replayer, start(_, false))
+ .WillOnce(CompleteContext(0));
expect_work_queue(mock_threads);
C_SaferCond on_acquire1;
// Re-acquire
EXPECT_CALL(mock_image_replayer, set_finished(false));
- EXPECT_CALL(mock_image_replayer, restart());
+ EXPECT_CALL(mock_image_replayer, restart(_))
+ .WillOnce(CompleteContext(0));
expect_work_queue(mock_threads);
C_SaferCond on_acquire2;
// detect if the image has been deleted while the leader was offline
auto& image_replayer = it->second;
image_replayer->set_finished(false);
- image_replayer->restart();
+ image_replayer->restart(new C_TrackedOp(m_async_op_tracker, nullptr));
}
m_threads->work_queue->queue(on_finish, 0);
// it will eventually detect that the peer image is missing and
// determine if a delete propagation is required.
auto image_replayer = it->second;
- image_replayer->restart();
+ image_replayer->restart(new C_TrackedOp(m_async_op_tracker, nullptr));
}
m_threads->work_queue->queue(on_finish, 0);
}
m_manual_stop = false;
+ auto cct = static_cast<CephContext *>(m_local_rados->cct());
+ auto gather_ctx = new C_Gather(
+ cct, new C_TrackedOp(m_async_op_tracker, nullptr));
for (auto &kv : m_image_replayers) {
auto &image_replayer = kv.second;
- image_replayer->start(nullptr, true);
+ image_replayer->start(gather_ctx->new_sub(), true);
}
+
+ gather_ctx->activate();
}
template <typename I>
{
dout(10) << dendl;
- Mutex::Locker locker(m_lock);
+ auto cct = static_cast<CephContext *>(m_local_rados->cct());
+ auto gather_ctx = new C_Gather(
+ cct, new C_TrackedOp(m_async_op_tracker, nullptr));
+ {
+ Mutex::Locker locker(m_lock);
- m_manual_stop = true;
+ m_manual_stop = true;
- for (auto &kv : m_image_replayers) {
- auto &image_replayer = kv.second;
- image_replayer->stop(nullptr, true);
+ for (auto &kv : m_image_replayers) {
+ auto &image_replayer = kv.second;
+ image_replayer->stop(gather_ctx->new_sub(), true);
+ }
}
+
+ gather_ctx->activate();
}
template <typename I>
for (auto &kv : m_image_replayers) {
auto &image_replayer = kv.second;
- image_replayer->restart();
+ image_replayer->restart(new C_TrackedOp(m_async_op_tracker, nullptr));
}
}
}
dout(10) << "global_image_id=" << global_image_id << dendl;
- image_replayer->start(nullptr, false);
+ image_replayer->start(new C_TrackedOp(m_async_op_tracker, nullptr), false);
}
template <typename I>