]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
test/rbd-mirror: pool watcher registration error might result in race 37208/head
authorJason Dillaman <dillaman@redhat.com>
Wed, 5 Aug 2020 16:36:26 +0000 (12:36 -0400)
committerNathan Cutler <ncutler@suse.com>
Thu, 17 Sep 2020 05:08:55 +0000 (07:08 +0200)
The init finish context should be swapped out before it attempts to
re-register the watcher. This affects the test case which mocks the
timer to fire immediately instead of after 30 seconds.

Fixes: https://tracker.ceph.com/issues/46669
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
(cherry picked from commit c89d31ebf6c412d609123979c63ebc600b70e179)

src/tools/rbd_mirror/PoolWatcher.cc

index 359ca95d5377204a443e73ae97697c3b21e17bbe..6d8a8fc04155dc66f30ea9ae4ab5252f31bbb342 100644 (file)
@@ -178,10 +178,12 @@ void PoolWatcher<I>::handle_register_watcher(int r) {
     std::swap(on_init_finish, m_on_init_finish);
   } else if (r == -ENOENT) {
     dout(5) << "mirroring directory does not exist" << dendl;
-    schedule_refresh_images(30);
+    {
+      std::lock_guard locker{m_lock};
+      std::swap(on_init_finish, m_on_init_finish);
+    }
 
-    std::lock_guard locker{m_lock};
-    std::swap(on_init_finish, m_on_init_finish);
+    schedule_refresh_images(30);
   } else {
     derr << "unexpected error registering mirroring directory watch: "
          << cpp_strerror(r) << dendl;