From: Kotresh HR Date: Sat, 20 Jun 2026 05:33:49 +0000 (+0530) Subject: tools/cephfs_mirror: Persist metrics to omap X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c5dd50967036529c819ecdad7bb86705a15f61c6;p=ceph.git tools/cephfs_mirror: Persist metrics to omap Persist snapshot mirroring metrics to the cephfs_mirror object omap for the mgr/mirroring module to support status command. The tick thread only keeps omap up to date for in-progress syncs on registered directories. Persist explicitly when stats change so omap is updated before a directory unregisters: - snap delete/rename propagation (inc_deleted_snap / inc_renamed_snap) - after each successful snap sync (following set_last_synced_stat) - after sync_snaps failure (following _inc_failed_count) - after sync_perms failure (following _inc_failed_count) Without the explicit call sites, omap can keep stale live or idle state after sync completes or fails because directories leave m_registered before the next tick. Fixes: https://tracker.ceph.com/issues/76686 Signed-off-by: Kotresh HR --- diff --git a/src/tools/cephfs_mirror/PeerReplayer.cc b/src/tools/cephfs_mirror/PeerReplayer.cc index 6645374969c..06206e5c8cc 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.cc +++ b/src/tools/cephfs_mirror/PeerReplayer.cc @@ -1166,6 +1166,7 @@ int PeerReplayer::propagate_snap_deletes(const std::string &dir_root, return r; } inc_deleted_snap(dir_root); + persist_dir_sync_stat(dir_root); if (m_perf_counters) { m_perf_counters->inc(l_cephfs_mirror_peer_replayer_snaps_deleted); } @@ -1192,6 +1193,7 @@ int PeerReplayer::propagate_snap_renames( return r; } inc_renamed_snap(dir_root); + persist_dir_sync_stat(dir_root); if (m_perf_counters) { m_perf_counters->inc(l_cephfs_mirror_peer_replayer_snaps_renamed); } @@ -2849,6 +2851,7 @@ int PeerReplayer::do_sync_snaps(const std::string &dir_root) { } set_last_synced_stat(dir_root, it->first, it->second, duration); + persist_dir_sync_stat(dir_root); if (--snaps_per_cycle == 0) { break; } @@ -2878,6 +2881,11 @@ int PeerReplayer::sync_snaps(const std::string &dir_root, update_directory_current_sync_perf_counters(dir_perf, m_snap_sync_stats.at(dir_root)); } + if (r < 0) { + locker.unlock(); + persist_dir_sync_stat(dir_root); + locker.lock(); + } return r; } @@ -2898,6 +2906,18 @@ void PeerReplayer::run_tick() { for (const auto &kv : m_registered) { refresh_directory_current_sync_perf_counters(kv.first); } + + // persist sync stats to omap for registered directories + std::vector dirs; + dirs.reserve(m_registered.size()); + for (const auto &kv : m_registered) { + dirs.push_back(kv.first); + } + locker.unlock(); + for (const auto &dir_root : dirs) { + persist_dir_sync_stat(dir_root); + } + locker.lock(); } } @@ -2947,6 +2967,9 @@ void PeerReplayer::run(SnapshotReplayerThread *replayer) { update_directory_current_sync_perf_counters( dir_perf, m_snap_sync_stats.at(*dir_root)); } + locker.unlock(); + persist_dir_sync_stat(*dir_root); + locker.lock(); if (m_perf_counters) { m_perf_counters->inc(l_cephfs_mirror_peer_replayer_snap_sync_failures); }