From c9a3e3be7ddc31992167d55de12bbe6849447b43 Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 8 Jun 2016 12:49:04 -0400 Subject: [PATCH] rbd-mirror: refresh image after creating sync point snapshot Fixes: http://tracker.ceph.com/issues/16196 Signed-off-by: Jason Dillaman --- .../test_mock_SyncPointCreateRequest.cc | 3 +++ .../image_sync/SyncPointCreateRequest.cc | 24 +++++++++++++++++++ .../image_sync/SyncPointCreateRequest.h | 6 +++++ 3 files changed, 33 insertions(+) diff --git a/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc b/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc index 75c64797a79f5..faff6a73e906a 100644 --- a/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc +++ b/src/test/rbd_mirror/image_sync/test_mock_SyncPointCreateRequest.cc @@ -79,6 +79,7 @@ TEST_F(TestMockImageSyncSyncPointCreateRequest, Success) { expect_update_client(mock_journaler, 0); expect_image_refresh(mock_remote_image_ctx, 0); expect_snap_create(mock_remote_image_ctx, 0); + expect_image_refresh(mock_remote_image_ctx, 0); C_SaferCond ctx; MockSyncPointCreateRequest *req = create_request(mock_remote_image_ctx, @@ -100,6 +101,7 @@ TEST_F(TestMockImageSyncSyncPointCreateRequest, ResyncSuccess) { expect_update_client(mock_journaler, 0); expect_image_refresh(mock_remote_image_ctx, 0); expect_snap_create(mock_remote_image_ctx, 0); + expect_image_refresh(mock_remote_image_ctx, 0); C_SaferCond ctx; MockSyncPointCreateRequest *req = create_request(mock_remote_image_ctx, @@ -123,6 +125,7 @@ TEST_F(TestMockImageSyncSyncPointCreateRequest, SnapshotExists) { expect_update_client(mock_journaler, 0); expect_image_refresh(mock_remote_image_ctx, 0); expect_snap_create(mock_remote_image_ctx, 0); + expect_image_refresh(mock_remote_image_ctx, 0); C_SaferCond ctx; MockSyncPointCreateRequest *req = create_request(mock_remote_image_ctx, diff --git a/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.cc b/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.cc index 102d48908ddad..2c344bad1ad5b 100644 --- a/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.cc +++ b/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.cc @@ -138,6 +138,30 @@ void SyncPointCreateRequest::handle_create_snap(int r) { return; } + send_final_refresh_image(); +} + +template +void SyncPointCreateRequest::send_final_refresh_image() { + dout(20) << dendl; + + Context *ctx = create_context_callback< + SyncPointCreateRequest, + &SyncPointCreateRequest::handle_final_refresh_image>(this); + m_remote_image_ctx->state->refresh(ctx); +} + +template +void SyncPointCreateRequest::handle_final_refresh_image(int r) { + dout(20) << ": r=" << r << dendl; + + if (r < 0) { + derr << ": failed to refresh image for snapshot: " << cpp_strerror(r) + << dendl; + finish(r); + return; + } + finish(0); } diff --git a/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.h b/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.h index 0aef0f8de648b..45275ec4e2fb5 100644 --- a/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.h +++ b/src/tools/rbd_mirror/image_sync/SyncPointCreateRequest.h @@ -56,6 +56,9 @@ private: * CREATE_SNAP . . . . * | * v + * REFRESH_IMAGE + * | + * v * * * @endverbatim @@ -78,6 +81,9 @@ private: void send_create_snap(); void handle_create_snap(int r); + void send_final_refresh_image(); + void handle_final_refresh_image(int r); + void finish(int r); }; -- 2.39.5