From 26b56e69a9c41fa78d4cbbc4c018bcff4bfe32bb 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) Conflicts: src/tools/rbd_mirror/PoolWatcher.cc - nautilus uses Mutex::Locker where master has std::lock_guard --- 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 b5c62b7b2d64..81810ea134ea 100644 --- a/src/tools/rbd_mirror/PoolWatcher.cc +++ b/src/tools/rbd_mirror/PoolWatcher.cc @@ -173,10 +173,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); + { + Mutex::Locker locker(m_lock); + std::swap(on_init_finish, m_on_init_finish); + } - Mutex::Locker 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