- mds lock last_change stamp?
- fix file_data_version
-- on recovery, validate file sizes when max_size > size
-
-- coalesce lease revocations on dir inode + dentry, where possible
- fix reconnect/rejoin open file weirdness
- get rid of C*Discover objects for replicate_to .. encode to bufferlists directly?
- dentry versions vs dirfrags...
- failure during reconnect vs clientmap.
-- inode.rmtime (recursive mtime)?
+- inode.rctime (recursive mtime)?
- make inode.size reflect directory size (number of entries)?
- osd needs a set_floor_and_read op for safe failover/STOGITH-like semantics.
in->inode.time_warp_seq = m->get_time_warp_seq();
}
+ if (m->get_max_size() != in->inode.max_size) {
+ dout(10) << "max_size " << in->inode.max_size << " -> " << m->get_max_size() << dendl;
+ in->inode.max_size = m->get_max_size();
+ if (in->inode.max_size > in->wanted_max_size) {
+ in->wanted_max_size = 0;
+ in->requested_max_size = 0;
+ }
+ }
+
// share our (possibly newer) file size, mtime, atime
m->set_size(in->inode.size);
m->set_mtime(in->inode.mtime);
int wanted = in->file_caps_wanted();
dout(5) << "updating caps wanted on ino " << in->inode.ino
<< " to " << cap_string(wanted)
+ << " max_size " << in->wanted_max_size
<< dendl;
// FIXME: pick a single mds and let the others off the hook..
it->second.seq,
it->second.caps,
wanted);
+ 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));
if (wanted == 0)
mds_sessions[it->first].num_caps--;
dout(7) << "synchronous write" << dendl;
// do we have write file cap?
- while (!lazy && (in->file_caps() & CEPH_CAP_WR) == 0) {
- dout(7) << " don't have write cap, waiting" << dendl;
+ __u64 endoff = offset + size;
+
+ if ((endoff >= in->inode.max_size ||
+ endoff > (in->inode.size << 1)) &&
+ endoff > in->wanted_max_size) {
+ dout(10) << "wanted_max_size " << in->wanted_max_size << " -> " << endoff << dendl;
+ in->wanted_max_size = endoff;
+ update_caps_wanted(in);
+ }
+
+ while (!lazy &&
+ ((in->file_caps() & CEPH_CAP_WR) == 0 ||
+ endoff > in->inode.max_size)) {
+ dout(7) << " don't have write cap for endoff " << endoff
+ << " (max " << in->inode.max_size << "), waiting" << dendl;
Cond cond;
in->waitfor_write.push_back(&cond);
cond.Wait(client_lock);
map<int,InodeCap> stale_caps; // mds -> cap .. stale
int num_open_rd, num_open_wr, num_open_lazy; // num readers, writers
+ __u64 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
lease_mask(0), lease_mds(-1),
dir_auth(-1), dir_hashed(false), dir_replicated(false),
num_open_rd(0), num_open_wr(0), num_open_lazy(0),
+ wanted_max_size(0), requested_max_size(0),
ref(0), ll_ref(0),
dir(0), dn(0), symlink(0),
fc(_oc, ino, layout),