From: Milind Changire Date: Thu, 9 Feb 2023 09:27:14 +0000 (+0530) Subject: cephfs_mirror: sync snap dir root mode with remote dir X-Git-Tag: v17.2.7~322^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=74d86bd4431192640654a52bb2c80dc0847237e0;p=ceph.git 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) --- diff --git a/src/tools/cephfs_mirror/PeerReplayer.cc b/src/tools/cephfs_mirror/PeerReplayer.cc index 66a141f8578d..bd47046bb121 100644 --- a/src/tools/cephfs_mirror/PeerReplayer.cc +++ b/src/tools/cephfs_mirror/PeerReplayer.cc @@ -1128,6 +1128,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; @@ -1499,8 +1520,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 d45d3087e8d4..0511d154a759 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