]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: put ClientLease in map container
authorYan, Zheng <yanzheng03@kuaishou.com>
Wed, 24 Mar 2021 06:13:52 +0000 (14:13 +0800)
committerGarry Drankovich <garry.drankovich@clyso.com>
Mon, 10 Jun 2024 10:21:19 +0000 (13:21 +0300)
Signed-off-by: "Yan, Zheng" <yanzheng03@kuaishou.com>
src/mds/CDentry.cc
src/mds/CDentry.h
src/mds/CDir.cc
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/MDSCacheObject.h

index 8694dfc72a2e6f8145e8b803a6e81d23e24696e6..b1a294be5af89ea6e7428e650ee17414557544e2 100644 (file)
@@ -500,22 +500,26 @@ void CDentry::decode_lock_state(int type, const bufferlist& bl)
 }
 
 
-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) << __func__ << " client." << c << " on " << lock << dendl;
-    if (client_lease_map.empty()) {
+client_t ClientLease::get_client() const
+{
+  return session->get_client();
+}
+
+ClientLease *CDentry::add_client_lease(Session *session)
+{
+  client_t client = session->get_client();
+  auto em = client_leases.emplace(std::piecewise_construct,
+                                 std::forward_as_tuple(client),
+                                 std::forward_as_tuple(this, session));
+  ClientLease *l = &em.first->second;
+  if (em.second) {
+    dout(20) << __func__ << " client." << client << " on " << lock << dendl;
+    if (client_leases.size() == 1) {
       get(PIN_CLIENTLEASE);
       lock.get_client_lease();
     }
-    l = client_lease_map[c] = new ClientLease(c, this);
     l->seq = ++session->lease_seq;
-  
   }
-  
   return l;
 }
 
@@ -524,15 +528,14 @@ void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
   ceph_assert(l->parent == this);
 
   bool gather = false;
+  client_t client = l->get_client();
+  dout(20) << __func__ << " client." << client << " on " << lock << dendl;
 
-  dout(20) << __func__ << " client." << l->client << " on " << lock << dendl;
-
-  client_lease_map.erase(l->client);
   l->item_lease.remove_myself();
   l->item_session_lease.remove_myself();
-  delete l;
+  client_leases.erase(client);
 
-  if (client_lease_map.empty()) {
+  if (client_leases.empty()) {
     gather = !lock.is_stable();
     lock.put_client_lease();
     put(PIN_CLIENTLEASE);
@@ -544,8 +547,8 @@ void CDentry::remove_client_lease(ClientLease *l, Locker *locker)
 
 void CDentry::remove_client_leases(Locker *locker)
 {
-  while (!client_lease_map.empty())
-    remove_client_lease(client_lease_map.begin()->second, locker);
+  while (!client_leases.empty())
+    remove_client_lease(&client_leases.begin()->second, locker);
 }
 
 void CDentry::_put()
index 2566395d185617bec6c4e0bbeb6719b2e6cdcdf0..e863daef3999129044ac98c9e48eb0c024988402 100644 (file)
 #include "ScrubHeader.h"
 
 class CInode;
+class CDentry;
 class CDir;
 class Locker;
 class CDentry;
 class LogSegment;
-
 class Session;
 
+struct ClientLease {
+  ClientLease(CDentry *p, Session *s) :
+    parent(p), session(s),
+    item_session_lease(this),
+    item_lease(this) { }
+  ClientLease() = delete;
+  client_t get_client() const;
+
+  CDentry *parent;
+  Session *session;
+
+  ceph_seq_t seq = 0;
+  utime_t ttl;
+  xlist<ClientLease*>::item item_session_lease; // per-session list
+  xlist<ClientLease*>::item item_lease;         // global list
+};
+
 // define an ordering
 bool operator<(const CDentry& l, const CDentry& r);
 
@@ -324,27 +341,25 @@ public:
   // replicas (on clients)
 
   bool is_any_leases() const {
-    return !client_lease_map.empty();
+    return !client_leases.empty();
   }
   const ClientLease *get_client_lease(client_t c) const {
-    if (client_lease_map.count(c))
-      return client_lease_map.find(c)->second;
-    return 0;
+    auto it = client_leases.find(c);
+    if (it != client_leases.end())
+      return &it->second;
+    return nullptr;
   }
   ClientLease *get_client_lease(client_t c) {
-    if (client_lease_map.count(c))
-      return client_lease_map.find(c)->second;
-    return 0;
+    auto it = client_leases.find(c);
+    if (it != client_leases.end())
+      return &it->second;
+    return nullptr;
   }
   bool have_client_lease(client_t c) const {
-    const ClientLease *l = get_client_lease(c);
-    if (l) 
-      return true;
-    else
-      return false;
+    return client_leases.count(c);
   }
 
-  ClientLease *add_client_lease(client_t c, Session *session);
+  ClientLease *add_client_lease(Session *session);
   void remove_client_lease(ClientLease *r, Locker *locker);  // returns remaining mask (if any), and kicks locker eval_gathers
   void remove_client_leases(Locker *locker);
 
@@ -373,7 +388,7 @@ public:
   SimpleLock lock; // FIXME referenced containers not in mempool
   LocalLockC versionlock; // FIXME referenced containers not in mempool
 
-  mempool::mds_co::map<client_t,ClientLease*> client_lease_map;
+  mempool::mds_co::map<client_t, ClientLease> client_leases;
   std::map<int, std::unique_ptr<BatchOp>> batch_ops;
 
   ceph_tid_t reintegration_reqid = 0;
index 32381fe548cb79d7fa5a2296260f7d2d4343105d..ea56c507b665638677abde3ba7807553722817d7 100644 (file)
@@ -510,7 +510,7 @@ void CDir::remove_dentry(CDentry *dn)
   dout(12) << __func__ << " " << *dn << dendl;
 
   // there should be no client leases at this point!
-  ceph_assert(dn->client_lease_map.empty());
+  ceph_assert(dn->client_leases.empty());
 
   if (state_test(CDir::STATE_DNPINNEDFRAG)) {
     dn->put(CDentry::PIN_FRAGMENTING);
index e3925e20b4751f7815f31e534cdf77bb2052f37c..708725b5fbe8b0936a020d72079e6ae899335d83 100644 (file)
@@ -4500,7 +4500,7 @@ void Locker::issue_client_lease(CDentry *dn, CInode *in, const MDRequestRef& mdr
         ceph_assert(!in);
     }
     // issue a dentry lease
-    ClientLease *l = dn->add_client_lease(client, session);
+    ClientLease *l = dn->add_client_lease(session);
     session->touch_lease(l);
     
     int pool = 1;   // fixme.. do something smart!
@@ -4529,11 +4529,9 @@ void Locker::issue_client_lease(CDentry *dn, CInode *in, const MDRequestRef& mdr
 void Locker::revoke_client_leases(SimpleLock *lock)
 {
   CDentry *dn = static_cast<CDentry*>(lock->get_parent());
-  for (map<client_t, ClientLease*>::iterator p = dn->client_lease_map.begin();
-       p != dn->client_lease_map.end();
-       ++p) {
-    ClientLease *l = p->second;
-
+  for (auto& p : dn->client_leases) {
+    ClientLease *l = &p.second;
+    
     ceph_assert(lock->get_type() == CEPH_LOCK_DN);
 
     CDentry *dn = static_cast<CDentry*>(lock->get_parent());
@@ -4542,7 +4540,7 @@ void Locker::revoke_client_leases(SimpleLock *lock)
     // i should also revoke the dir ICONTENT lease, if they have it!
     CInode *diri = dn->get_dir()->get_inode();
     auto lease = make_message<MClientLease>(CEPH_MDS_LEASE_REVOKE, l->seq, mask, diri->ino(), diri->first, CEPH_NOSNAP, dn->get_name());
-    mds->send_message_client_counted(lease, l->client);
+    mds->send_message_client_counted(lease, l->session);
   }
 }
 
index 1c584e3bf3c0f58d67f7792ad0713530749cd2aa..cd56a487683e2db35bbc95e2677dda8863c4231f 100644 (file)
@@ -7804,7 +7804,7 @@ void MDCache::trim_client_leases()
       ClientLease *r = list.front();
       if (r->ttl > now) break;
       CDentry *dn = static_cast<CDentry*>(r->parent);
-      dout(10) << " expiring client." << r->client << " lease of " << *dn << dendl;
+      dout(10) << " expiring client." << r->get_client() << " lease of " << *dn << dendl;
       dn->remove_client_lease(r, mds->locker);
     }
     auto after = list.size();
index d322a05851a56fcf8f2c7e3669cf1246a97e2a34..be84d142e9a836275bbed8d8c09e3d0b0fe4ea17 100644 (file)
@@ -20,9 +20,6 @@
 //#define MDS_AUTHPIN_SET  // define me for debugging auth pin leaks
 //#define MDS_VERIFY_FRAGSTAT    // do (slow) sanity checking on frags
 
-/*
- * for metadata leases to clients
- */
 class MLock;
 class SimpleLock;
 class MDSCacheObject;
@@ -32,22 +29,6 @@ namespace ceph {
 class Formatter;
 }
 
-struct ClientLease {
-  ClientLease(client_t c, MDSCacheObject *p) :
-    client(c), parent(p),
-    item_session_lease(this),
-    item_lease(this) { }
-  ClientLease() = delete;
-
-  client_t client;
-  MDSCacheObject *parent;
-
-  ceph_seq_t seq = 0;
-  utime_t ttl;
-  xlist<ClientLease*>::item item_session_lease; // per-session list
-  xlist<ClientLease*>::item item_lease;         // global list
-};
-
 // print hack
 struct mdsco_db_line_prefix {
   explicit mdsco_db_line_prefix(MDSCacheObject *o) : object(o) {}