From: Sage Weil Date: Wed, 25 Apr 2012 22:44:06 +0000 (-0700) Subject: osdmap: dedup addrs and addr vectors between maps X-Git-Tag: v0.47~87^2~14 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d6359d4465c8dfb46e989acb7ae3e4d0b357331f;p=ceph.git osdmap: dedup addrs and addr vectors between maps Compare two maps. If an addrs matches, share the reference. If all addrs match, share the entire vector. This leads to roughly 70% drop in memory utilization for the set of thrashed maps I'm working with. Signed-off-by: Sage Weil --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index db6c7acd569b..296ea65f9f30 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -562,6 +562,42 @@ bool OSDMap::find_osd_on_ip(const entity_addr_t& ip) const return -1; } +void OSDMap::dedup(const OSDMap *o, OSDMap *n) +{ + if (o->epoch == n->epoch) + return; + + int diff = 0; + if (o->max_osd != n->max_osd) + diff++; + for (int i = 0; i < o->max_osd && i < n->max_osd; i++) { + if ((o->epoch < n->epoch && n->osd_info[i].up_from <= o->epoch) || + (o->epoch > n->epoch && o->osd_info[i].up_from <= n->epoch)) { + // same up interval, all should match... but let's be paranoid! + if (n->osd_addrs->client_addr[i] && o->osd_addrs->client_addr[i] && + *n->osd_addrs->client_addr[i] == *o->osd_addrs->client_addr[i]) + n->osd_addrs->client_addr[i] = o->osd_addrs->client_addr[i]; + if (n->osd_addrs->client_addr[i] && o->osd_addrs->client_addr[i] && + *n->osd_addrs->cluster_addr[i] == *o->osd_addrs->cluster_addr[i]) + n->osd_addrs->cluster_addr[i] = o->osd_addrs->cluster_addr[i]; + if (n->osd_addrs->client_addr[i] && o->osd_addrs->client_addr[i] && + *n->osd_addrs->hb_addr[i] == *o->osd_addrs->hb_addr[i]) + n->osd_addrs->hb_addr[i] = o->osd_addrs->hb_addr[i]; + } else if (n->osd_addrs->client_addr[i] && o->osd_addrs->client_addr[i] && + *n->osd_addrs->client_addr[i] == *o->osd_addrs->client_addr[i]) { + // client addr matches + n->osd_addrs->client_addr[i] = o->osd_addrs->client_addr[i]; + } else { + diff++; + } + } + + if (diff == 0) { + // zoinks, no differences at all! + n->osd_addrs = o->osd_addrs; + } +} + int OSDMap::apply_incremental(Incremental &inc) { if (inc.epoch == 1) diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 9e622d28f9d3..edac29f055a4 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -364,6 +364,9 @@ private: int apply_incremental(Incremental &inc); + /// try to re-use/reference addrs in oldmap from newmap + static void dedup(const OSDMap *oldmap, OSDMap *newmap); + // serialize, unserialize private: void encode_client_old(bufferlist& bl) const;