From 2346cd912ee2c5aefe5b203cc872e0528fc96a49 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 --- 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 5a7d2348a17..69fe7993148 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 cb88e6e96f7..dcbedc67e42 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; -- 2.39.5