}
-ClientLease *CDentry::add_client_lease(client_t c, int mask, Session *session)
+ClientLease *CDentry::add_client_lease(client_t c, Session *session)
{
ClientLease *l;
if (client_lease_map.count(c))
l = client_lease_map[c];
else {
+ dout(20) << "add_client_lease client" << c << " on " << lock << dendl;
if (client_lease_map.empty())
get(PIN_CLIENTLEASE);
l = client_lease_map[c] = new ClientLease(c, this);
l->seq = ++session->lease_seq;
- }
- int adding = ~l->mask & mask;
- dout(20) << " had " << l->mask << " adding " << mask
- << " -> " << adding
- << " ... now " << (l->mask | mask)
- << dendl;
- if (adding) {
lock.get_client_lease();
- dout(20) << "get_client_lease on " << lock << dendl;
}
- l->mask |= mask;
return l;
}
-void CDentry::remove_client_lease(ClientLease *l, int mask, Locker *locker)
+void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
{
assert(l->parent == this);
bool gather = false;
- int removing = l->mask & mask;
- dout(20) << "had " << l->mask << " removing " << mask << " -> " << removing
- << " ... now " << (l->mask & ~mask) << dendl;
- if (removing) {
- lock.put_client_lease();
- dout(20) << "put_client_lease on " << lock << dendl;
- if (lock.get_num_client_lease() == 0 && !lock.is_stable())
- gather = true;
- }
+ dout(20) << "remove_client_lease client" << l->client << " on " << lock << dendl;
+ lock.put_client_lease();
+ if (lock.get_num_client_lease() == 0 && !lock.is_stable())
+ gather = true;
- l->mask &= ~mask;
- if (l->mask == 0) {
- dout(20) << "removing lease for client" << l->client << dendl;
- client_lease_map.erase(l->client);
- l->item_lease.remove_myself();
- l->item_session_lease.remove_myself();
- delete l;
- if (client_lease_map.empty())
- put(PIN_CLIENTLEASE);
- }
+ client_lease_map.erase(l->client);
+ l->item_lease.remove_myself();
+ l->item_session_lease.remove_myself();
+ delete l;
+
+ if (client_lease_map.empty())
+ put(PIN_CLIENTLEASE);
if (gather)
locker->eval_gather(&lock);
return client_lease_map[c];
return 0;
}
- int get_client_lease_mask(client_t c) {
+ bool have_client_lease(client_t c) {
ClientLease *l = get_client_lease(c);
if (l)
- return l->mask;
+ return true;
else
- return 0;
+ return false;
}
- ClientLease *add_client_lease(client_t c, int mask, Session *session);
- void remove_client_lease(ClientLease *r, int mask, class Locker *locker); // returns remaining mask (if any), and kicks locker eval_gathers
+ ClientLease *add_client_lease(client_t c, Session *session);
+ void remove_client_lease(ClientLease *r, class Locker *locker); // returns remaining mask (if any), and kicks locker eval_gathers
ClientLease *l = *p;
++p;
CDentry *parent = (CDentry*)l->parent;
- dout(15) << " removing lease for " << l->mask << " on " << *parent << dendl;
- parent->remove_client_lease(l, l->mask, this);
+ dout(15) << " removing lease on " << *parent << dendl;
+ parent->remove_client_lease(l, this);
}
}
ClientLease *l = dn->get_client_lease(client);
if (l) {
dout(10) << " removing lease on " << *dn << dendl;
- dn->remove_client_lease(l, l->mask, this);
+ dn->remove_client_lease(l, this);
}
} else {
stringstream ss;
} else {
dout(7) << "handle_client_lease client" << client
<< " on " << *dn << dendl;
- dn->remove_client_lease(l, CEPH_LOCK_DN, this);
+ dn->remove_client_lease(l, this);
}
m->put();
break;
}
-
-void Locker::_issue_client_lease(CDentry *dn, int mask, int pool, client_t client,
- bufferlist &bl, utime_t now, Session *session)
-{
- LeaseStat e;
- e.mask = mask;
-
- if (mask) {
- ClientLease *l = dn->add_client_lease(client, mask, session);
- session->touch_lease(l);
-
- e.seq = ++l->seq;
-
- now += mdcache->client_lease_durations[pool];
- mdcache->touch_client_lease(l, pool, now);
- } else
- e.seq = 0;
-
- e.duration_ms = (int)(1000 * mdcache->client_lease_durations[pool]);
- ::encode(e, bl);
- dout(20) << "_issue_client_lease mask " << e.mask << " seq " << e.seq << " dur " << e.duration_ms << "ms "
- << " on " << *dn << dendl;
-}
-
-
-
-/*
-int Locker::issue_client_lease(CInode *in, client_t client,
- bufferlist &bl, utime_t now, Session *session)
-{
- int mask = CEPH_LOCK_INO;
- int pool = 1; // fixme.. do something smart!
- if (in->authlock.can_lease()) mask |= CEPH_LOCK_IAUTH;
- if (in->linklock.can_lease()) mask |= CEPH_LOCK_ILINK;
- if (in->filelock.can_lease()) mask |= CEPH_LOCK_IFILE;
- if (in->xattrlock.can_lease()) mask |= CEPH_LOCK_IXATTR;
-
- _issue_client_lease(in, mask, pool, client, bl, now, session);
- return mask;
-}
-*/
-
void Locker::issue_client_lease(CDentry *dn, client_t client,
bufferlist &bl, utime_t now, Session *session)
{
int pool = 1; // fixme.. do something smart!
- // is it necessary?
- // -> dont issue per-dentry lease if a dir lease is possible, or
- // if the client is holding EXCL|RDCACHE caps.
- int mask = 0;
-
CInode *diri = dn->get_dir()->get_inode();
if (!diri->is_stray() && // do not issue dn leases in stray dir!
((!diri->filelock.can_lease(client) &&
(diri->get_client_cap_pending(client) & (CEPH_CAP_FILE_SHARED | CEPH_CAP_FILE_EXCL)) == 0)) &&
- dn->lock.can_lease(client))
- mask |= 1; // dentry lease. always 1.
-
- _issue_client_lease(dn, mask, pool, client, bl, now, session);
+ dn->lock.can_lease(client)) {
+ // issue a dentry lease
+ ClientLease *l = dn->add_client_lease(client, session);
+ session->touch_lease(l);
+
+ now += mdcache->client_lease_durations[pool];
+ mdcache->touch_client_lease(l, pool, now);
+
+ LeaseStat e;
+ e.mask = 1;
+ e.seq = ++l->seq;
+ e.duration_ms = (int)(1000 * mdcache->client_lease_durations[pool]);
+ ::encode(e, bl);
+ dout(20) << "issue_client_lease seq " << e.seq << " dur " << e.duration_ms << "ms "
+ << " on " << *dn << dendl;
+ } else {
+ // null lease
+ LeaseStat e;
+ e.mask = 0;
+ ::encode(e, bl);
+ dout(20) << "issue_client_lease no/null lease on " << *dn << dendl;
+ }
}
p++) {
ClientLease *l = p->second;
- if (l->mask == 0)
- continue;
-
n++;
assert(lock->get_type() == CEPH_LOCK_DN);
public:
void handle_client_lease(class MClientLease *m);
- void _issue_client_lease(CDentry *dn, int mask, int pool, client_t client, bufferlist &bl, utime_t now, Session *session);
void issue_client_lease(CDentry *dn, client_t client, bufferlist &bl, utime_t now, Session *session);
void revoke_client_leases(SimpleLock *lock);
};
if (r->ttl > now) break;
CDentry *dn = (CDentry*)r->parent;
dout(10) << " expiring client" << r->client << " lease of " << *dn << dendl;
- dn->remove_client_lease(r, r->mask, mds->locker);
+ dn->remove_client_lease(r, mds->locker);
}
int after = client_leases[pool].size();
dout(10) << "trim_client_leases pool " << pool << " trimmed "
ClientLease *r = session->leases.front();
CDentry *dn = (CDentry*)r->parent;
dout(20) << " killing client lease of " << *dn << dendl;
- dn->remove_client_lease(r, r->mask, mds->locker);
+ dn->remove_client_lease(r, mds->locker);
}
while (!session->requests.empty()) {
MDRequest *mdr = session->requests.front(member_offset(MDRequest,
*/
struct ClientLease {
client_t client;
- int mask; // CEPH_STAT_MASK_*
MDSCacheObject *parent;
ceph_seq_t seq;
xlist<ClientLease*>::item item_lease; // global list
ClientLease(client_t c, MDSCacheObject *p) :
- client(c), mask(0), parent(p), seq(0),
+ client(c), parent(p), seq(0),
item_session_lease(this),
item_lease(this) { }
};