From: N Balachandran Date: Thu, 22 Aug 2024 08:15:36 +0000 (+0530) Subject: rbd-mirror: use correct ioctx for namespace X-Git-Tag: v17.2.8~81^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F59774%2Fhead;p=ceph.git rbd-mirror: use correct ioctx for namespace The PoolReplayer uses the ioctx for the default namespace to check if other namespaces are enabled for mirroring, causing it to incorrectly conclude that they are all enabled. Fixes: https://tracker.ceph.com/issues/67676 Signed-off-by: N Balachandran (cherry picked from commit 2346cd912ee2c5aefe5b203cc872e0528fc96a49) --- diff --git a/src/test/rbd_mirror/test_mock_PoolReplayer.cc b/src/test/rbd_mirror/test_mock_PoolReplayer.cc index 5a7d2348a177..69fe79931481 100644 --- a/src/test/rbd_mirror/test_mock_PoolReplayer.cc +++ b/src/test/rbd_mirror/test_mock_PoolReplayer.cc @@ -363,6 +363,14 @@ public: Return(0))); } + void expect_clone(librados::MockTestMemIoCtxImpl* mock_io_ctx) { + EXPECT_CALL(*mock_io_ctx, clone()) + .WillRepeatedly(Invoke([mock_io_ctx]() { + mock_io_ctx->get(); + return mock_io_ctx; + })); + } + void expect_leader_watcher_init(MockLeaderWatcher& mock_leader_watcher, int r) { EXPECT_CALL(mock_leader_watcher, init()) @@ -727,6 +735,7 @@ TEST_F(TestMockPoolReplayer, Namespaces) { auto mock_remote_rados_client = mock_cluster.do_create_rados_client( g_ceph_context); + expect_clone(mock_local_io_ctx); expect_mirror_mode_get(mock_local_io_ctx); InSequence seq; @@ -845,6 +854,7 @@ TEST_F(TestMockPoolReplayer, NamespacesError) { auto mock_remote_rados_client = mock_cluster.do_create_rados_client( g_ceph_context); + expect_clone(mock_local_io_ctx); expect_mirror_mode_get(mock_local_io_ctx); InSequence seq; diff --git a/src/tools/rbd_mirror/PoolReplayer.cc b/src/tools/rbd_mirror/PoolReplayer.cc index 87001b8af45c..bed01e9ed4e2 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -741,8 +741,12 @@ int PoolReplayer::list_mirroring_namespaces( } for (auto &name : names) { + librados::IoCtx ns_ioctx; + ns_ioctx.dup(m_local_io_ctx); + ns_ioctx.set_namespace(name); + cls::rbd::MirrorMode mirror_mode = cls::rbd::MIRROR_MODE_DISABLED; - int r = librbd::cls_client::mirror_mode_get(&m_local_io_ctx, &mirror_mode); + int r = librbd::cls_client::mirror_mode_get(&ns_ioctx, &mirror_mode); if (r < 0 && r != -ENOENT) { derr << "failed to get namespace mirror mode: " << cpp_strerror(r) << dendl;