From b47f88732fc31027305b069e4a9dba3ebed2f080 Mon Sep 17 00:00:00 2001 From: Dhairya Parmar Date: Wed, 23 Jul 2025 18:42:47 +0530 Subject: [PATCH] mds: rebuild snaprealm cache if last_modified or change_attr changed MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit For the server side snapdir visibility changes to be transported to the client — SnapRealm cache needs to be rebuilt otherwise the same metadata would be sent via the send_snap_update() in C_MDS_inode_update_finish() while setting the `ceph.dir.subvolume.snaps.visible` vxattr. The condition used to check for the `seq` and `last_destroyed` against their cached values but for the vxattr change, it's a rather non-feasible heavylifting to update the `seq` which involves a set of steps to prepare the op, commit the op, journal the changes and update snap-server/client(s) just for a mere flag update (and updating last_destroyed anyway doesn't make sense for this case). So, compare last_modified and change_attr with their cached values to check if the SnapRealm cache should be rebuilt. These values are incremented in the Server::handle_client_setvxattr while toggling the snapshot visibility xattr and this would enforce a cache rebuild. Fixes: https://tracker.ceph.com/issues/71740 Signed-off-by: Dhairya Parmar --- src/mds/SnapRealm.cc | 11 ++++++++++- src/mds/SnapRealm.h | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/mds/SnapRealm.cc b/src/mds/SnapRealm.cc index 03f30f45615..3e427c157af 100644 --- a/src/mds/SnapRealm.cc +++ b/src/mds/SnapRealm.cc @@ -117,6 +117,8 @@ void SnapRealm::check_cache() const snapid_t seq; snapid_t last_created; snapid_t last_destroyed = mdcache->mds->snapclient->get_last_destroyed(); + utime_t last_modified = srnode.last_modified; + uint64_t change_attr = srnode.change_attr; if (global || srnode.is_parent_global()) { last_created = mdcache->mds->snapclient->get_last_created(); seq = std::max(last_created, last_destroyed); @@ -125,14 +127,19 @@ void SnapRealm::check_cache() const seq = srnode.seq; } if (cached_seq >= seq && - cached_last_destroyed == last_destroyed) + cached_last_destroyed == last_destroyed && + cached_last_modified == last_modified && + cached_change_attr >= change_attr) { return; + } cached_snap_context.clear(); cached_seq = seq; cached_last_created = last_created; cached_last_destroyed = last_destroyed; + cached_last_modified = last_modified; + cached_change_attr = change_attr; cached_subvolume_ino = 0; if (parent) @@ -149,6 +156,8 @@ void SnapRealm::check_cache() const << " cached_seq " << cached_seq << " cached_last_created " << cached_last_created << " cached_last_destroyed " << cached_last_destroyed + << " cached_last_modified " << cached_last_modified + << " cached_change_attr " << cached_change_attr << ")" << dendl; } diff --git a/src/mds/SnapRealm.h b/src/mds/SnapRealm.h index 02ff8cb4282..3dbfc0fcb50 100644 --- a/src/mds/SnapRealm.h +++ b/src/mds/SnapRealm.h @@ -151,6 +151,8 @@ private: mutable ceph::buffer::list cached_snap_trace; mutable ceph::buffer::list cached_snap_trace_new; mutable inodeno_t cached_subvolume_ino = 0; + mutable utime_t cached_last_modified = utime_t(); + mutable uint64_t cached_change_attr = 0; }; std::ostream& operator<<(std::ostream& out, const SnapRealm &realm); -- 2.39.5