From 80f7f4e96ab06a0d0e8c1202d34cd407d0734771 Mon Sep 17 00:00:00 2001 From: Milind Changire Date: Thu, 9 Feb 2023 14:57:14 +0530 Subject: [PATCH] cephfs_mirror: sync snap dir root mode with remote dir Fixes: https://tracker.ceph.com/issues/58678 Signed-off-by: Milind Changire (cherry picked from commit f44b28416ab463c0c1bda6a58e2172ec41724c15) --- src/tools/cephfs_mirror/PeerReplayer.cc | 30 +++++++++++++++++++++++-- src/tools/cephfs_mirror/PeerReplayer.h | 1 + 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/tools/cephfs_mirror/PeerReplayer.cc b/src/tools/cephfs_mirror/PeerReplayer.cc index aaf97b8684c47..6ff1c057e3c6d 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.cc +++ b/src/tools/cephfs_mirror/PeerReplayer.cc @@ -1125,6 +1125,27 @@ int PeerReplayer::pre_sync_check_and_open_handles( return 0; } +// sync the mode of the remote dir_root with that of the local dir_root +int PeerReplayer::sync_perms(const std::string& path) { + int r = 0; + struct ceph_statx tstx; + + r = ceph_statx(m_local_mount, path.c_str(), &tstx, CEPH_STATX_MODE, + AT_STATX_DONT_SYNC | AT_SYMLINK_NOFOLLOW); + if (r < 0) { + derr << ": failed to fetch stat for local path: " + << cpp_strerror(r) << dendl; + return r; + } + r = ceph_chmod(m_remote_mount, path.c_str(), tstx.stx_mode); + if (r < 0) { + derr << ": failed to set mode for remote path: " + << cpp_strerror(r) << dendl; + return r; + } + return 0; +} + void PeerReplayer::post_sync_close_handles(const FHandles &fh) { dout(20) << dendl; @@ -1496,8 +1517,13 @@ void PeerReplayer::run(SnapshotReplayerThread *replayer) { dout(5) << ": picked dir_root=" << *dir_root << dendl; int r = register_directory(*dir_root, replayer); if (r == 0) { - sync_snaps(*dir_root, locker); - unregister_directory(*dir_root); + r = sync_perms(*dir_root); + if (r < 0) { + _inc_failed_count(*dir_root); + } else { + sync_snaps(*dir_root, locker); + } + unregister_directory(*dir_root); } } diff --git a/src/tools/cephfs_mirror/PeerReplayer.h b/src/tools/cephfs_mirror/PeerReplayer.h index 886c9532944b8..10768f3761f35 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.h +++ b/src/tools/cephfs_mirror/PeerReplayer.h @@ -311,6 +311,7 @@ private: const FHandles &fh, bool need_data_sync, bool need_attr_sync); int copy_to_remote(const std::string &dir_root, const std::string &epath, const struct ceph_statx &stx, const FHandles &fh); + int sync_perms(const std::string& path); }; } // namespace mirror -- 2.39.5