From: VinayBhaskar-V Date: Wed, 30 Jul 2025 10:10:27 +0000 (+0000) Subject: test/rbd-mirror: eliminate a race in ResyncRequestedRemoteNotPrimary X-Git-Tag: v20.1.1~108^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fb8ade526e4dd9c2311141a203b0e855a0224a02;p=ceph.git test/rbd-mirror: eliminate a race in ResyncRequestedRemoteNotPrimary Adjust the wait_for_notification call in TestMockImageReplayerSnapshotReplayer.ResyncRequestedRemoteNotPrimary to expect 2 notifications instead of 1. This allows the test to correctly wait for both expected events i.e for finish_sync() and handle_replay_complete(locker, -EREMOTEIO, "remote image demoted"), ensuring the replayer transitions to STATE_COMPLETE and is_replaying() returns false as intended. Fixes: https://tracker.ceph.com/issues/72325 Signed-off-by: VinayBhaskar-V (cherry picked from commit b5a013f6170bb4445da8f5469243e4869b760a81) --- diff --git a/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc b/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc index dff9cd4b65c..21afa6d52bb 100644 --- a/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc +++ b/src/test/rbd_mirror/image_replayer/snapshot/test_mock_Replayer.cc @@ -1787,6 +1787,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, ResyncRequested) { mock_replayer_listener, mock_image_meta, &update_watch_ctx)); + // inject a primary snapshot mock_remote_image_ctx.snap_info = { {1U, librbd::SnapInfo{"snap1", cls::rbd::MirrorSnapshotNamespace{ @@ -1803,6 +1804,7 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, ResyncRequested) { // wait for sync to complete and expect replay complete ASSERT_EQ(0, wait_for_notification(1)); + ASSERT_TRUE(mock_replayer.is_resync_requested()); ASSERT_FALSE(mock_replayer.is_replaying()); ASSERT_EQ(0, shut_down_entry_replayer(mock_replayer, mock_threads, @@ -1876,6 +1878,8 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, ResyncRequestedRemoteNotPrimary) { mock_local_image_ctx, 11, true, 0, 0); expect_notify_update(mock_local_image_ctx); expect_notify_sync_complete(mock_instance_watcher, mock_local_image_ctx.id); + + // idle expect_load_image_meta(mock_image_meta, true, 0); expect_is_refresh_required(mock_remote_image_ctx, false); expect_is_refresh_required(mock_local_image_ctx, true); @@ -1890,7 +1894,8 @@ TEST_F(TestMockImageReplayerSnapshotReplayer, ResyncRequestedRemoteNotPrimary) { // wake-up replayer update_watch_ctx->handle_notify(); - ASSERT_EQ(0, wait_for_notification(1)); + ASSERT_EQ(0, wait_for_notification(2)); + ASSERT_FALSE(mock_replayer.is_resync_requested()); ASSERT_FALSE(mock_replayer.is_replaying()); ASSERT_EQ(0, shut_down_entry_replayer(mock_replayer, mock_threads,