]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't flush log when truncating client_writeable_range
authorYan, Zheng <zyan@redhat.com>
Thu, 21 Jul 2016 08:54:03 +0000 (16:54 +0800)
committerYan, Zheng <zyan@redhat.com>
Fri, 22 Jul 2016 02:24:41 +0000 (10:24 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/Locker.cc
src/mds/Locker.h
src/mds/Server.cc

index 55aecb2fcde9b69b0cb063029bb7a897f8ba92fe..fe57e2db420092f3d13570df7acfbcd95ee53e07 100644 (file)
@@ -2151,7 +2151,9 @@ public:
 };
 
 
-void Locker::calc_new_client_ranges(CInode *in, uint64_t size, map<client_t,client_writeable_range_t>& new_ranges)
+void Locker::calc_new_client_ranges(CInode *in, uint64_t size,
+                                   map<client_t,client_writeable_range_t> *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, map<client_t,clie
        p != in->client_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<client_t, client_writeable_range_t> 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;
index 3f77e5598f00287ba7f82e1d6421c84cc762d007..860c9c87b0dea82e54608b5c224648eb906149dc 100644 (file)
@@ -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<client_t, client_writeable_range_t>& new_ranges);
+  void calc_new_client_ranges(CInode *in, uint64_t size,
+                             map<client_t, client_writeable_range_t>* 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,
index a2dcc97d0f91831d9513b18ff8b49031f1433345..445ca7e2b857c7a150a15990ab4093fe1cd936f9 100644 (file)
@@ -3820,7 +3820,8 @@ void Server::handle_client_setattr(MDRequestRef& mdr)
 
     // adjust client's max_size?
     map<client_t,client_writeable_range_t> 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;