From: Jeff Layton Date: Mon, 29 Aug 2016 11:16:40 +0000 (-0400) Subject: mds/client: keep change_attr in Inode, CapSnap and MClientCaps X-Git-Tag: v11.0.1~326^2~19 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d3ff304a7aab6563b0e5d45585fdb1cd64309d0f;p=ceph.git mds/client: keep change_attr in Inode, CapSnap and MClientCaps ...and pass it around appropriately. Signed-off-by: Jeff Layton --- diff --git a/src/client/Client.cc b/src/client/Client.cc index e0726aa7339..13c11a835be 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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; diff --git a/src/client/Client.h b/src/client/Client.h index 520f000a3e0..4413d4b4591 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -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, diff --git a/src/client/Inode.cc b/src/client/Inode.cc index 08d6ab31e44..0fd6c0fbab7 100644 --- a/src/client/Inode.cc +++ b/src/client/Inode.cc @@ -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()) { diff --git a/src/client/Inode.h b/src/client/Inode.h index 28fc439a429..e15c48cff05 100644 --- a/src/client/Inode.h +++ b/src/client/Inode.h @@ -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), diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 365f3ab812e..d24aab64ced 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -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) { diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 3ca5efae1f0..b65dd9f286d 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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(); diff --git a/src/messages/MClientCaps.h b/src/messages/MClientCaps.h index a210e44284f..7153f7fbbc0 100644 --- a/src/messages/MClientCaps.h +++ b/src/messages/MClientCaps.h @@ -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); } };