]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: include snapshot metadata in trace reply to client
authorVenky Shankar <vshankar@redhat.com>
Mon, 19 Oct 2020 09:38:47 +0000 (05:38 -0400)
committerVenky Shankar <vshankar@redhat.com>
Thu, 17 Dec 2020 18:07:48 +0000 (13:07 -0500)
MDS sends (custom user) metadata associated with a snapshot in
trace reply to the client. This is required to implement API for
fetching snapshot info (snap-id, metadata, etc...).

Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/client/Client.cc
src/client/Inode.h
src/mds/CInode.cc
src/messages/MClientReply.h

index ec109470a0d7b362be8eb403807fe6098e180bd6..3bf2e836f866ff34a21de5d5a43e47a47d66adfe 100644 (file)
@@ -899,6 +899,7 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
     in->gid = st->gid;
     in->btime = st->btime;
     in->snap_btime = st->snap_btime;
+    in->snap_metadata = st->snap_metadata;
   }
 
   if ((new_version || (new_issued & CEPH_CAP_LINK_SHARED)) &&
index 5d5cae562ec7e245a664b11dd75deb48b06884ee..797eb063eefdde0459e32a7e8fda1b8247c818cc 100644 (file)
@@ -159,6 +159,7 @@ struct Inode {
   version_t version;           // auth only
   version_t xattr_version;
   utime_t   snap_btime;        // snapshot creation (birth) time
+  std::map<std::string, std::string> snap_metadata;
 
   // inline data
   version_t  inline_version;
index 182c77b0c7b67d4b62ed702075d627fb23904332..7ae8057c881cc3be39f9917432791a635e9cb438 100644 (file)
@@ -3725,6 +3725,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session,
   }
 
   utime_t snap_btime;
+  std::map<std::string, std::string> snap_metadata;
   SnapRealm *realm = find_snaprealm();
   if (snapid != CEPH_NOSNAP && realm) {
     // add snapshot timestamp vxattr
@@ -3736,6 +3737,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session,
       ceph_assert(infomap.size() == 1);
       const SnapInfo *si = infomap.begin()->second;
       snap_btime = si->stamp;
+      snap_metadata = si->metadata;
     }
   }
 
@@ -3995,7 +3997,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session,
    * note: encoding matches MClientReply::InodeStat
    */
   if (session->info.has_feature(CEPHFS_FEATURE_REPLY_ENCODING)) {
-    ENCODE_START(4, 1, bl);
+    ENCODE_START(5, 1, bl);
     encode(oi->ino, bl);
     encode(snapid, bl);
     encode(oi->rdev, bl);
@@ -4039,6 +4041,7 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session,
     encode(file_i->export_pin, bl);
     encode(snap_btime, bl);
     encode(file_i->rstat.rsnaps, bl);
+    encode(snap_metadata, bl);
     ENCODE_FINISH(bl);
   }
   else {
index 92ccccb86db47af5fa3ec770cfe497b3f13388cd..4fb8c19d8d078397a035f2fa074c8676b5b4b585 100644 (file)
@@ -135,6 +135,7 @@ struct InodeStat {
   quota_info_t quota;
 
   mds_rank_t dir_pin;
+  std::map<std::string,std::string> snap_metadata;
 
  public:
   InodeStat() {}
@@ -145,7 +146,7 @@ struct InodeStat {
   void decode(ceph::buffer::list::const_iterator &p, const uint64_t features) {
     using ceph::decode;
     if (features == (uint64_t)-1) {
-      DECODE_START(4, p);
+      DECODE_START(5, p);
       decode(vino.ino, p);
       decode(vino.snapid, p);
       decode(rdev, p);
@@ -196,6 +197,9 @@ struct InodeStat {
       if (struct_v >= 4) {
         decode(rstat.rsnaps, p);
       } // else remains zero
+      if (struct_v >= 5) {
+        decode(snap_metadata, p);
+      }
       DECODE_FINISH(p);
     }
     else {