diff --git a/src/test/rbd_mirror/test_ImageReplayer.cc b/src/test/rbd_mirror/test_ImageReplayer.cc index 8071caac5d5..c56fffc1d18 100644 --- a/src/test/rbd_mirror/test_ImageReplayer.cc +++ b/src/test/rbd_mirror/test_ImageReplayer.cc @@ -132,7 +132,7 @@ public: EXPECT_EQ(0, m_local_ioctx.create(RBD_MIRRORING, false)); m_local_status_updater = rbd::mirror::MirrorStatusUpdater<>::create( - m_local_ioctx, m_threads.get(), ""); + m_local_ioctx, m_threads.get(), "", ""); C_SaferCond status_updater_ctx; m_local_status_updater->init(&status_updater_ctx); EXPECT_EQ(0, status_updater_ctx.wait()); diff --git a/src/test/rbd_mirror/test_mock_MirrorStatusUpdater.cc b/src/test/rbd_mirror/test_mock_MirrorStatusUpdater.cc index ae379b60bb2..8964d7a84ec 100644 --- a/src/test/rbd_mirror/test_mock_MirrorStatusUpdater.cc +++ b/src/test/rbd_mirror/test_mock_MirrorStatusUpdater.cc @@ -247,7 +247,7 @@ public: TEST_F(TestMockMirrorStatusUpdater, InitShutDown) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -261,7 +261,7 @@ TEST_F(TestMockMirrorStatusUpdater, InitShutDown) { TEST_F(TestMockMirrorStatusUpdater, InitStatusWatcherError) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -278,7 +278,7 @@ TEST_F(TestMockMirrorStatusUpdater, InitStatusWatcherError) { TEST_F(TestMockMirrorStatusUpdater, ShutDownStatusWatcherError) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -297,7 +297,7 @@ TEST_F(TestMockMirrorStatusUpdater, ShutDownStatusWatcherError) { TEST_F(TestMockMirrorStatusUpdater, SmallBatch) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -328,7 +328,7 @@ TEST_F(TestMockMirrorStatusUpdater, SmallBatch) { TEST_F(TestMockMirrorStatusUpdater, LargeBatch) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -369,7 +369,7 @@ TEST_F(TestMockMirrorStatusUpdater, LargeBatch) { TEST_F(TestMockMirrorStatusUpdater, OverwriteStatus) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -399,7 +399,7 @@ TEST_F(TestMockMirrorStatusUpdater, OverwriteStatus) { TEST_F(TestMockMirrorStatusUpdater, OverwriteStatusInFlight) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -440,7 +440,7 @@ TEST_F(TestMockMirrorStatusUpdater, OverwriteStatusInFlight) { TEST_F(TestMockMirrorStatusUpdater, ImmediateUpdate) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -461,7 +461,7 @@ TEST_F(TestMockMirrorStatusUpdater, ImmediateUpdate) { TEST_F(TestMockMirrorStatusUpdater, RemoveIdleStatus) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -484,7 +484,7 @@ TEST_F(TestMockMirrorStatusUpdater, RemoveIdleStatus) { TEST_F(TestMockMirrorStatusUpdater, RemoveInFlightStatus) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -518,7 +518,7 @@ TEST_F(TestMockMirrorStatusUpdater, RemoveInFlightStatus) { TEST_F(TestMockMirrorStatusUpdater, ShutDownWhileUpdating) { MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, ""); + m_mock_threads, "", ""); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); @@ -557,7 +557,8 @@ TEST_F(TestMockMirrorStatusUpdater, MirrorPeerSitePing) { ASSERT_EQ(0, _rados->cluster_fsid(&fsid)); MockMirrorStatusUpdater mock_mirror_status_updater(m_local_io_ctx, - m_mock_threads, "siteA"); + m_mock_threads, "siteA", + fsid); MockMirrorStatusWatcher* mock_mirror_status_watcher = new MockMirrorStatusWatcher(); diff --git a/src/test/rbd_mirror/test_mock_NamespaceReplayer.cc b/src/test/rbd_mirror/test_mock_NamespaceReplayer.cc index 162d2abef02..66d772cea8f 100644 --- a/src/test/rbd_mirror/test_mock_NamespaceReplayer.cc +++ b/src/test/rbd_mirror/test_mock_NamespaceReplayer.cc @@ -176,7 +176,8 @@ struct MirrorStatusUpdater { static MirrorStatusUpdater *create(librados::IoCtx &io_ctx, Threads *threads, - const std::string& site_name) { + const std::string& site_name, + const std::string& fsid) { ceph_assert(s_instance[site_name] != nullptr); return s_instance[site_name]; } diff --git a/src/tools/rbd_mirror/MirrorStatusUpdater.cc b/src/tools/rbd_mirror/MirrorStatusUpdater.cc index 0fd042e828d..ecd544d9b24 100644 --- a/src/tools/rbd_mirror/MirrorStatusUpdater.cc +++ b/src/tools/rbd_mirror/MirrorStatusUpdater.cc @@ -31,11 +31,12 @@ using librbd::util::create_rados_callback; template MirrorStatusUpdater::MirrorStatusUpdater( librados::IoCtx& io_ctx, Threads *threads, - const std::string& site_name) + const std::string& site_name, const std::string& fsid) : m_io_ctx(io_ctx), m_threads(threads), m_site_name(site_name), - m_lock(ceph::make_mutex("rbd::mirror::MirrorStatusUpdater " + - stringify(m_io_ctx.get_id()))) { + m_fsid(fsid), m_lock(ceph::make_mutex("rbd::mirror::MirrorStatusUpdater " + + stringify(m_io_ctx.get_id()))) { dout(10) << "site_name=" << site_name << ", " + << "fsid=" << fsid << ", " << "pool_id=" << m_io_ctx.get_id() << dendl; } @@ -49,16 +50,6 @@ template void MirrorStatusUpdater::init(Context* on_finish) { dout(10) << dendl; - if (!m_site_name.empty()) { - librados::Rados rados(m_io_ctx); - int r = rados.cluster_fsid(&m_fsid); - if (r < 0) { - derr << "failed to retrieve fsid: " << cpp_strerror(r) << dendl; - m_threads->work_queue->queue(on_finish, r); - return; - } - } - ceph_assert(!m_initialized); m_initialized = true; diff --git a/src/tools/rbd_mirror/MirrorStatusUpdater.h b/src/tools/rbd_mirror/MirrorStatusUpdater.h index 90e4697953c..7615cc4c8f5 100644 --- a/src/tools/rbd_mirror/MirrorStatusUpdater.h +++ b/src/tools/rbd_mirror/MirrorStatusUpdater.h @@ -27,12 +27,13 @@ public: static MirrorStatusUpdater* create(librados::IoCtx& io_ctx, Threads *threads, - const std::string& site_name) { - return new MirrorStatusUpdater(io_ctx, threads, site_name); + const std::string& site_name, + const std::string& fsid) { + return new MirrorStatusUpdater(io_ctx, threads, site_name, fsid); } MirrorStatusUpdater(librados::IoCtx& io_ctx, Threads *threads, - const std::string& site_name); + const std::string& site_name, const std::string& fsid); ~MirrorStatusUpdater(); void init(Context* on_finish); diff --git a/src/tools/rbd_mirror/NamespaceReplayer.cc b/src/tools/rbd_mirror/NamespaceReplayer.cc index 983682159dc..ec4d1006757 100644 --- a/src/tools/rbd_mirror/NamespaceReplayer.cc +++ b/src/tools/rbd_mirror/NamespaceReplayer.cc @@ -262,7 +262,7 @@ void NamespaceReplayer::init_local_status_updater() { ceph_assert(!m_local_status_updater); m_local_status_updater.reset(MirrorStatusUpdater::create( - m_local_io_ctx, m_threads, "")); + m_local_io_ctx, m_threads, "", "")); auto ctx = create_context_callback< NamespaceReplayer, &NamespaceReplayer::handle_init_local_status_updater>(this); @@ -297,8 +297,18 @@ void NamespaceReplayer::init_remote_status_updater() { ceph_assert(ceph_mutex_is_locked(m_lock)); ceph_assert(!m_remote_status_updater); + librados::Rados rados(m_local_io_ctx); + std::string local_fsid; + int r = rados.cluster_fsid(&local_fsid); + if (r < 0) { + derr << "failed to retrieve local fsid: " << cpp_strerror(r) << dendl; + m_ret_val = r; + shut_down_local_status_updater(); + return; + } + m_remote_status_updater.reset(MirrorStatusUpdater::create( - m_remote_io_ctx, m_threads, m_local_site_name)); + m_remote_io_ctx, m_threads, m_local_site_name, local_fsid)); auto ctx = create_context_callback< NamespaceReplayer, &NamespaceReplayer::handle_init_remote_status_updater>(this);