]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/net: make try_bind() aware about address_not_available.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 9 Sep 2021 06:09:54 +0000 (06:09 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 14 Sep 2021 10:01:35 +0000 (10:01 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/common/errorator.h
src/crimson/net/Messenger.h
src/crimson/net/Socket.cc
src/crimson/net/Socket.h
src/crimson/net/SocketMessenger.cc

index 53879cc9a002c68c649b9addb53ce1b89a684a88..4978f6f1c072ed0f95b689c5138f395ca0800b76 100644 (file)
@@ -1128,6 +1128,7 @@ namespace ct_error {
   using file_too_large =
     ct_error_code<std::errc::file_too_large>;
   using address_in_use = ct_error_code<std::errc::address_in_use>;
+  using address_not_available = ct_error_code<std::errc::address_not_available>;
 
   struct pass_further_all {
     template <class ErrorT>
index 179a752b746e140cf315e4d8128fa4a839ad3748..10d9feae3dff81c2a48fbc07e68a35e2a893835c 100644 (file)
@@ -63,7 +63,8 @@ public:
   }
 
   using bind_ertr = crimson::errorator<
-    crimson::ct_error::address_in_use // The address (range) is already bound
+    crimson::ct_error::address_in_use, // The address (range) is already bound
+    crimson::ct_error::address_not_available
     >;
   /// bind to the given address
   virtual bind_ertr::future<> bind(const entity_addrvec_t& addr) = 0;
index baecdf7561ff27be74ad8fd10598556133d34dc3..642bda4921f08439d2f11b9a51a7e1afcaebe4bf 100644 (file)
@@ -217,6 +217,10 @@ FixedCPUServerSocket::listen(entity_addr_t addr)
     if (e.code() == std::errc::address_in_use) {
       logger().trace("FixedCPUServerSocket::listen({}): address in use", addr);
       return crimson::ct_error::address_in_use::make();
+    } else if (e.code() == std::errc::address_not_available) {
+      logger().trace("FixedCPUServerSocket::listen({}): address not available",
+                     addr);
+      return crimson::ct_error::address_not_available::make();
     }
     logger().error("FixedCPUServerSocket::listen({}): "
                    "got unexpeted error {}", addr, e);
index 3a149cee1452753157105d32bcd8b0ec36cfb4c1..f2b9c2713913b827649cd24a31fff7225f962d9d 100644 (file)
@@ -161,7 +161,8 @@ class Socket
 };
 
 using listen_ertr = crimson::errorator<
-  crimson::ct_error::address_in_use // The address is already bound
+  crimson::ct_error::address_in_use, // The address is already bound
+  crimson::ct_error::address_not_available // https://techoverflow.net/2021/08/06/how-i-fixed-python-oserror-errno-99-cannot-assign-requested-address/
   >;
 
 class FixedCPUServerSocket
index eff85e1778ea1629be8ff2eb0074e4f7e22541da..2922c3a6d2391930b397894c5724a3415e648d1a 100644 (file)
@@ -102,27 +102,29 @@ SocketMessenger::try_bind(const entity_addrvec_t& addrs,
       auto to_bind = addr;
       to_bind.set_port(port);
       return do_listen(entity_addrvec_t{to_bind}
-      ).safe_then([this] () -> seastar::future<std::optional<bool>> {
+      ).safe_then([this] () -> seastar::future<std::optional<std::error_code>> {
         logger().info("{} try_bind: done", *this);
-        return seastar::make_ready_future<std::optional<bool>>(
-            std::make_optional<bool>(true));
+        return seastar::make_ready_future<std::optional<std::error_code>>(
+          std::make_optional<std::error_code>(std::error_code{/* success! */}));
       }, listen_ertr::all_same_way([this, max_port, &port]
-                                 (const std::error_code& e) mutable
-                                 -> seastar::future<std::optional<bool>> {
-        assert(e == std::errc::address_in_use);
-        logger().trace("{} try_bind: {} already used", *this, port);
+                                   (const std::error_code& e) mutable
+                                   -> seastar::future<std::optional<std::error_code>> {
+        logger().trace("{} try_bind: {} got error {}", *this, port, e);
         if (port == max_port) {
-          return seastar::make_ready_future<std::optional<bool>>(
-              std::make_optional<bool>(false));
+          return seastar::make_ready_future<std::optional<std::error_code>>(
+            std::make_optional<std::error_code>(e));
         }
         ++port;
-        return seastar::make_ready_future<std::optional<bool>>();
+        return seastar::make_ready_future<std::optional<std::error_code>>(
+          std::optional<std::error_code>{std::nullopt});
       }));
-    }).then([] (bool success) -> bind_ertr::future<> {
-      if (success) {
-        return bind_ertr::now();
-      } else {
+    }).then([] (const std::error_code e) -> bind_ertr::future<> {
+      if (!e) {
+        return bind_ertr::now(); // success!
+      } else if (e == std::errc::address_in_use) {
         return crimson::ct_error::address_in_use::make();
+      } else if (e == std::errc::address_not_available) {
+        return crimson::ct_error::address_not_available::make();
       }
     });
   });