From c88afe83e4dbf6f817d45a9e52fd67aa2b918401 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 5 Aug 2020 12:36:26 -0400 Subject: [PATCH] test/rbd-mirror: pool watcher registration error might result in race 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 (cherry picked from commit c89d31ebf6c412d609123979c63ebc600b70e179) --- src/tools/rbd_mirror/PoolWatcher.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/tools/rbd_mirror/PoolWatcher.cc b/src/tools/rbd_mirror/PoolWatcher.cc index 359ca95d537..6d8a8fc0415 100644 --- a/src/tools/rbd_mirror/PoolWatcher.cc +++ b/src/tools/rbd_mirror/PoolWatcher.cc @@ -178,10 +178,12 @@ void PoolWatcher::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; -- 2.47.3