From: N Balachandran Date: Thu, 22 Aug 2024 08:15:36 +0000 (+0530) Subject: rbd-mirror: use correct ioctx for namespace X-Git-Tag: testing/wip-mchangir-testing-20240828.085847-main-debug~1^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=2346cd912ee2c5aefe5b203cc872e0528fc96a49;p=ceph-ci.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 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;