]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds: rebuild snaprealm cache if last_modified or change_attr changed
authorDhairya Parmar <dparmar@redhat.com>
Wed, 23 Jul 2025 13:12:47 +0000 (18:42 +0530)
committerDhairya Parmar <dparmar@redhat.com>
Thu, 25 Sep 2025 15:27:02 +0000 (20:57 +0530)
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 <dparmar@redhat.com>
src/mds/SnapRealm.cc
src/mds/SnapRealm.h

index 03f30f45615120cb90ec3f3c90d1ca55b0064b19..3e427c157af19edf19ed290c1f53effbb3e13b55 100644 (file)
@@ -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;
 }
 
index 02ff8cb4282d71bc49b3824b8dcc6e0500fe8380..3dbfc0fcb506b1e7bad3b49d16a811dd0d33b109 100644 (file)
@@ -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);