From: Yan, Zheng Date: Fri, 6 Feb 2015 11:15:41 +0000 (+0800) Subject: mds: use compact_map to optimize memory usage of MDSCacheObject X-Git-Tag: v9.0.0~201^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dbca3c2654022e7a81d1b724d2fc22709ea72982;p=ceph.git mds: use compact_map to optimize memory usage of MDSCacheObject 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 --- diff --git a/src/mds/CDir.cc b/src/mds/CDir.cc index 235b0dd8cb23..9943add99f16 100644 --- a/src/mds/CDir.cc +++ b/src/mds/CDir.cc @@ -1029,8 +1029,8 @@ void CDir::merge(list& subs, list& waiters, bool steal_dentry(dir->items.begin()->second); // merge replica map - for (map::iterator p = dir->replicas_begin(); - p != dir->replica_map.end(); + for (compact_map::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::const_iterator i = replica_map.begin(); - i != replica_map.end(); ++i) { + for (compact_map::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); diff --git a/src/mds/CDir.h b/src/mds/CDir.h index f72a24987ea0..75ddd12d8b00 100644 --- a/src/mds/CDir.h +++ b/src/mds/CDir.h @@ -428,10 +428,7 @@ private: // for giving to clients void get_dist_spec(std::set& ls, mds_rank_t auth) { if (is_rep()) { - for (std::map::iterator p = replicas_begin(); - p != replicas_end(); - ++p) - ls.insert(p->first); + list_replicas(ls); if (!ls.empty()) ls.insert(auth); } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 02844864009f..d5dd693c3db2 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -129,8 +129,8 @@ void Locker::tick() void Locker::send_lock_message(SimpleLock *lock, int msg) { - for (map::iterator it = lock->get_parent()->replicas_begin(); - it != lock->get_parent()->replicas_end(); + for (compact_map::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::iterator it = lock->get_parent()->replicas_begin(); - it != lock->get_parent()->replicas_end(); + for (compact_map::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; diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index f1607465c212..a1a3c2217eaa 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -1963,8 +1963,9 @@ update: msg->quota = i->quota; mds->send_message_client_counted(msg, session->connection); } - for (map::iterator it = in->replicas_begin(); - it != in->replicas_end(); ++it) { + for (compact_map::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::iterator r = dir->replicas_begin(); + for (compact_map::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::iterator r = dn->replicas_begin(); + for (compact_map::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::iterator r = in->replicas_begin(); + for (compact_map::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::iterator r = root->replicas_begin(); + for (compact_map::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::iterator r = myin->replicas_begin(); + for (compact_map::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::iterator r = in->replicas_begin(); + for (compact_map::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::iterator p = dir->replicas_begin(); + for (compact_map::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::iterator p = dn->replicas_begin(); - p != dn->replicas_end(); + for (compact_map::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 replicas; - replicas.insert(dn->replicas_begin(), dn->replicas_end()); + set replicas; + dn->list_replicas(replicas); if (straydn) - replicas.insert(straydn->replicas_begin(), straydn->replicas_end()); - for (map::iterator it = replicas.begin(); + straydn->list_replicas(replicas); + for (set::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::iterator p = first->replicas_begin(); - p != first->replica_map.end(); + for (compact_map::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 && diff --git a/src/mds/Migrator.cc b/src/mds/Migrator.cc index a2c4710b3a84..e1f8ce8873ed 100644 --- a/src/mds/Migrator.cc +++ b/src/mds/Migrator.cc @@ -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::iterator p = dir->replicas_begin(); + for (compact_map::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::iterator p = dir->replicas_begin(); + for (compact_map::iterator p = dir->replicas_begin(); p != dir->replicas_end(); ++p) { if (p->first == it->second.peer) continue; diff --git a/src/mds/SimpleLock.h b/src/mds/SimpleLock.h index 1c78a8b1862b..c3d05e26535c 100644 --- a/src/mds/SimpleLock.h +++ b/src/mds/SimpleLock.h @@ -367,8 +367,8 @@ public: } void init_gather() { - for (map::const_iterator p = parent->replicas_begin(); - p != parent->replicas_end(); + for (compact_map::iterator p = parent->replicas_begin(); + p != parent->replicas_end(); ++p) more()->gather_set.insert(p->first); } diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 95ebf496b229..e633fb58a24a 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -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 replica_map; // [auth] mds -> nonce + compact_map 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::iterator replicas_begin() { return replica_map.begin(); } - std::map::iterator replicas_end() { return replica_map.end(); } - const std::map& get_replicas() const { return replica_map; } + compact_map::iterator replicas_begin() { return replica_map.begin(); } + compact_map::iterator replicas_end() { return replica_map.end(); } + const compact_map& get_replicas() const { return replica_map; } void list_replicas(std::set& ls) const { - for (std::map::const_iterator p = replica_map.begin(); + for (compact_map::const_iterator p = replica_map.begin(); p != replica_map.end(); - ++p) + ++p) ls.insert(p->first); } @@ -1428,7 +1429,7 @@ protected: // --------------------------------------------- // waiting protected: - multimap waiting; + compact_multimap 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::iterator p = waiting.lower_bound(min); + for (compact_multimap::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& ls) { if (waiting.empty()) return; - multimap::iterator it = waiting.begin(); + compact_multimap::iterator it = waiting.begin(); while (it != waiting.end()) { if (it->first & mask) { ls.push_back(it->second);