]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/mon: fallback to msgr v2 for unbound msgr
authorKefu Chai <kchai@redhat.com>
Thu, 21 Jan 2021 12:35:55 +0000 (20:35 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 22 Jan 2021 05:07:48 +0000 (13:07 +0800)
so, for instance, if we want to connect to monitor without bind to any
address, we can try to use the v2 addresses advertised in monmap or
local settings, instead of being unable to connect to mon because we are
using an `entity_addr_t::TYPE_NONE` address which is returned by
`entity_addrvec_t::front()` if the addrvec is empty.

see also AsyncMessenger::should_use_msgr2().

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/mon/MonClient.cc

index 7aa7b65f578614e434e30086921ffe5fbec259a8..defa03f3422c9b102d3920825c72c0df0d0f2487 100644 (file)
@@ -957,7 +957,13 @@ seastar::future<> Client::reopen_session(int rank)
   pending_conns.reserve(mons.size());
   return seastar::parallel_for_each(mons, [this](auto rank) {
     // TODO: connect to multiple addrs
-    auto peer = monmap.get_addrs(rank).pick_addr(msgr.get_myaddr().get_type());
+    // connect to v2 addresses if we have not bound to any address, otherwise
+    // use the advertised msgr protocol
+    uint32_t type = msgr.get_myaddr().get_type();
+    if (type == entity_addr_t::TYPE_NONE) {
+      type = entity_addr_t::TYPE_MSGR2;
+    }
+    auto peer = monmap.get_addrs(rank).pick_addr(type);
     if (peer == entity_addr_t{}) {
       // crimson msgr only uses the first bound addr
       logger().warn("mon.{} does not have an addr compatible with my type: {}",