]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rbd-mirror: complete pool watcher initialization if object missing
authorJason Dillaman <dillaman@redhat.com>
Fri, 22 Feb 2019 15:59:26 +0000 (10:59 -0500)
committerJason Dillaman <dillaman@redhat.com>
Mon, 25 Feb 2019 19:22:25 +0000 (14:22 -0500)
If the mirroring object is missing, complete the initialization and
continue to retry in the background. This is useful for cases where
the remote doesn't (yet) have mirroring enabled but the remote
pool watcher initialization is delaying the leader watcher promotion
to the point where the leader is blacklisted by its peers.

Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/test/rbd_mirror/test_mock_PoolWatcher.cc
src/tools/rbd_mirror/PoolReplayer.cc
src/tools/rbd_mirror/PoolWatcher.cc

index 43c3e622fdaf8db2138bf296cf3096be7b4a2abb..b4dd66e8d81272a86a7471c9d10ae1dacab6cb85 100644 (file)
@@ -498,7 +498,7 @@ TEST_F(TestMockPoolWatcher, RegisterWatcherMissing) {
                                     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);
index c15f565b677e54390ec68f4f491cb9d3e79616be..9f8e5e883595b9bcfaffeaa1ed84d0bdfd047019 100644 (file)
@@ -849,7 +849,13 @@ template <typename I>
 void PoolReplayer<I>::handle_init_remote_pool_watcher(
     int r, Context *on_finish) {
   dout(10) << "r=" << r << dendl;
-  if (r < 0) {
+  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;
+  } else if (r < 0) {
     derr << "failed to retrieve remote images: " << cpp_strerror(r) << dendl;
     on_finish = new FunctionContext([on_finish, r](int) {
         on_finish->complete(r);
index 9b975b9cc0004bfa89c764385cd06223453d0c20..b5c62b7b2d646f8b45d9fd283d145053d7e585f5 100644 (file)
@@ -174,6 +174,9 @@ void PoolWatcher<I>::handle_register_watcher(int r) {
   } 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;