From: Jason Dillaman Date: Wed, 5 Aug 2020 16:36:26 +0000 (-0400) Subject: test/rbd-mirror: pool watcher registration error might result in race X-Git-Tag: v14.2.12~67^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=26b56e69a9c41fa78d4cbbc4c018bcff4bfe32bb;p=ceph.git 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 --- 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;