From: N Balachandran Date: Thu, 22 Aug 2024 08:15:36 +0000 (+0530) Subject: rbd-mirror: use correct ioctx for namespace X-Git-Tag: v20.0.0~1184^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F59401%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 --- 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 cb88e6e96f7d..dcbedc67e423 100644 --- a/src/tools/rbd_mirror/PoolReplayer.cc +++ b/src/tools/rbd_mirror/PoolReplayer.cc @@ -747,8 +747,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;