]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/net: add Messenger::try_bind()
authorKefu Chai <kchai@redhat.com>
Thu, 31 Jan 2019 10:07:20 +0000 (18:07 +0800)
committerKefu Chai <kchai@redhat.com>
Sat, 2 Feb 2019 05:20:00 +0000 (13:20 +0800)
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 <kchai@redhat.com>
src/crimson/net/Messenger.h
src/crimson/net/SocketMessenger.cc
src/crimson/net/SocketMessenger.h

index 5033bfe10907afb47d314f8bc19a4d0eecdecbf4..6b77e3f5718ce1c042cdb7bcad82487defa31499 100644 (file)
@@ -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;
 
index 74a0b86333e2cea8935c60910cb0687e217a0489..c0ad81cd3b68fb4fc9cbd8fc8bc7349f713adf71 100644 (file)
@@ -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;
index 4843d569527f124520e041a2baf5c330a0d265e0..0fb5d9fd7dd0a8f03d4b15c55911b684abef6374 100644 (file)
@@ -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,