]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdmap: dedup addrs and addr vectors between maps
authorSage Weil <sage@newdream.net>
Wed, 25 Apr 2012 22:44:06 +0000 (15:44 -0700)
committerSage Weil <sage@newdream.net>
Fri, 27 Apr 2012 01:49:19 +0000 (18:49 -0700)
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 <sage@newdream.net>
src/osd/OSDMap.cc
src/osd/OSDMap.h

index db6c7acd569b0909de8005ec82707b975f4c93a2..296ea65f9f30604e778c2c090074b1563ab2fdf9 100644 (file)
@@ -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)
index 9e622d28f9d36b2bf2fa36ecdfa0ea79ee37fbf3..edac29f055a4afa1948d37382b1d6d270179a006 100644 (file)
@@ -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;