From: Sage Weil Date: Wed, 6 Mar 2019 17:22:18 +0000 (-0600) Subject: mon/OSDMonitor: use legacy_equals to compare osd addrs X-Git-Tag: v14.1.1~21^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=301c2e79e37d75e894aea4028b7764bf828310e1;p=ceph-ci.git mon/OSDMonitor: use legacy_equals to compare osd addrs The OSDs may bind to v2+v1 due to ms_bind_msgr2, but we may only use the v1 address in the OSDMap due to - the osd->mon connection being v1 (mon isn't using v2 yet) - the osd require_osd_release < nautilus - ??? Conversely, the OSD may end up with a v2+v1 address in the osdmap, but may connect to the current monitor via v1 only, due to the mon only being bound to a v1 address. If/when this happens, make sure we are doing a loose comparison of the osdmap addrs vs the osd's addr they are connecting from. Fixes: http://tracker.ceph.com/issues/38598 Signed-off-by: Sage Weil --- diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 266964f5917..695595e5c0e 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -2299,7 +2299,7 @@ bool OSDMonitor::preprocess_failure(MonOpRequestRef op) if (m->get_orig_source().is_osd()) { int from = m->get_orig_source().num(); if (!osdmap.exists(from) || - osdmap.get_addrs(from) != m->get_orig_source_addrs() || + !osdmap.get_addrs(from).legacy_equals(m->get_orig_source_addrs()) || (osdmap.is_down(from) && m->if_osd_failed())) { dout(5) << "preprocess_failure from dead osd." << from << ", ignoring" << dendl; @@ -2844,12 +2844,12 @@ bool OSDMonitor::preprocess_boot(MonOpRequestRef op) // already booted? if (osdmap.is_up(from) && - osdmap.get_addrs(from) == m->get_orig_source_addrs() && - osdmap.get_cluster_addrs(from) == m->cluster_addrs) { + osdmap.get_addrs(from).legacy_equals(m->get_orig_source_addrs()) && + osdmap.get_cluster_addrs(from).legacy_equals(m->cluster_addrs)) { // yup. dout(7) << "preprocess_boot dup from " << m->get_orig_source() << " " << m->get_orig_source_addrs() - << " == " << osdmap.get_addrs(from) << dendl; + << " =~ " << osdmap.get_addrs(from) << dendl; _booted(op, false); return true; } @@ -2866,7 +2866,8 @@ bool OSDMonitor::preprocess_boot(MonOpRequestRef op) if (osdmap.exists(from) && osdmap.get_info(from).up_from > m->version && - osdmap.get_most_recent_addrs(from) == m->get_orig_source_addrs()) { + osdmap.get_most_recent_addrs(from).legacy_equals( + m->get_orig_source_addrs())) { dout(7) << "prepare_boot msg from before last up_from, ignoring" << dendl; send_latest(op, m->sb.current_epoch+1); return true; @@ -2917,8 +2918,9 @@ bool OSDMonitor::prepare_boot(MonOpRequestRef op) dout(7) << __func__ << " was up, first marking down osd." << from << " " << osdmap.get_addrs(from) << dendl; // preprocess should have caught these; if not, assert. - ceph_assert(osdmap.get_addrs(from) != m->get_orig_source_addrs() || - osdmap.get_cluster_addrs(from) != m->cluster_addrs); + ceph_assert(!osdmap.get_addrs(from).legacy_equals( + m->get_orig_source_addrs()) || + !osdmap.get_cluster_addrs(from).legacy_equals(m->cluster_addrs)); ceph_assert(osdmap.get_uuid(from) == m->sb.osd_fsid); if (pending_inc.new_state.count(from) == 0 || @@ -3084,9 +3086,10 @@ bool OSDMonitor::preprocess_full(MonOpRequestRef op) goto ignore; } if ((!osdmap.is_up(from) && - osdmap.get_most_recent_addrs(from) == m->get_orig_source_addrs()) || + osdmap.get_most_recent_addrs(from).legacy_equals( + m->get_orig_source_addrs())) || (osdmap.is_up(from) && - osdmap.get_addrs(from) != m->get_orig_source_addrs())) { + !osdmap.get_addrs(from).legacy_equals(m->get_orig_source_addrs()))) { dout(7) << __func__ << " ignoring full message from down " << m->get_orig_source_inst() << dendl; goto ignore; @@ -3167,7 +3170,7 @@ bool OSDMonitor::preprocess_alive(MonOpRequestRef op) } if (!osdmap.is_up(from) || - osdmap.get_addrs(from) != m->get_orig_source_addrs()) { + !osdmap.get_addrs(from).legacy_equals(m->get_orig_source_addrs())) { dout(7) << "preprocess_alive ignoring alive message from down " << m->get_orig_source() << " " << m->get_orig_source_addrs() << dendl; @@ -3246,7 +3249,8 @@ bool OSDMonitor::prepare_pg_created(MonOpRequestRef op) auto from = src.num(); if (!src.is_osd() || !mon->osdmon()->osdmap.is_up(from) || - m->get_orig_source_addrs() != mon->osdmon()->osdmap.get_addrs(from)) { + !mon->osdmon()->osdmap.get_addrs(from).legacy_equals( + m->get_orig_source_addrs())) { dout(1) << __func__ << " ignoring stats from non-active osd." << dendl; return false; } @@ -3370,7 +3374,7 @@ bool OSDMonitor::preprocess_pgtemp(MonOpRequestRef op) } if (!osdmap.is_up(from) || - osdmap.get_addrs(from) != m->get_orig_source_addrs()) { + !osdmap.get_addrs(from).legacy_equals(m->get_orig_source_addrs())) { dout(7) << "ignoring pgtemp message from down " << m->get_orig_source() << " " << m->get_orig_source_addrs() << dendl; @@ -3612,7 +3616,7 @@ bool OSDMonitor::prepare_beacon(MonOpRequestRef op) if (!src.is_osd() || !osdmap.is_up(from) || - beacon->get_orig_source_addrs() != osdmap.get_addrs(from)) { + !osdmap.get_addrs(from).legacy_equals(beacon->get_orig_source_addrs())) { if (src.is_osd() && !osdmap.is_up(from)) { // share some new maps with this guy in case it may not be // aware of its own deadness...