]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mds/client: keep change_attr in Inode, CapSnap and MClientCaps
authorJeff Layton <jlayton@redhat.com>
Mon, 29 Aug 2016 11:16:40 +0000 (07:16 -0400)
committerJeff Layton <jlayton@redhat.com>
Mon, 29 Aug 2016 11:16:40 +0000 (07:16 -0400)
...and pass it around appropriately.

Signed-off-by: Jeff Layton <jlayton@redhat.com>
src/client/Client.cc
src/client/Client.h
src/client/Inode.cc
src/client/Inode.h
src/mds/CInode.cc
src/mds/Locker.cc
src/messages/MClientCaps.h

index e0726aa7339d051114c5ed01ceedfad2225a8691..13c11a835be55bb27578c4e1d5820b7876cd9eb6 100644 (file)
@@ -704,7 +704,7 @@ void Client::trim_dentry(Dentry *dn)
 
 void Client::update_inode_file_bits(Inode *in,
                                    uint64_t truncate_seq, uint64_t truncate_size,
-                                   uint64_t size,
+                                   uint64_t size, uint64_t change_attr,
                                    uint64_t time_warp_seq, utime_t ctime,
                                    utime_t mtime,
                                    utime_t atime,
@@ -770,6 +770,8 @@ void Client::update_inode_file_bits(Inode *in,
     ldout(cct, 30) << "Yay have enough caps to look at our times" << dendl;
     if (ctime > in->ctime) 
       in->ctime = ctime;
+    if (change_attr > in->change_attr)
+      in->change_attr = change_attr;
     if (time_warp_seq > in->time_warp_seq) {
       ldout(cct, 10) << "mds time_warp_seq " << time_warp_seq << " on inode " << *in
               << " is higher than local time_warp_seq "
@@ -889,9 +891,9 @@ Inode * Client::add_update_inode(InodeStat *st, utime_t from,
     }
 
     update_inode_file_bits(in, st->truncate_seq, st->truncate_size, st->size,
-                          st->time_warp_seq, st->ctime, st->mtime, st->atime,
-                          st->inline_version, st->inline_data,
-                          issued);
+                          st->change_attr, st->time_warp_seq, st->ctime,
+                          st->mtime, st->atime, st->inline_version,
+                          st->inline_data, issued);
   } else if (st->inline_version > in->inline_version) {
     in->inline_data = st->inline_data;
     in->inline_version = st->inline_version;
@@ -3237,6 +3239,7 @@ void Client::send_cap(Inode *in, MetaSession *session, Cap *cap,
   m->ctime = in->ctime;
   m->btime = in->btime;
   m->time_warp_seq = in->time_warp_seq;
+  m->change_attr = in->change_attr;
     
   if (flush & CEPH_CAP_FILE_WR) {
     m->inline_version = in->inline_version;
@@ -3445,6 +3448,7 @@ void Client::finish_cap_snap(Inode *in, CapSnap *capsnap, int used)
   capsnap->atime = in->atime;
   capsnap->ctime = in->ctime;
   capsnap->time_warp_seq = in->time_warp_seq;
+  capsnap->change_attr = in->change_attr;
 
   capsnap->dirty |= in->caps_dirty();
 
@@ -3533,6 +3537,7 @@ void Client::flush_snaps(Inode *in, bool all_again)
     m->mtime = capsnap->mtime;
     m->atime = capsnap->atime;
     m->time_warp_seq = capsnap->time_warp_seq;
+    m->change_attr = capsnap->change_attr;
 
     if (capsnap->dirty & CEPH_CAP_FILE_WR) {
       m->inline_version = in->inline_version;
@@ -4665,10 +4670,9 @@ void Client::handle_cap_trunc(MetaSession *session, Inode *in, MClientCaps *m)
   int issued = in->caps_issued(&implemented) | in->caps_dirty();
   issued |= implemented;
   update_inode_file_bits(in, m->get_truncate_seq(), m->get_truncate_size(),
-                         m->get_size(), m->get_time_warp_seq(), m->get_ctime(),
-                         m->get_mtime(), m->get_atime(),
-                         m->inline_version, m->inline_data,
-                         issued);
+                        m->get_size(), m->get_change_attr(), m->get_time_warp_seq(),
+                        m->get_ctime(), m->get_mtime(), m->get_atime(),
+                         m->inline_version, m->inline_data, issued);
   m->put();
 }
 
@@ -4890,7 +4894,8 @@ void Client::handle_cap_grant(MetaSession *session, Inode *in, Cap *cap, MClient
     in->xattr_version = m->head.xattr_version;
   }
   update_inode_file_bits(in, m->get_truncate_seq(), m->get_truncate_size(), m->get_size(),
-                        m->get_time_warp_seq(), m->get_ctime(), m->get_mtime(), m->get_atime(),
+                        m->get_change_attr(), m->get_time_warp_seq(), m->get_ctime(),
+                        m->get_mtime(), m->get_atime(),
                         m->inline_version, m->inline_data, issued);
 
   // max_size
@@ -9623,6 +9628,7 @@ Inode *Client::open_snapdir(Inode *diri)
     in->ctime = diri->ctime;
     in->btime = diri->btime;
     in->size = diri->size;
+    in->change_attr = diri->change_attr;
 
     in->dirfragtree.clear();
     in->snapdir_parent = diri;
index 520f000a3e09561dd9e51d4357cf483e006ba053..4413d4b459106e9a00639656a7a3e308ca7c1dea 100644 (file)
@@ -707,11 +707,10 @@ protected:
   void clear_dir_complete_and_ordered(Inode *diri, bool complete);
   void insert_readdir_results(MetaRequest *request, MetaSession *session, Inode *diri);
   Inode* insert_trace(MetaRequest *request, MetaSession *session);
-  void update_inode_file_bits(Inode *in,
-                             uint64_t truncate_seq, uint64_t truncate_size, uint64_t size,
-                             uint64_t time_warp_seq, utime_t ctime, utime_t mtime, utime_t atime,
-                             version_t inline_version, bufferlist& inline_data,
-                             int issued);
+  void update_inode_file_bits(Inode *in, uint64_t truncate_seq, uint64_t truncate_size, uint64_t size,
+                             uint64_t change_attr, uint64_t time_warp_seq, utime_t ctime,
+                             utime_t mtime, utime_t atime, version_t inline_version,
+                             bufferlist& inline_data, int issued);
   Inode *add_update_inode(InodeStat *st, utime_t ttl, MetaSession *session);
   Dentry *insert_dentry_inode(Dir *dir, const string& dname, LeaseStat *dlease, 
                              Inode *in, utime_t from, MetaSession *session,
index 08d6ab31e4440ebb988469d2388c80e54a93ecd9..0fd6c0fbab7a2c18ad0e0e100ddbcdbbcb9b1d0a 100644 (file)
@@ -359,6 +359,7 @@ void Inode::dump(Formatter *f) const
   f->dump_stream("mtime") << mtime;
   f->dump_stream("atime") << atime;
   f->dump_int("time_warp_seq", time_warp_seq);
+  f->dump_int("change_attr", change_attr);
 
   f->dump_object("layout", layout);
   if (is_dir()) {
index 28fc439a429f8cb61b6f7ae6423a6342b92b5cad..e15c48cff05d86070ed8018c0fccf0897567a5e1 100644 (file)
@@ -53,6 +53,7 @@ struct CapSnap {
   uint64_t size;
   utime_t ctime, btime, mtime, atime;
   version_t time_warp_seq;
+  uint64_t change_attr;
   uint32_t   mode;
   uid_t      uid;
   gid_t      gid;
@@ -66,9 +67,9 @@ struct CapSnap {
   uint64_t flush_tid;
 
   explicit CapSnap(Inode *i)
-    : in(i), issued(0), dirty(0),
-      size(0), time_warp_seq(0), mode(0), uid(0), gid(0), xattr_version(0),
-      inline_version(0), writing(false), dirty_data(false), flush_tid(0)
+    : in(i), issued(0), dirty(0), size(0), time_warp_seq(0), change_attr(0),
+      mode(0), uid(0), gid(0), xattr_version(0), inline_version(0),
+      writing(false), dirty_data(false), flush_tid(0)
   {}
 
   void dump(Formatter *f) const;
@@ -111,6 +112,7 @@ struct Inode {
   utime_t    mtime;   // file data modify time.
   utime_t    atime;   // file data access time.
   uint32_t   time_warp_seq;  // count of (potential) mtime/atime timewarps (i.e., utimes())
+  uint64_t   change_attr;
 
   uint64_t max_size;  // max size we can write to
 
@@ -227,8 +229,8 @@ struct Inode {
     : client(c), ino(vino.ino), snapid(vino.snapid), faked_ino(0),
       rdev(0), mode(0), uid(0), gid(0), nlink(0),
       size(0), truncate_seq(1), truncate_size(-1),
-      time_warp_seq(0), max_size(0), version(0), xattr_version(0),
-      inline_version(0), flags(0),
+      time_warp_seq(0), change_attr(0), max_size(0), version(0),
+      xattr_version(0), inline_version(0), flags(0),
       dir(0), dir_release_count(1), dir_ordered_count(1),
       dir_hashed(false), dir_replicated(false), auth_cap(NULL),
       cap_dirtier_uid(-1), cap_dirtier_gid(-1),
index 365f3ab812e85662d1ffdcd962454cdcdf054879..d24aab64ced608245d69e1d7ab03a5c45c26e921 100644 (file)
@@ -3392,6 +3392,7 @@ void CInode::encode_cap_message(MClientCaps *m, Capability *cap)
   m->mtime = i->mtime;
   m->atime = i->atime;
   m->ctime = i->ctime;
+  m->change_attr = i->change_attr;
   m->time_warp_seq = i->time_warp_seq;
 
   if (cap->client_inline_version < i->inline_data.version) {
index 3ca5efae1f073938a7840b5fd43c263a86930f7b..b65dd9f286dc46ba1a6fcf67401325ad3f6e6789 100644 (file)
@@ -2978,6 +2978,12 @@ void Locker::_update_cap_fields(CInode *in, int dirty, MClientCaps *m, inode_t *
     pi->ctime = m->get_ctime();
   }
 
+  if (dirty && m->get_change_attr() > pi->change_attr) {
+    dout(7) << "  change_attr " << pi->change_attr << " -> " << m->get_change_attr()
+           << " for " << *in << dendl;
+    pi->change_attr = m->get_change_attr();
+  }
+
   // file
   if (dirty & (CEPH_CAP_FILE_EXCL|CEPH_CAP_FILE_WR)) {
     utime_t atime = m->get_atime();
index a210e44284ff0f8ffdb9896b506f9b65da93a355..7153f7fbbc0f0966c76555e4aaf898e22008073d 100644 (file)
@@ -26,7 +26,7 @@ class MClientCaps : public Message {
  public:
   struct ceph_mds_caps_head head;
 
-  uint64_t size, max_size, truncate_size;
+  uint64_t size, max_size, truncate_size, change_attr;
   uint32_t truncate_seq;
   utime_t mtime, atime, ctime, btime;
   file_layout_t layout;
@@ -65,6 +65,7 @@ class MClientCaps : public Message {
   utime_t get_btime() { return btime; }
   utime_t get_mtime() { return mtime; }
   utime_t get_atime() { return atime; }
+  __u64 get_change_attr() { return change_attr; }
   __u32 get_time_warp_seq() { return time_warp_seq; }
 
   const file_layout_t& get_layout() {
@@ -111,6 +112,7 @@ class MClientCaps : public Message {
       size(0),
       max_size(0),
       truncate_size(0),
+      change_attr(0),
       truncate_seq(0),
       time_warp_seq(0),
       osd_epoch_barrier(0),
@@ -132,6 +134,7 @@ class MClientCaps : public Message {
       size(0),
       max_size(0),
       truncate_size(0),
+      change_attr(0),
       truncate_seq(0),
       time_warp_seq(0),
       osd_epoch_barrier(oeb),
@@ -157,6 +160,7 @@ class MClientCaps : public Message {
       size(0),
       max_size(0),
       truncate_size(0),
+      change_attr(0),
       truncate_seq(0),
       time_warp_seq(0),
       osd_epoch_barrier(oeb),
@@ -258,6 +262,7 @@ public:
     }
     if (header.version >= 9) {
       ::decode(btime, p);
+      ::decode(change_attr, p);
     }
   }
   void encode_payload(uint64_t features) {
@@ -316,6 +321,7 @@ public:
 
     ::encode(layout.pool_ns, payload);
     ::encode(btime, payload);
+    ::encode(change_attr, payload);
   }
 };