From: Yan, Zheng Date: Thu, 21 Jul 2016 08:54:03 +0000 (+0800) Subject: mds: don't flush log when truncating client_writeable_range X-Git-Tag: v11.0.1~136^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5a8132855049ae53fa1439354cf099411533822d;p=ceph.git mds: don't flush log when truncating client_writeable_range Signed-off-by: Yan, Zheng --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 55aecb2fcde9..fe57e2db4200 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2151,7 +2151,9 @@ public: }; -void Locker::calc_new_client_ranges(CInode *in, uint64_t size, map& new_ranges) +void Locker::calc_new_client_ranges(CInode *in, uint64_t size, + map *new_ranges, + bool *max_increased) { inode_t *latest = in->get_projected_inode(); uint64_t ms; @@ -2168,10 +2170,12 @@ void Locker::calc_new_client_ranges(CInode *in, uint64_t size, mapclient_caps.end(); ++p) { if ((p->second->issued() | p->second->wanted()) & (CEPH_CAP_FILE_WR|CEPH_CAP_FILE_BUFFER)) { - client_writeable_range_t& nr = new_ranges[p->first]; + client_writeable_range_t& nr = (*new_ranges)[p->first]; nr.range.first = 0; if (latest->client_ranges.count(p->first)) { client_writeable_range_t& oldr = latest->client_ranges[p->first]; + if (ms > oldr.range.last) + *max_increased = true; nr.range.last = MAX(ms, oldr.range.last); nr.follows = oldr.follows; } else { @@ -2194,6 +2198,7 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock, map new_ranges; uint64_t size = latest->size; bool new_max = update_max; + bool max_increased = false; if (update_size) { new_size = size = MAX(size, new_size); @@ -2203,10 +2208,9 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock, } uint64_t client_range_size = update_max ? new_max_size : size; + calc_new_client_ranges(in, client_range_size, &new_ranges, &max_increased); - calc_new_client_ranges(in, client_range_size, new_ranges); - - if (latest->client_ranges != new_ranges) + if (max_increased || latest->client_ranges != new_ranges) new_max = true; if (!update_size && !new_max) { @@ -2299,7 +2303,7 @@ bool Locker::check_inode_max_size(CInode *in, bool force_wrlock, mut->auth_pin(in); // make max_size _increase_ timely - if (new_max) + if (max_increased) mds->mdlog->flush(); return true; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 3f77e5598f00..860c9c87b0de 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -252,7 +252,9 @@ protected: void file_update_finish(CInode *in, MutationRef& mut, bool share, client_t client, Capability *cap, MClientCaps *ack); public: - void calc_new_client_ranges(CInode *in, uint64_t size, map& new_ranges); + void calc_new_client_ranges(CInode *in, uint64_t size, + map* new_ranges, + bool *max_increased); bool check_inode_max_size(CInode *in, bool force_wrlock=false, bool update_size=false, uint64_t newsize=0, bool update_max=false, uint64_t newmax=0, diff --git a/src/mds/Server.cc b/src/mds/Server.cc index a2dcc97d0f91..445ca7e2b857 100644 --- a/src/mds/Server.cc +++ b/src/mds/Server.cc @@ -3820,7 +3820,8 @@ void Server::handle_client_setattr(MDRequestRef& mdr) // adjust client's max_size? map new_ranges; - mds->locker->calc_new_client_ranges(cur, pi->size, new_ranges); + bool max_increased = false; + mds->locker->calc_new_client_ranges(cur, pi->size, &new_ranges, &max_increased); if (pi->client_ranges != new_ranges) { dout(10) << " client_ranges " << pi->client_ranges << " -> " << new_ranges << dendl; pi->client_ranges = new_ranges;