]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: use compact_map to optimize memory usage of MDSCacheObject
authorYan, Zheng <zyan@redhat.com>
Fri, 6 Feb 2015 11:15:41 +0000 (19:15 +0800)
committerYan, Zheng <zyan@redhat.com>
Wed, 25 Feb 2015 12:12:13 +0000 (20:12 +0800)
Replica map and waiting list in MDSCacheObject are rarely used and
mostly empty. Defining them as compact_map can save 80 bytes for 64
bits program.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/CDir.cc
src/mds/CDir.h
src/mds/Locker.cc
src/mds/MDCache.cc
src/mds/Migrator.cc
src/mds/SimpleLock.h
src/mds/mdstypes.h

index 235b0dd8cb23aabb757a3148a7a44ebd800ff162..9943add99f164b03dbb1b48e897c9fd01e182522 100644 (file)
@@ -1029,8 +1029,8 @@ void CDir::merge(list<CDir*>& subs, list<MDSInternalContextBase*>& waiters, bool
       steal_dentry(dir->items.begin()->second);
     
     // merge replica map
-    for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
-        p != dir->replica_map.end();
+    for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+        p != dir->replicas_end();
         ++p) {
       unsigned cur = replica_map[p->first];
       if (p->second > cur)
@@ -2720,8 +2720,9 @@ void CDir::dump(Formatter *f) const
   f->open_object_section("auth_state");
   {
     f->open_object_section("replica_map");
-    for (std::map<mds_rank_t, unsigned>::const_iterator i = replica_map.begin();
-         i != replica_map.end(); ++i) {
+    for (compact_map<mds_rank_t, unsigned>::const_iterator i = replica_map.begin();
+        i != replica_map.end();
+        ++i) {
       std::ostringstream rank_str;
       rank_str << i->first;
       f->dump_int(rank_str.str().c_str(), i->second);
index f72a24987ea03435fb9b1ce70355c74e62e8f93e..75ddd12d8b00bf1843f7748f09c118c5fb054045 100644 (file)
@@ -428,10 +428,7 @@ private:
   // for giving to clients
   void get_dist_spec(std::set<mds_rank_t>& ls, mds_rank_t auth) {
     if (is_rep()) {
-      for (std::map<mds_rank_t,unsigned>::iterator p = replicas_begin();
-          p != replicas_end(); 
-          ++p)
-       ls.insert(p->first);
+      list_replicas(ls);
       if (!ls.empty()) 
        ls.insert(auth);
     }
index 02844864009f6ee1fe3d94d6e0704c996016cea5..d5dd693c3db2b9d7492e381453a155c98a930e5f 100644 (file)
@@ -129,8 +129,8 @@ void Locker::tick()
 
 void Locker::send_lock_message(SimpleLock *lock, int msg)
 {
-  for (map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
-       it != lock->get_parent()->replicas_end(); 
+  for (compact_map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
+       it != lock->get_parent()->replicas_end();
        ++it) {
     if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN) 
       continue;
@@ -141,8 +141,8 @@ void Locker::send_lock_message(SimpleLock *lock, int msg)
 
 void Locker::send_lock_message(SimpleLock *lock, int msg, const bufferlist &data)
 {
-  for (map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
-       it != lock->get_parent()->replicas_end(); 
+  for (compact_map<mds_rank_t,unsigned>::iterator it = lock->get_parent()->replicas_begin();
+       it != lock->get_parent()->replicas_end();
        ++it) {
     if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN) 
       continue;
index f1607465c212edd0b304bfdb545f70432314de93..a1a3c2217eaa28b0a90abf8d8edc234f821e8e78 100644 (file)
@@ -1963,8 +1963,9 @@ update:
     msg->quota = i->quota;
     mds->send_message_client_counted(msg, session->connection);
   }
-  for (map<const mds_rank_t, unsigned>::iterator it = in->replicas_begin();
-       it != in->replicas_end(); ++it) {
+  for (compact_map<mds_rank_t, unsigned>::iterator it = in->replicas_begin();
+       it != in->replicas_end();
+       ++it) {
     MGatherCaps *msg = new MGatherCaps;
     msg->ino = in->ino();
     mds->send_message_mds(msg, it->first);
@@ -5688,7 +5689,7 @@ void MDCache::rejoin_send_acks()
       dq.pop_front();
       
       // dir
-      for (map<mds_rank_t,unsigned>::iterator r = dir->replicas_begin();
+      for (compact_map<mds_rank_t,unsigned>::iterator r = dir->replicas_begin();
           r != dir->replicas_end();
           ++r) {
        ack[r->first]->add_strong_dirfrag(dir->dirfrag(), ++r->second, dir->dir_rep);
@@ -5707,7 +5708,7 @@ void MDCache::rejoin_send_acks()
          in = dnl->get_inode();
 
        // dentry
-       for (map<mds_rank_t,unsigned>::iterator r = dn->replicas_begin();
+       for (compact_map<mds_rank_t,unsigned>::iterator r = dn->replicas_begin();
             r != dn->replicas_end();
             ++r) {
          ack[r->first]->add_strong_dentry(dir->dirfrag(), dn->name, dn->first, dn->last,
@@ -5724,7 +5725,7 @@ void MDCache::rejoin_send_acks()
        if (!in)
          continue;
 
-       for (map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
+       for (compact_map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
             r != in->replicas_end();
             ++r) {
          ack[r->first]->add_inode_base(in);
@@ -5741,7 +5742,7 @@ void MDCache::rejoin_send_acks()
 
   // base inodes too
   if (root && root->is_auth()) 
-    for (map<mds_rank_t,unsigned>::iterator r = root->replicas_begin();
+    for (compact_map<mds_rank_t,unsigned>::iterator r = root->replicas_begin();
         r != root->replicas_end();
         ++r) {
       ack[r->first]->add_inode_base(root);
@@ -5750,7 +5751,7 @@ void MDCache::rejoin_send_acks()
       ack[r->first]->add_inode_locks(root, ++r->second, bl);
     }
   if (myin)
-    for (map<mds_rank_t,unsigned>::iterator r = myin->replicas_begin();
+    for (compact_map<mds_rank_t,unsigned>::iterator r = myin->replicas_begin();
         r != myin->replicas_end();
         ++r) {
       ack[r->first]->add_inode_base(myin);
@@ -5764,7 +5765,7 @@ void MDCache::rejoin_send_acks()
        p != rejoin_potential_updated_scatterlocks.end();
        ++p) {
     CInode *in = *p;
-    for (map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
+    for (compact_map<mds_rank_t,unsigned>::iterator r = in->replicas_begin();
         r != in->replicas_end();
         ++r)
       ack[r->first]->add_inode_base(in);
@@ -10186,7 +10187,7 @@ int MDCache::send_dir_updates(CDir *dir, bool bcast)
   if (bcast) {
     mds->get_mds_map()->get_active_mds_set(who);
   } else {
-    for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+    for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
         p != dir->replicas_end();
         ++p)
       who.insert(p->first);
@@ -10267,8 +10268,8 @@ void MDCache::send_dentry_link(CDentry *dn, MDRequestRef& mdr)
   dout(7) << "send_dentry_link " << *dn << dendl;
 
   CDir *subtree = get_subtree_root(dn->get_dir());
-  for (map<mds_rank_t,unsigned>::iterator p = dn->replicas_begin();
-       p != dn->replicas_end(); 
+  for (compact_map<mds_rank_t,unsigned>::iterator p = dn->replicas_begin();
+       p != dn->replicas_end();
        ++p) {
     // don't tell (rename) witnesses; they already know
     if (mdr.get() && mdr->more()->witnessed.count(p->first))
@@ -10348,26 +10349,26 @@ void MDCache::send_dentry_unlink(CDentry *dn, CDentry *straydn, MDRequestRef& md
 {
   dout(10) << "send_dentry_unlink " << *dn << dendl;
   // share unlink news with replicas
-  map<mds_rank_t,unsigned> replicas;
-  replicas.insert(dn->replicas_begin(), dn->replicas_end());
+  set<mds_rank_t> replicas;
+  dn->list_replicas(replicas);
   if (straydn)
-    replicas.insert(straydn->replicas_begin(), straydn->replicas_end());
-  for (map<mds_rank_t,unsigned>::iterator it = replicas.begin();
+    straydn->list_replicas(replicas);
+  for (set<mds_rank_t>::iterator it = replicas.begin();
        it != replicas.end();
        ++it) {
     // don't tell (rmdir) witnesses; they already know
-    if (mdr.get() && mdr->more()->witnessed.count(it->first))
+    if (mdr.get() && mdr->more()->witnessed.count(*it))
       continue;
 
-    if (mds->mdsmap->get_state(it->first) < MDSMap::STATE_REJOIN ||
-       (mds->mdsmap->get_state(it->first) == MDSMap::STATE_REJOIN &&
-        rejoin_gather.count(it->first)))
+    if (mds->mdsmap->get_state(*it) < MDSMap::STATE_REJOIN ||
+       (mds->mdsmap->get_state(*it) == MDSMap::STATE_REJOIN &&
+        rejoin_gather.count(*it)))
       continue;
 
     MDentryUnlink *unlink = new MDentryUnlink(dn->get_dir()->dirfrag(), dn->name);
     if (straydn)
-      replicate_stray(straydn, it->first, unlink->straybl);
-    mds->send_message_mds(unlink, it->first);
+      replicate_stray(straydn, *it, unlink->straybl);
+    mds->send_message_mds(unlink, *it);
   }
 }
 
@@ -11182,8 +11183,8 @@ void MDCache::_fragment_stored(MDRequestRef& mdr)
 
   // tell peers
   CDir *first = *info.resultfrags.begin();
-  for (map<mds_rank_t,unsigned>::iterator p = first->replicas_begin();
-       p != first->replica_map.end();
+  for (compact_map<mds_rank_t,unsigned>::iterator p = first->replicas_begin();
+       p != first->replicas_end();
        ++p) {
     if (mds->mdsmap->get_state(p->first) < MDSMap::STATE_REJOIN ||
        (mds->mdsmap->get_state(p->first) == MDSMap::STATE_REJOIN &&
index a2c4710b3a84d594a38e99d3a801e9a7d21f46d2..e1f8ce8873ed51853f23958cebc9408a15f74597 100644 (file)
@@ -966,7 +966,7 @@ void Migrator::export_frozen(CDir *dir, uint64_t tid)
   MExportDirPrep *prep = new MExportDirPrep(dir->dirfrag(), it->second.tid);
 
   // include list of bystanders
-  for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+  for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
        p != dir->replicas_end();
        ++p) {
     if (p->first != it->second.peer) {
@@ -1146,7 +1146,7 @@ void Migrator::handle_export_prep_ack(MExportDirPrepAck *m)
          it->second.warning_ack_waiting.count(MDS_RANK_NONE) > 0));
   assert(it->second.notify_ack_waiting.empty());
 
-  for (map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
+  for (compact_map<mds_rank_t,unsigned>::iterator p = dir->replicas_begin();
        p != dir->replicas_end();
        ++p) {
     if (p->first == it->second.peer) continue;
index 1c78a8b1862b37ecbb13dde92e68d9cb31e1d811..c3d05e26535cfd42212e40df58da4348ff72b9e3 100644 (file)
@@ -367,8 +367,8 @@ public:
   }
 
   void init_gather() {
-    for (map<mds_rank_t,unsigned>::const_iterator p = parent->replicas_begin();
-        p != parent->replicas_end(); 
+    for (compact_map<mds_rank_t,unsigned>::iterator p = parent->replicas_begin();
+        p != parent->replicas_end();
         ++p)
       more()->gather_set.insert(p->first);
   }
index 95ebf496b229d75bdda5034b701ea3589d48cecf..e633fb58a24afcd4bc9818dbf807579427f7723e 100644 (file)
@@ -18,6 +18,7 @@
 #include "include/frag.h"
 #include "include/xlist.h"
 #include "include/interval_set.h"
+#include "include/compact_map.h"
 
 #include "inode_backtrace.h"
 
@@ -1378,7 +1379,7 @@ protected:
   // replication (across mds cluster)
  protected:
   unsigned             replica_nonce; // [replica] defined on replica
-  std::map<mds_rank_t,unsigned>        replica_map;   // [auth] mds -> nonce
+  compact_map<mds_rank_t,unsigned>     replica_map;   // [auth] mds -> nonce
 
  public:
   bool is_replicated() const { return !replica_map.empty(); }
@@ -1411,13 +1412,13 @@ protected:
       put(PIN_REPLICATED);
     replica_map.clear();
   }
-  std::map<mds_rank_t,unsigned>::iterator replicas_begin() { return replica_map.begin(); }
-  std::map<mds_rank_t,unsigned>::iterator replicas_end() { return replica_map.end(); }
-  const std::map<mds_rank_t,unsigned>& get_replicas() const { return replica_map; }
+  compact_map<mds_rank_t,unsigned>::iterator replicas_begin() { return replica_map.begin(); }
+  compact_map<mds_rank_t,unsigned>::iterator replicas_end() { return replica_map.end(); }
+  const compact_map<mds_rank_t,unsigned>& get_replicas() const { return replica_map; }
   void list_replicas(std::set<mds_rank_t>& ls) const {
-    for (std::map<mds_rank_t,unsigned>::const_iterator p = replica_map.begin();
+    for (compact_map<mds_rank_t,unsigned>::const_iterator p = replica_map.begin();
         p != replica_map.end();
-        ++p) 
+        ++p)
       ls.insert(p->first);
   }
 
@@ -1428,7 +1429,7 @@ protected:
   // ---------------------------------------------
   // waiting
  protected:
-  multimap<uint64_t, MDSInternalContextBase*>  waiting;
+  compact_multimap<uint64_t, MDSInternalContextBase*>  waiting;
 
  public:
   bool is_waiter_for(uint64_t mask, uint64_t min=0) {
@@ -1437,7 +1438,7 @@ protected:
       while (min & (min-1))  // if more than one bit is set
        min &= min-1;        //  clear LSB
     }
-    for (multimap<uint64_t,MDSInternalContextBase*>::iterator p = waiting.lower_bound(min);
+    for (compact_multimap<uint64_t,MDSInternalContextBase*>::iterator p = waiting.lower_bound(min);
         p != waiting.end();
         ++p) {
       if (p->first & mask) return true;
@@ -1457,7 +1458,7 @@ protected:
   }
   virtual void take_waiting(uint64_t mask, list<MDSInternalContextBase*>& ls) {
     if (waiting.empty()) return;
-    multimap<uint64_t,MDSInternalContextBase*>::iterator it = waiting.begin();
+    compact_multimap<uint64_t,MDSInternalContextBase*>::iterator it = waiting.begin();
     while (it != waiting.end()) {
       if (it->first & mask) {
        ls.push_back(it->second);