mock_listener);
C_SaferCond ctx;
mock_pool_watcher.init(&ctx);
- ASSERT_EQ(0, ctx.wait());
+ ASSERT_EQ(-ENOENT, ctx.wait());
ASSERT_TRUE(wait_for_update(1));
expect_mirroring_watcher_unregister(mock_mirroring_watcher, 0);
assert(!m_remote_pool_watcher);
m_remote_pool_watcher.reset(new PoolWatcher<>(
m_threads, m_remote_io_ctx, m_remote_pool_watcher_listener));
+ auto ctx = new FunctionContext([this, on_finish](int r) {
+ handle_init_remote_pool_watcher(r, on_finish);
+ });
m_remote_pool_watcher->init(create_async_context_callback(
- m_threads->work_queue, on_finish));
+ m_threads->work_queue, ctx));
+}
+void PoolReplayer::handle_init_remote_pool_watcher(int r, Context *on_finish) {
+ dout(10) << "r=" << r << dendl;
+ if (r == -ENOENT) {
+ // Technically nothing to do since the other side doesn't
+ // have mirroring enabled. Eventually the remote pool watcher will
+ // detect images (if mirroring is enabled), so no point propagating
+ // an error which would just busy-spin the state machines.
+ dout(0) << "remote peer does not have mirroring configured" << dendl;
+ r = 0;
+ } else if (r < 0) {
+ derr << "failed to retrieve remote images: " << cpp_strerror(r) << dendl;
+ }
+
+ on_finish->complete(r);
+
+ Mutex::Locker locker(m_lock);
m_cond.Signal();
}
void handle_init_local_pool_watcher(int r, Context *on_finish);
void init_remote_pool_watcher(Context *on_finish);
+ void handle_init_remote_pool_watcher(int r, Context *on_finish);
void shut_down_pool_watchers(Context *on_finish);
void handle_shut_down_pool_watchers(int r, Context *on_finish);
} else if (r == -ENOENT) {
dout(5) << "mirroring directory does not exist" << dendl;
schedule_refresh_images(30);
+
+ Mutex::Locker locker(m_lock);
+ std::swap(on_init_finish, m_on_init_finish);
} else {
derr << "unexpected error registering mirroring directory watch: "
<< cpp_strerror(r) << dendl;