Skip to content

Commit df00735

Browse files
Yan, Zhenggardran
authored andcommitted
mds: put ClientLease in map container
Signed-off-by: "Yan, Zheng" <[email protected]>
1 parent b6c79ab commit df00735

File tree

6 files changed

+58
-61
lines changed

6 files changed

+58
-61
lines changed

src/mds/CDentry.cc

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -500,22 +500,26 @@ void CDentry::decode_lock_state(int type, const bufferlist& bl)
500500
}
501501

502502

503-
ClientLease *CDentry::add_client_lease(client_t c, Session *session)
504-
{
505-
ClientLease *l;
506-
if (client_lease_map.count(c))
507-
l = client_lease_map[c];
508-
else {
509-
dout(20) << __func__ << " client." << c << " on " << lock << dendl;
510-
if (client_lease_map.empty()) {
503+
client_t ClientLease::get_client() const
504+
{
505+
return session->get_client();
506+
}
507+
508+
ClientLease *CDentry::add_client_lease(Session *session)
509+
{
510+
client_t client = session->get_client();
511+
auto em = client_leases.emplace(std::piecewise_construct,
512+
std::forward_as_tuple(client),
513+
std::forward_as_tuple(this, session));
514+
ClientLease *l = &em.first->second;
515+
if (em.second) {
516+
dout(20) << __func__ << " client." << client << " on " << lock << dendl;
517+
if (client_leases.size() == 1) {
511518
get(PIN_CLIENTLEASE);
512519
lock.get_client_lease();
513520
}
514-
l = client_lease_map[c] = new ClientLease(c, this);
515521
l->seq = ++session->lease_seq;
516-
517522
}
518-
519523
return l;
520524
}
521525

@@ -524,15 +528,14 @@ void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
524528
ceph_assert(l->parent == this);
525529

526530
bool gather = false;
531+
client_t client = l->get_client();
532+
dout(20) << __func__ << " client." << client << " on " << lock << dendl;
527533

528-
dout(20) << __func__ << " client." << l->client << " on " << lock << dendl;
529-
530-
client_lease_map.erase(l->client);
531534
l->item_lease.remove_myself();
532535
l->item_session_lease.remove_myself();
533-
delete l;
536+
client_leases.erase(client);
534537

535-
if (client_lease_map.empty()) {
538+
if (client_leases.empty()) {
536539
gather = !lock.is_stable();
537540
lock.put_client_lease();
538541
put(PIN_CLIENTLEASE);
@@ -544,8 +547,8 @@ void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
544547

545548
void CDentry::remove_client_leases(Locker *locker)
546549
{
547-
while (!client_lease_map.empty())
548-
remove_client_lease(client_lease_map.begin()->second, locker);
550+
while (!client_leases.empty())
551+
remove_client_lease(&client_leases.begin()->second, locker);
549552
}
550553

551554
void CDentry::_put()

src/mds/CDentry.h

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,30 @@
3434
#include "ScrubHeader.h"
3535

3636
class CInode;
37+
class CDentry;
3738
class CDir;
3839
class Locker;
3940
class CDentry;
4041
class LogSegment;
41-
4242
class Session;
4343

44+
struct ClientLease {
45+
ClientLease(CDentry *p, Session *s) :
46+
parent(p), session(s),
47+
item_session_lease(this),
48+
item_lease(this) { }
49+
ClientLease() = delete;
50+
client_t get_client() const;
51+
52+
CDentry *parent;
53+
Session *session;
54+
55+
ceph_seq_t seq = 0;
56+
utime_t ttl;
57+
xlist<ClientLease*>::item item_session_lease; // per-session list
58+
xlist<ClientLease*>::item item_lease; // global list
59+
};
60+
4461
// define an ordering
4562
bool operator<(const CDentry& l, const CDentry& r);
4663

@@ -324,27 +341,25 @@ class CDentry : public MDSCacheObject, public LRUObject, public Counter<CDentry>
324341
// replicas (on clients)
325342

326343
bool is_any_leases() const {
327-
return !client_lease_map.empty();
344+
return !client_leases.empty();
328345
}
329346
const ClientLease *get_client_lease(client_t c) const {
330-
if (client_lease_map.count(c))
331-
return client_lease_map.find(c)->second;
332-
return 0;
347+
auto it = client_leases.find(c);
348+
if (it != client_leases.end())
349+
return &it->second;
350+
return nullptr;
333351
}
334352
ClientLease *get_client_lease(client_t c) {
335-
if (client_lease_map.count(c))
336-
return client_lease_map.find(c)->second;
337-
return 0;
353+
auto it = client_leases.find(c);
354+
if (it != client_leases.end())
355+
return &it->second;
356+
return nullptr;
338357
}
339358
bool have_client_lease(client_t c) const {
340-
const ClientLease *l = get_client_lease(c);
341-
if (l)
342-
return true;
343-
else
344-
return false;
359+
return client_leases.count(c);
345360
}
346361

347-
ClientLease *add_client_lease(client_t c, Session *session);
362+
ClientLease *add_client_lease(Session *session);
348363
void remove_client_lease(ClientLease *r, Locker *locker); // returns remaining mask (if any), and kicks locker eval_gathers
349364
void remove_client_leases(Locker *locker);
350365

@@ -373,7 +388,7 @@ class CDentry : public MDSCacheObject, public LRUObject, public Counter<CDentry>
373388
SimpleLock lock; // FIXME referenced containers not in mempool
374389
LocalLockC versionlock; // FIXME referenced containers not in mempool
375390

376-
mempool::mds_co::map<client_t,ClientLease*> client_lease_map;
391+
mempool::mds_co::map<client_t, ClientLease> client_leases;
377392
std::map<int, std::unique_ptr<BatchOp>> batch_ops;
378393

379394
ceph_tid_t reintegration_reqid = 0;

src/mds/CDir.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,7 +510,7 @@ void CDir::remove_dentry(CDentry *dn)
510510
dout(12) << __func__ << " " << *dn << dendl;
511511

512512
// there should be no client leases at this point!
513-
ceph_assert(dn->client_lease_map.empty());
513+
ceph_assert(dn->client_leases.empty());
514514

515515
if (state_test(CDir::STATE_DNPINNEDFRAG)) {
516516
dn->put(CDentry::PIN_FRAGMENTING);

src/mds/Locker.cc

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4500,7 +4500,7 @@ void Locker::issue_client_lease(CDentry *dn, CInode *in, const MDRequestRef& mdr
45004500
ceph_assert(!in);
45014501
}
45024502
// issue a dentry lease
4503-
ClientLease *l = dn->add_client_lease(client, session);
4503+
ClientLease *l = dn->add_client_lease(session);
45044504
session->touch_lease(l);
45054505

45064506
int pool = 1; // fixme.. do something smart!
@@ -4529,11 +4529,9 @@ void Locker::issue_client_lease(CDentry *dn, CInode *in, const MDRequestRef& mdr
45294529
void Locker::revoke_client_leases(SimpleLock *lock)
45304530
{
45314531
CDentry *dn = static_cast<CDentry*>(lock->get_parent());
4532-
for (map<client_t, ClientLease*>::iterator p = dn->client_lease_map.begin();
4533-
p != dn->client_lease_map.end();
4534-
++p) {
4535-
ClientLease *l = p->second;
4536-
4532+
for (auto& p : dn->client_leases) {
4533+
ClientLease *l = &p.second;
4534+
45374535
ceph_assert(lock->get_type() == CEPH_LOCK_DN);
45384536

45394537
CDentry *dn = static_cast<CDentry*>(lock->get_parent());
@@ -4542,7 +4540,7 @@ void Locker::revoke_client_leases(SimpleLock *lock)
45424540
// i should also revoke the dir ICONTENT lease, if they have it!
45434541
CInode *diri = dn->get_dir()->get_inode();
45444542
auto lease = make_message<MClientLease>(CEPH_MDS_LEASE_REVOKE, l->seq, mask, diri->ino(), diri->first, CEPH_NOSNAP, dn->get_name());
4545-
mds->send_message_client_counted(lease, l->client);
4543+
mds->send_message_client_counted(lease, l->session);
45464544
}
45474545
}
45484546

src/mds/MDCache.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7804,7 +7804,7 @@ void MDCache::trim_client_leases()
78047804
ClientLease *r = list.front();
78057805
if (r->ttl > now) break;
78067806
CDentry *dn = static_cast<CDentry*>(r->parent);
7807-
dout(10) << " expiring client." << r->client << " lease of " << *dn << dendl;
7807+
dout(10) << " expiring client." << r->get_client() << " lease of " << *dn << dendl;
78087808
dn->remove_client_lease(r, mds->locker);
78097809
}
78107810
auto after = list.size();

src/mds/MDSCacheObject.h

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,6 @@
2020
//#define MDS_AUTHPIN_SET // define me for debugging auth pin leaks
2121
//#define MDS_VERIFY_FRAGSTAT // do (slow) sanity checking on frags
2222

23-
/*
24-
* for metadata leases to clients
25-
*/
2623
class MLock;
2724
class SimpleLock;
2825
class MDSCacheObject;
@@ -32,22 +29,6 @@ namespace ceph {
3229
class Formatter;
3330
}
3431

35-
struct ClientLease {
36-
ClientLease(client_t c, MDSCacheObject *p) :
37-
client(c), parent(p),
38-
item_session_lease(this),
39-
item_lease(this) { }
40-
ClientLease() = delete;
41-
42-
client_t client;
43-
MDSCacheObject *parent;
44-
45-
ceph_seq_t seq = 0;
46-
utime_t ttl;
47-
xlist<ClientLease*>::item item_session_lease; // per-session list
48-
xlist<ClientLease*>::item item_lease; // global list
49-
};
50-
5132
// print hack
5233
struct mdsco_db_line_prefix {
5334
explicit mdsco_db_line_prefix(MDSCacheObject *o) : object(o) {}

0 commit comments

Comments
 (0)