From 9bd65a88aea692072fbcc6140c1f772a670d901b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Thu, 7 Nov 2019 12:54:00 -0600 Subject: [PATCH] mon/MonMap: encode (more) valid compat monmap when we have v2-only addrs If we have 1 or more mons with v2-only addrs, pre-nautilus clients can't talk to them. If there are more than 1 such mons in the map, they also fail when loading the map because they expect the addrs to be unique. In such situations, lie by giving them v1 addrs that are actually v2 ip:port (so not actually valid). Hopefully there are enough other mons that do have v1 addrs that the clients can still connect. Fixes: https://tracker.ceph.com/issues/42600 Signed-off-by: Sage Weil (cherry picked from commit c457db1205cd36352115137be232d07e0493af8d) --- src/mon/MonMap.cc | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/mon/MonMap.cc b/src/mon/MonMap.cc index 90330a1dab387..f03193e044dd0 100644 --- a/src/mon/MonMap.cc +++ b/src/mon/MonMap.cc @@ -36,7 +36,16 @@ void mon_info_t::encode(bufferlist& bl, uint64_t features) const ENCODE_START(v, 1, bl); encode(name, bl); if (v < 3) { - encode(public_addrs.legacy_addr(), bl, features); + auto a = public_addrs.legacy_addr(); + if (a != entity_addr_t()) { + encode(a, bl, features); + } else { + // note: we don't have a legacy addr here, so lie so that it looks + // like one, just so that old clients get a valid-looking map. + // they won't be able to talk to the v2 mons, but that's better + // than nothing. + encode(public_addrs.as_legacy_addr(), bl, features); + } } else { encode(public_addrs, bl, features); } -- 2.39.5