From: Yan, Zheng Date: Fri, 6 Feb 2015 11:11:53 +0000 (+0800) Subject: fragtree_t: define fragtree_t::_splits as compact_map X-Git-Tag: v9.0.0~201^2~10 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=98c368f1714de293da78127524cca34689ad9367;p=ceph.git fragtree_t: define fragtree_t::_splits as compact_map In most case, directory inode only contain one dirfrag. So fragtree_t for most directory inode is empty. define fragtree_t::_splits as compact_map can reduce memory usage of CInode. Signed-off-by: Yan, Zheng --- diff --git a/src/include/frag.h b/src/include/frag.h index 60bb0cd9b265..1b4716422de5 100644 --- a/src/include/frag.h +++ b/src/include/frag.h @@ -16,12 +16,12 @@ #define CEPH_FRAG_H #include -#include #include #include #include #include "buffer.h" +#include "compact_map.h" #include "ceph_frag.h" #include "include/assert.h" @@ -177,7 +177,7 @@ class fragtree_t { // frag_t f is split by b bits. // if child frag_t does not appear, it is not split. public: - std::map _splits; + compact_map _splits; public: // ------------- @@ -195,7 +195,7 @@ public: return _splits.empty(); } int get_split(const frag_t hb) const { - std::map::const_iterator p = _splits.find(hb); + compact_map::const_iterator p = _splits.find(hb); if (p == _splits.end()) return 0; else @@ -459,6 +459,22 @@ public: void decode(bufferlist::iterator& p) { ::decode(_splits, p); } + void encode_nohead(bufferlist& bl) const { + for (compact_map::const_iterator p = _splits.begin(); + p != _splits.end(); + ++p) { + ::encode(p->first, bl); + ::encode(p->second, bl); + } + } + void decode_nohead(int n, bufferlist::iterator& p) { + _splits.clear(); + while (n-- > 0) { + frag_t f; + ::decode(f, p); + ::decode(_splits[f], p); + } + } void print(std::ostream& out) { out << "fragtree_t("; @@ -496,9 +512,9 @@ inline std::ostream& operator<<(std::ostream& out, const fragtree_t& ft) { out << "fragtree_t("; - for (std::map::const_iterator p = ft._splits.begin(); + for (compact_map::const_iterator p = ft._splits.begin(); p != ft._splits.end(); - p++) { + ++p) { if (p != ft._splits.begin()) out << " "; out << p->first << "^" << p->second; diff --git a/src/mds/CInode.cc b/src/mds/CInode.cc index 779efbf46111..e98c74af08b7 100644 --- a/src/mds/CInode.cc +++ b/src/mds/CInode.cc @@ -3202,12 +3202,9 @@ int CInode::encode_inodestat(bufferlist& bl, Session *session, // encode e.fragtree.nsplits = dirfragtree._splits.size(); ::encode(e, bl); - for (map::iterator p = dirfragtree._splits.begin(); - p != dirfragtree._splits.end(); - ++p) { - ::encode(p->first, bl); - ::encode(p->second, bl); - } + + dirfragtree.encode_nohead(bl); + ::encode(symlink, bl); if (session->connection->has_feature(CEPH_FEATURE_DIRLAYOUTHASH)) { i = pfile ? pi : oi; diff --git a/src/messages/MClientReply.h b/src/messages/MClientReply.h index 0a28a63c7c3f..d3ee05e9537b 100644 --- a/src/messages/MClientReply.h +++ b/src/messages/MClientReply.h @@ -159,13 +159,8 @@ struct InodeStat { rstat.rfiles = e.rfiles; rstat.rsubdirs = e.rsubdirs; - int n = e.fragtree.nsplits; - while (n) { - ceph_frag_tree_split s; - ::decode(s, p); - dirfragtree._splits[(__u32)s.frag] = s.by; - n--; - } + dirfragtree.decode_nohead(e.fragtree.nsplits, p); + ::decode(symlink, p); if (features & CEPH_FEATURE_DIRLAYOUTHASH)