From: Sage Weil Date: Tue, 26 Aug 2014 15:16:29 +0000 (-0700) Subject: osd/OSDMap: encode blacklist in deterministic order X-Git-Tag: v0.80.6~27 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=994a9e35e96984c0806261f7eb349d95c0fb4873;p=ceph.git osd/OSDMap: encode blacklist in deterministic order When we use an unordered_map the encoding order is non-deterministic, which is problematic for OSDMap. Construct an ordered map<> on encode and use that. This lets us keep the hash table for lookups in the general case. Fixes: #9211 Backport: firefly Signed-off-by: Sage Weil (cherry picked from commit 4672e50922b75d642056020b9745a3a5844424d3) --- diff --git a/src/osd/OSDMap.cc b/src/osd/OSDMap.cc index 2ba9a8e1de65..370c1e334064 100644 --- a/src/osd/OSDMap.cc +++ b/src/osd/OSDMap.cc @@ -1749,7 +1749,15 @@ void OSDMap::encode_classic(bufferlist& bl, uint64_t features) const ::encode(ev, bl); ::encode(osd_addrs->hb_back_addr, bl); ::encode(osd_info, bl); - ::encode(blacklist, bl); + { + // put this in a sorted, ordered map<> so that we encode in a + // deterministic order. + map blacklist_map; + for (ceph::unordered_map::const_iterator p = + blacklist.begin(); p != blacklist.end(); ++p) + blacklist_map.insert(make_pair(p->first, p->second)); + ::encode(blacklist_map, bl); + } ::encode(osd_addrs->cluster_addr, bl); ::encode(cluster_snapshot_epoch, bl); ::encode(cluster_snapshot, bl); @@ -2165,6 +2173,7 @@ void OSDMap::generate_test_instances(list& o) uuid_d fsid; o.back()->build_simple(cct, 1, fsid, 16, 7, 8); o.back()->created = o.back()->modified = utime_t(1, 2); // fix timestamp + o.back()->blacklist[entity_addr_t()] = utime_t(5, 6); cct->put(); }