]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: add reported_size
authorSage Weil <sage@newdream.net>
Fri, 16 May 2008 17:03:51 +0000 (10:03 -0700)
committerSage Weil <sage@newdream.net>
Fri, 16 May 2008 17:03:51 +0000 (10:03 -0700)
src/client/Client.cc
src/client/Client.h

index 2ed436ac9632c6baee0299654b087df6611370f6..368887edf6b2146c6e42cf3036fd2a7eeb79f25f 100644 (file)
@@ -324,8 +324,10 @@ void Client::update_inode_file_bits(Inode *in,
       dout(0) << "WARNING: " << *in << " mds time_warp_seq "
              << time_warp_seq << " > " << in->inode.time_warp_seq << dendl;
   } else if (issued & (CEPH_CAP_WR|CEPH_CAP_WRBUFFER)) {
-    if (size > in->inode.size)
+    if (size > in->inode.size) {
       in->inode.size = size;
+      in->reported_size = size;
+    }
     if (time_warp_seq > in->inode.time_warp_seq) {
       in->inode.ctime = ctime;
       in->inode.mtime = mtime;
@@ -342,6 +344,7 @@ void Client::update_inode_file_bits(Inode *in,
       warn = true;
   } else {
     in->inode.size = size;
+    in->reported_size = size;
     if (time_warp_seq >= in->inode.time_warp_seq) {
       in->inode.ctime = ctime;
       in->inode.mtime = mtime;
@@ -1368,9 +1371,9 @@ void Client::check_caps(Inode *in)
 
     /* approaching file_max? */
     if ((cap.issued & CEPH_CAP_WR) &&
-       (in->inode.size << 1) >= in->inode.max_size) {
-       //(in->i_reported_size << 1) < in->inode.max_size) {
-       dout(10) << "size approaching max_size" << dendl;
+       (in->inode.size << 1) >= in->inode.max_size &&
+       (in->reported_size << 1) < in->inode.max_size) {
+      dout(10) << "size approaching max_size" << dendl;
       goto ack;
     }
 
@@ -1391,6 +1394,7 @@ void Client::check_caps(Inode *in)
                                              it->second.seq,
                                              it->second.issued,
                                              wanted);
+    in->reported_size = in->inode.size;
     m->set_max_size(in->wanted_max_size);
     in->requested_max_size = in->wanted_max_size;
     messenger->send_message(m, mdsmap->get_inst(it->first));
@@ -1594,7 +1598,7 @@ void Client::handle_file_caps(MClientFileCaps *m)
       objectcacher->truncate_set(in->inode.ino, ls);
     }
 
-    in->inode.size = m->get_size(); 
+    in->reported_size = in->inode.size = m->get_size(); 
     delete m;
     return;
   }
@@ -3292,6 +3296,11 @@ int Client::_write(Fh *f, __s64 offset, __u64 size, const char *buf)
   // extend file?
   if (totalwritten + offset > in->inode.size) {
     in->inode.size = totalwritten + offset;
+    
+    if ((in->inode.size << 1) >= in->inode.max_size &&
+       (in->reported_size << 1) < in->inode.max_size)
+      check_caps(in);
+      
     dout(7) << "wrote to " << totalwritten+offset << ", extending file size" << dendl;
   } else {
     dout(7) << "wrote to " << totalwritten+offset << ", leaving file size at " << in->inode.size << dendl;
index e8c0e9043a5b2d46770c45e35c9a596535978384..d93df8258edb5730b1b1f21fd4323e4d271bd778 100644 (file)
@@ -153,7 +153,7 @@ class Inode {
   map<int,int> open_by_mode;
   map<int,int> cap_refs;
 
-  __u64     wanted_max_size, requested_max_size;
+  __u64     reported_size, wanted_max_size, requested_max_size;
 
   int       ref;      // ref count. 1 for each dentry, fh that links to me.
   int       ll_ref;   // separate ref count for ll client
@@ -200,7 +200,7 @@ class Inode {
     //inode(_inode),
     lease_mask(0), lease_mds(-1),
     dir_auth(-1), dir_hashed(false), dir_replicated(false), 
-    wanted_max_size(0), requested_max_size(0),
+    reported_size(0), wanted_max_size(0), requested_max_size(0),
     ref(0), ll_ref(0), 
     dir(0), dn(0), symlink(0),
     hack_balance_reads(false)