From 989149041426433cc6fc60f4e97f54e3b6917a6d Mon Sep 17 00:00:00 2001 From: N Balachandran Date: Thu, 22 Aug 2024 13:45:36 +0530 Subject: [PATCH] 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) --- src/test/rbd_mirror/test_mock_PoolReplayer.cc | 10 ++++++++++ src/tools/rbd_mirror/PoolReplayer.cc | 6 +++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/test/rbd_mirror/test_mock_PoolReplayer.cc b/src/test/rbd_mirror/test_mock_PoolReplayer.cc index 5a7d2348a1779..69fe799314810 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 87001b8af45c0..bed01e9ed4e25 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; -- 2.39.5