From: Prasanna Kumar Kalever Date: Tue, 4 Mar 2025 14:26:33 +0000 (+0530) Subject: rbd_mirror: avoid rescans in busy loop to detect new snapshots X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=759b521bc679be1059acebca19eb23c59f173949;p=ceph.git rbd_mirror: avoid rescans in busy loop to detect new snapshots Instead move the state to STATE_IDLE once the snapshot limits cannot be met and move back to STATE_REPLAYING on a call from group_replayer to set_remote_snap_id_end_limit() Signed-off-by: Prasanna Kumar Kalever --- diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc index 44cddab092011..ed502f8ce310b 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.cc @@ -760,8 +760,14 @@ void Replayer::scan_remote_mirror_snapshots( auto limit = get_remote_snap_id_end_limit(); if (limit != CEPH_NOSNAP && limit >= m_remote_snap_id_end) { copy_snapshots(); - } else { - load_local_image_meta(); + return; + } + dout(10) << "idling waiting for change in snapshot limits" << dendl; + { + std::unique_lock locker{m_lock}; + ceph_assert(m_state == STATE_REPLAYING); + m_state = STATE_IDLE; + notify_status_updated(); } } return; diff --git a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h index 720812a4f1dc1..46c2ca1129a0f 100644 --- a/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h +++ b/src/tools/rbd_mirror/image_replayer/snapshot/Replayer.h @@ -105,8 +105,14 @@ public: } void set_remote_snap_id_end_limit(uint64_t snap_id) { - std::unique_lock locker(m_lock); - m_remote_group_image_snap_id = snap_id; + { + std::unique_lock locker(m_lock); + m_remote_group_image_snap_id = snap_id; + if (m_state != STATE_IDLE) { + return; + } + } + handle_image_update_notify(); } uint64_t get_remote_snap_id_end_limit() {