- segregate backlog from log ondisk?
- preserve pg logs on disk for longer period
- make scrub interruptible
+- salvage some way to allow both RMW and DELAYED mode ops?
- optionally separate osd interfaces (ips) for clients and osds (replication, peering, etc.)
- pg repair
- pg split should be a work queue
- handle session STALE
- time out caps, wake up waiters on renewal
- link caps with mds session
-- validate dn leases
- fix lease validation to check session ttl
-- clean up ll_ interface, now that we have leases!
- clean up client mds session vs mdsmap behavior?
- stop using mds's inode_t?
- fix readdir vs fragment race by keeping a separate frag pos, and ignoring dentries below it
dn->lease_ttl = dttl;
dn->lease_mds = mds;
dn->lease_seq = dlease->seq;
+ dn->lease_gen = mds_sessions[mds].cap_gen;
}
}
dn->cap_shared_gen = dir->parent_inode->shared_gen;
<< " seq " << dn->lease_seq
<< dendl;
- // is lease valid?
- if ((dn->lease_mds >= 0 &&
- dn->lease_ttl > g_clock.now()) ||
- ((dir->caps_issued() & CEPH_CAP_FILE_SHARED) &&
- dn->cap_shared_gen == dir->shared_gen)) {
+ // is dn lease valid?
+ utime_t now = g_clock.now();
+ if (dn->lease_mds >= 0 &&
+ dn->lease_ttl > now &&
+ mds_sessions.count(dn->lease_mds)) {
+ MDSSession &s = mds_sessions[dn->lease_mds];
+ if (s.cap_ttl > now &&
+ s.cap_gen == dn->lease_gen) {
+ *target = dn->inode;
+ goto done;
+ }
+ }
+ // dir lease?
+ if ((dir->caps_issued() & CEPH_CAP_FILE_SHARED) &&
+ dn->cap_shared_gen == dir->shared_gen) {
*target = dn->inode;
goto done;
}
int ref; // 1 if there's a dir beneath me.
int lease_mds;
utime_t lease_ttl;
+ __u64 lease_gen;
ceph_seq_t lease_seq;
int cap_shared_gen;
//cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
}
- Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0), cap_shared_gen(0) { }
+ Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_gen(0), lease_seq(0), cap_shared_gen(0) { }
};
class Dir {