From e95026f6be44f5aae93f005d249ffcf66bef15fd Mon Sep 17 00:00:00 2001 From: Pan Liu Date: Fri, 18 Nov 2016 20:01:42 +0800 Subject: [PATCH 1/2] OSD: heartbeat peers need to be updated when a new OSD added into an already existed cluster Signed-off-by: Pan Liu --- src/osd/OSD.cc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index f294aad6007..7510beea499 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6659,6 +6659,7 @@ void OSD::note_down_osd(int peer) void OSD::note_up_osd(int peer) { service.forget_peer_epoch(peer, osdmap->get_epoch() - 1); + heartbeat_set_peers_need_update(); } struct C_OnMapCommit : public Context { @@ -6989,6 +6990,10 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m) waited_for_reservations = true; } note_down_osd(*p); + } else if (*p != whoami && + !osdmap->have_inst(*p) && + newmap->is_up(*p)) { + note_up_osd(*p); } } From 01dfc1ba07501da02f5af2dbd876936a890084f0 Mon Sep 17 00:00:00 2001 From: Pan Liu Date: Fri, 18 Nov 2016 20:49:15 +0800 Subject: [PATCH 2/2] OSD: remove 'has_inst', which has the same function as 'is_up' Signed-off-by: Pan Liu --- src/mon/OSDMonitor.cc | 2 +- src/osd/OSD.cc | 10 +++++----- src/osd/OSDMap.h | 3 --- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 8d5aeeff119..aa3179faf55 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -1566,7 +1566,7 @@ bool OSDMonitor::preprocess_failure(MonOpRequestRef op) // weird? - if (!osdmap.have_inst(badboy)) { + if (osdmap.is_down(badboy)) { dout(5) << "preprocess_failure dne(/dup?): " << m->get_target() << ", from " << m->get_orig_source_inst() << dendl; if (m->get_epoch() < osdmap.get_epoch()) send_incremental(op, m->get_epoch()+1); diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 7510beea499..7c3ebe4dce2 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -6983,15 +6983,15 @@ void OSD::_committed_osd_maps(epoch_t first, epoch_t last, MOSDMap *m) osdmap->get_all_osds(old); for (set::iterator p = old.begin(); p != old.end(); ++p) { if (*p != whoami && - osdmap->have_inst(*p) && // in old map - !newmap->is_up(*p)) { // but not the new one + osdmap->is_up(*p) && // in old map + newmap->is_down(*p)) { // but not the new one if (!waited_for_reservations) { service.await_reserved_maps(); waited_for_reservations = true; } note_down_osd(*p); } else if (*p != whoami && - !osdmap->have_inst(*p) && + osdmap->is_down(*p) && newmap->is_up(*p)) { note_up_osd(*p); } @@ -7502,11 +7502,11 @@ bool OSD::require_same_peer_instance(Message *m, OSDMapRef& map, { int from = m->get_source().num(); - if (!map->have_inst(from) || + if (map->is_down(from) || (map->get_cluster_addr(from) != m->get_source_inst().addr)) { dout(5) << "from dead osd." << from << ", marking down, " << " msg was " << m->get_source_inst().addr - << " expected " << (map->have_inst(from) ? + << " expected " << (map->is_up(from) ? map->get_cluster_addr(from) : entity_addr_t()) << dendl; ConnectionRef con = m->get_connection(); diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index bfa7a653380..ddbfbb8d67c 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -460,9 +460,6 @@ public: return identify_osd(addr) >= 0; } int find_osd_on_ip(const entity_addr_t& ip) const; - bool have_inst(int osd) const { - return exists(osd) && is_up(osd); - } const entity_addr_t &get_addr(int osd) const { assert(exists(osd)); return osd_addrs->client_addr[osd] ? *osd_addrs->client_addr[osd] : osd_addrs->blank;