]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: notify the xattr_version to replica MDSes 47056/head
authorXiubo Li <xiubli@redhat.com>
Wed, 1 Jun 2022 02:32:58 +0000 (10:32 +0800)
committerXiubo Li <xiubli@redhat.com>
Tue, 30 Aug 2022 02:44:30 +0000 (10:44 +0800)
When one client changes a xattr's value in the auth MDS, when replying
to the client the MDS possibly will drop the increased xattr_version
and new value in the reply message if no 'Xs' caps will be issued to
the client together.

And when the client wants to get this xattr's value, and if it sends
the request to a replicated MDS, since the replicated MDS still has
the old value of the xattr_version, and then the client will drop the
xattr value since xattr_version is not changed.

We need to notify the xattr_version to the replicated MDSes together
with the xattrs when notifying the lock state.

Fixes: https://tracker.ceph.com/issues/55331
Signed-off-by: Xiubo Li <xiubli@redhat.com>
(cherry picked from commit 363ee982f6513af2c018f14a02b73338fa9fc03b)

src/mds/CInode.cc

index 0bda8400f6162b99068572eab209ebbecfd89044..7356e7d332046996df4ce10b11326d6155085f05 100644 (file)
@@ -2024,10 +2024,11 @@ void CInode::decode_lock_inest(bufferlist::const_iterator& p)
 
 void CInode::encode_lock_ixattr(bufferlist& bl)
 {
-  ENCODE_START(1, 1, bl);
+  ENCODE_START(2, 1, bl);
   encode(get_inode()->version, bl);
   encode(get_inode()->ctime, bl);
   encode_xattrs(bl);
+  encode(get_inode()->xattr_version, bl);
   ENCODE_FINISH(bl);
 }
 
@@ -2035,13 +2036,16 @@ void CInode::decode_lock_ixattr(bufferlist::const_iterator& p)
 {
   ceph_assert(!is_auth());
   auto _inode = allocate_inode(*get_inode());
-  DECODE_START(1, p);
+  DECODE_START(2, p);
   decode(_inode->version, p);
   utime_t tm;
   decode(tm, p);
   if (_inode->ctime < tm)
     _inode->ctime = tm;
   decode_xattrs(p);
+  if (struct_v >= 2) {
+    decode(_inode->xattr_version, p);
+  }
   DECODE_FINISH(p);
   reset_inode(std::move(_inode));
 }