From: Kotresh HR Date: Sun, 15 Feb 2026 04:00:25 +0000 (+0530) Subject: tools/cephfs_mirror: Store a reference of PeerReplayer object in SyncMechanism X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=9f9fee66820d229c2b755d906fa6bdae290aaf0a;p=ceph-ci.git tools/cephfs_mirror: Store a reference of PeerReplayer object in SyncMechanism Store a reference of PeerReplayer object in SyncMechanism. This allows SyncMechansim object to call functions of PeerReplayer. This is required in multiple places like handling shutdown/blocklist/cancel where should_backoff() needs to be called by syncm object while poppig dataq by data sync threads. Fixes: https://tracker.ceph.com/issues/73452 Signed-off-by: Kotresh HR --- diff --git a/src/tools/cephfs_mirror/PeerReplayer.cc b/src/tools/cephfs_mirror/PeerReplayer.cc index 69c3f1f9e6c..52b61d39bdd 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.cc +++ b/src/tools/cephfs_mirror/PeerReplayer.cc @@ -1306,18 +1306,19 @@ int PeerReplayer::sync_perms(const std::string& path) { return 0; } -PeerReplayer::SyncMechanism::SyncMechanism(std::string_view dir_root, +PeerReplayer::SyncMechanism::SyncMechanism(PeerReplayer& peer_replayer, std::string_view dir_root, MountRef local, MountRef remote, FHandles *fh, const Peer &peer, const Snapshot ¤t, boost::optional prev) - : m_local(local), + : m_peer_replayer(peer_replayer), + m_dir_root(dir_root), + m_local(local), m_remote(remote), m_fh(fh), m_peer(peer), m_current(current), m_prev(prev), - sdq_lock(ceph::make_mutex("cephfs::mirror::PeerReplayer::SyncMechanism" + stringify(peer.uuid))), - m_dir_root(dir_root) { + sdq_lock(ceph::make_mutex("cephfs::mirror::PeerReplayer::SyncMechanism" + stringify(peer.uuid))) { } PeerReplayer::SyncMechanism::~SyncMechanism() { @@ -1418,10 +1419,11 @@ int PeerReplayer::SyncMechanism::get_changed_blocks(const std::string &epath, return callback(block.num_blocks, block.b); } -PeerReplayer::SnapDiffSync::SnapDiffSync(std::string_view dir_root, MountRef local, MountRef remote, - FHandles *fh, const Peer &peer, const Snapshot ¤t, +PeerReplayer::SnapDiffSync::SnapDiffSync(PeerReplayer& peer_replayer, std::string_view dir_root, + MountRef local, MountRef remote, FHandles *fh, + const Peer &peer, const Snapshot ¤t, boost::optional prev) - : SyncMechanism(dir_root, local, remote, fh, peer, current, prev) { + : SyncMechanism(peer_replayer, dir_root, local, remote, fh, peer, current, prev) { } PeerReplayer::SnapDiffSync::~SnapDiffSync() { @@ -1728,11 +1730,11 @@ void PeerReplayer::SnapDiffSync::finish_sync(int ret) { mark_crawl_finished(ret); } -PeerReplayer::RemoteSync::RemoteSync(std::string_view dir_root, - MountRef local, MountRef remote, FHandles *fh, - const Peer &peer, const Snapshot ¤t, - boost::optional prev) - : SyncMechanism(dir_root, local, remote, fh, peer, current, prev) { +PeerReplayer::RemoteSync::RemoteSync(PeerReplayer& peer_replayer, std::string_view dir_root, + MountRef local, MountRef remote, FHandles *fh, + const Peer &peer, const Snapshot ¤t, + boost::optional prev) + : SyncMechanism(peer_replayer, dir_root, local, remote, fh, peer, current, prev) { } PeerReplayer::RemoteSync::~RemoteSync() { @@ -1906,11 +1908,10 @@ int PeerReplayer::do_synchronize(const std::string &dir_root, const Snapshot &cu std::shared_ptr syncm; if (fh.p_mnt == m_local_mount) { - syncm = std::make_shared(dir_root, m_local_mount, m_remote_mount, - &fh, m_peer, current, prev); - + syncm = std::make_shared(*this, dir_root, m_local_mount, m_remote_mount, + &fh, m_peer, current, prev); } else { - syncm = std::make_shared(dir_root, m_local_mount, m_remote_mount, + syncm = std::make_shared(*this, dir_root, m_local_mount, m_remote_mount, &fh, m_peer, current, boost::none); } diff --git a/src/tools/cephfs_mirror/PeerReplayer.h b/src/tools/cephfs_mirror/PeerReplayer.h index e294e5bd076..3bb16867ffb 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.h +++ b/src/tools/cephfs_mirror/PeerReplayer.h @@ -186,10 +186,10 @@ private: class SyncMechanism { public: - SyncMechanism(std::string_view dir_root, - MountRef local, MountRef remote, FHandles *fh, - const Peer &peer, /* keep dout happy */ - const Snapshot ¤t, boost::optional prev); + explicit SyncMechanism(PeerReplayer& peer_replayer, std::string_view dir_root, + MountRef local, MountRef remote, FHandles *fh, + const Peer &peer, /* keep dout happy */ + const Snapshot ¤t, boost::optional prev); virtual ~SyncMechanism() = 0; virtual int init_sync() = 0; @@ -265,6 +265,9 @@ private: int remote_mkdir(const std::string &epath, const struct ceph_statx &stx); protected: + PeerReplayer& m_peer_replayer; + // It's not used in RemoteSync but required to be accessed in datasync threads + std::string m_dir_root; MountRef m_local; MountRef m_remote; FHandles *m_fh; @@ -282,13 +285,11 @@ private: bool m_take_snapshot = false; bool m_datasync_error = false; int m_datasync_errno = 0; - // It's not used in RemoteSync but required to be accessed in datasync threads - std::string m_dir_root; }; class RemoteSync : public SyncMechanism { public: - RemoteSync(std::string_view dir_root, + RemoteSync(PeerReplayer& peer_replayer, std::string_view dir_root, MountRef local, MountRef remote, FHandles *fh, const Peer &peer, /* keep dout happy */ const Snapshot ¤t, boost::optional prev); @@ -305,8 +306,8 @@ private: class SnapDiffSync : public SyncMechanism { public: - SnapDiffSync(std::string_view dir_root, MountRef local, MountRef remote, - FHandles *fh, const Peer &peer, const Snapshot ¤t, + SnapDiffSync(PeerReplayer& peer_replayer, std::string_view dir_root, MountRef local, + MountRef remote, FHandles *fh, const Peer &peer, const Snapshot ¤t, boost::optional prev); ~SnapDiffSync();