dout(10) << "got dentry lease on " << dname << " dur " << dlease->duration_ms << "ms ttl " << ttl << dendl;
dn->lease_ttl = ttl;
dn->lease_mds = from;
+ dn->lease_seq = dlease->seq;
}
}
Dir *dir = cur->dir;
if (dir->dentries.count(path[i])) {
dn = dir->dentries[path[i]];
- dout(14) << " hit dentry " << path[i] << " inode is " << dn->inode
- << " ttl " << dn->inode->lease_ttl << dendl;
+ dout(14) << " hit dentry " << path[i] << " inode is " << dn->inode << dendl;
} else {
dout(14) << " dentry " << path[i] << " dne" << dendl;
return NULL;
if (!dn)
dn = cur->dn;
if (dn) {
- dout(11) << "lookup '" << path << "' found " << dn->name << " inode " << dn->inode->inode.ino
- << " ttl " << dn->inode->lease_ttl << dendl;
+ dout(11) << "lookup '" << path << "' found " << dn->name << " inode " << dn->inode->inode.ino << dendl;
}
return dn;
int mds = m->get_source().num();
mds_sessions[mds].seq++;
+ ceph_seq_t seq = m->get_seq();
+
Inode *in;
vinodeno_t vino(m->get_ino(), CEPH_NOSNAP);
if (inode_map.count(vino) == 0) {
}
Dentry *dn = in->dir->dentries[m->dname];
dout(10) << " revoked DN lease on " << dn << dendl;
+ if (dn->lease_mds == mds)
+ seq = dn->lease_seq;
dn->lease_mds = -1;
}
- if (m->get_mask() & in->lease_mask) {
- int newmask = in->lease_mask & ~m->get_mask();
- dout(10) << " revoked inode lease on " << in->ino()
- << " mask " << in->lease_mask << " -> " << newmask << dendl;
- in->lease_mask = newmask;
- }
revoke:
- messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE,
+ messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE, seq,
m->get_mask(), m->get_ino(), m->get_first(), m->get_last(), m->dname),
m->get_source_inst());
delete m;
void Client::release_lease(Inode *in, Dentry *dn, int mask)
{
- int havemask = 0;
- int mds = -1;
utime_t now = g_clock.now();
- string dname;
- // inode?
- if (in->lease_mds >= 0 && (in->lease_mask & mask) && now < in->lease_ttl) {
- havemask |= (in->lease_mask & mask);
- mds = in->lease_mds;
- }
+ assert(dn);
// dentry?
- if (dn && dn->lease_mds >= 0 && now < in->lease_ttl) {
- havemask |= CEPH_LOCK_DN;
- mds = dn->lease_mds;
- dname = dn->name;
- }
-
- if (mds >= 0 && mdsmap->is_up(mds)) {
- dout(10) << "release_lease mds" << mds << " mask " << mask
- << " on " << in->ino() << " " << dname << dendl;
- messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE, mask, in->ino(), in->snapid, in->snapid, dname),
- mdsmap->get_inst(mds));
+ if (dn->lease_mds >= 0 && now < dn->lease_ttl && mdsmap->is_up(dn->lease_mds)) {
+ dout(10) << "release_lease mds" << dn->lease_mds << " mask " << mask
+ << " on " << in->ino() << " " << dn->name << dendl;
+ messenger->send_message(new MClientLease(CEPH_MDS_LEASE_RELEASE, dn->lease_seq,
+ CEPH_LOCK_DN,
+ in->ino(), in->snapid, in->snapid, dn->name),
+ mdsmap->get_inst(dn->lease_mds));
}
}
if (rstat)
*rstat = in->inode.rstat;
- return in->lease_mask;
+ return in->caps_issued();
}
diri->dir->dentries.count(dname)) {
Dentry *dn = diri->dir->dentries[dname];
if ((dn->lease_mds >= 0 && dn->lease_ttl > now) ||
- (diri->lease_mds >= 0 && diri->lease_ttl > now && (diri->lease_mask & CEPH_LOCK_IFILE))) {
+ (diri->caps_issued() & CEPH_CAP_FILE_RDCACHE)) {
touch_dn(dn);
in = dn->inode;
dout(1) << "ll_lookup " << parent << " " << name << " -> have valid lease on dentry|IFILE" << dendl;
int ref; // 1 if there's a dir beneath me.
int lease_mds;
utime_t lease_ttl;
+ ceph_seq_t lease_seq;
void get() {
assert(ref == 0); ref++; lru_pin();
//cout << "dentry.put on " << this << " " << name << " now " << ref << std::endl;
}
- Dentry() : dir(0), inode(0), ref(0), lease_mds(-1) { }
+ Dentry() : dir(0), inode(0), ref(0), lease_mds(-1), lease_seq(0) { }
};
class Dir {
public:
inode_t inode; // the actual inode
snapid_t snapid;
- int lease_mask, lease_mds;
- utime_t lease_ttl;
// about the dir (if this is one!)
int dir_auth;
Inode(vinodeno_t vino, ceph_file_layout *layout) :
//inode(_inode),
snapid(vino.snapid),
- lease_mask(0), lease_mds(-1),
dir_auth(-1), dir_hashed(false), dir_replicated(false),
dirty_caps(0),
snap_caps(0), snap_cap_refs(0),