From c9a3e5cf1ab7559c47589e6befc8e57938d274e1 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Fri, 16 May 2008 10:03:51 -0700 Subject: [PATCH] client: add reported_size --- src/client/Client.cc | 19 ++++++++++++++----- src/client/Client.h | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/client/Client.cc b/src/client/Client.cc index 2ed436ac9632c..368887edf6b21 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -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; diff --git a/src/client/Client.h b/src/client/Client.h index e8c0e9043a5b2..d93df8258edb5 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -153,7 +153,7 @@ class Inode { map open_by_mode; map 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) -- 2.39.5