From 9970e49ab5ced79be0e460600405254d7c5a0e5b Mon Sep 17 00:00:00 2001 From: Jason Dillaman Date: Wed, 18 Mar 2020 14:47:50 -0400 Subject: [PATCH] rbd-mirror: don't prematurely finish snapshot replay loop The unlink step was being incorrectly skipped if a state machine shut down was requested. Signed-off-by: Jason Dillaman --- .../image_replayer/snapshot/Replayer.cc | 22 ++++++++++--------- .../image_replayer/snapshot/Replayer.h | 2 ++ 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc index fc62e41611283..55083c610197d 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc @@ -900,22 +900,13 @@ void Replayer::handle_notify_image_update(int r) { derr << "failed to notify local image update: " << cpp_strerror(r) << dendl; } - if (is_replay_interrupted()) { - return; - } - unlink_peer(); } template void Replayer::unlink_peer() { if (m_remote_snap_id_start == 0) { - { - std::unique_lock locker{m_lock}; - notify_status_updated(); - } - - load_local_image_meta(); + finish_sync(); return; } @@ -942,11 +933,22 @@ void Replayer::handle_unlink_peer(int r) { return; } + finish_sync(); +} + +template +void Replayer::finish_sync() { + dout(10) << dendl; + { std::unique_lock locker{m_lock}; notify_status_updated(); } + if (is_replay_interrupted()) { + return; + } + load_local_image_meta(); } diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h index fae097b1fcba0..f0b1fccd56be4 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h @@ -263,6 +263,8 @@ private: void unlink_peer(); void handle_unlink_peer(int r); + void finish_sync(); + void register_local_update_watcher(); void handle_register_local_update_watcher(int r); -- 2.39.5