From: Kefu Chai Date: Thu, 31 Jan 2019 10:07:20 +0000 (+0800) Subject: crimson/net: add Messenger::try_bind() X-Git-Tag: v14.1.0~225^2~4 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=66826c86f493753e002cf167a722de5b88fa8776;p=ceph-ci.git crimson/net: add Messenger::try_bind() in case the server is just fine with any unused local port number, and it will report it to monitor. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/net/Messenger.h b/src/crimson/net/Messenger.h index 5033bfe1090..6b77e3f5718 100644 --- a/src/crimson/net/Messenger.h +++ b/src/crimson/net/Messenger.h @@ -44,6 +44,10 @@ class Messenger { /// bind to the given address virtual void bind(const entity_addrvec_t& addr) = 0; + /// try to bind to the first unused port of given address + virtual void try_bind(const entity_addrvec_t& addr, + uint32_t min_port, uint32_t max_port) = 0; + /// start the messenger virtual seastar::future<> start(Dispatcher *dispatcher) = 0; diff --git a/src/crimson/net/SocketMessenger.cc b/src/crimson/net/SocketMessenger.cc index 74a0b86333e..c0ad81cd3b6 100644 --- a/src/crimson/net/SocketMessenger.cc +++ b/src/crimson/net/SocketMessenger.cc @@ -54,13 +54,35 @@ void SocketMessenger::bind(const entity_addrvec_t& addrs) } set_myaddrs(addrs); - + logger().info("listening on {}", addr); seastar::socket_address address(addr.in4_addr()); seastar::listen_options lo; lo.reuse_address = true; listener = seastar::listen(address, lo); } +void SocketMessenger::try_bind(const entity_addrvec_t& addrs, + uint32_t min_port, uint32_t max_port) +{ + auto addr = addrs.legacy_or_front_addr(); + if (addr.get_port() != 0) { + return bind(addrs); + } + for (auto port = min_port; port <= max_port; port++) { + try { + addr.set_port(port); + bind(entity_addrvec_t{addr}); + logger().info("{}: try_bind: done", *this); + return; + } catch (const std::system_error& e) { + logger().debug("{}: try_bind: {} already used", *this, port); + if (port == max_port) { + throw; + } + } + } +} + seastar::future<> SocketMessenger::start(Dispatcher *disp) { dispatcher = disp; diff --git a/src/crimson/net/SocketMessenger.h b/src/crimson/net/SocketMessenger.h index 4843d569527..0fb5d9fd7dd 100644 --- a/src/crimson/net/SocketMessenger.h +++ b/src/crimson/net/SocketMessenger.h @@ -52,6 +52,9 @@ class SocketMessenger final : public Messenger { void bind(const entity_addrvec_t& addr) override; + void try_bind(const entity_addrvec_t& addr, + uint32_t min_port, uint32_t max_port) override; + seastar::future<> start(Dispatcher *dispatcher) override; ConnectionRef connect(const entity_addr_t& peer_addr,