]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/net: connection closed during connecting
authorYingxin <yingxin.cheng@intel.com>
Wed, 17 Oct 2018 20:45:53 +0000 (04:45 +0800)
committerYingxin <yingxin.cheng@intel.com>
Tue, 20 Nov 2018 12:48:35 +0000 (20:48 +0800)
It is possible during `seastar::connect()`, the connection is marked
closed (when SocketConnection::socket is unavailable), then
`seastar::connect()` successfully returns a connected socket.

Signed-off-by: Yingxin <yingxin.cheng@intel.com>
src/crimson/net/SocketConnection.cc

index 26bd1e491f3076f7f5eb29655fbe4b9fb761d6f2..c9eae3a94331c00d03bebe5195e38c5ae1f6fbf1 100644 (file)
@@ -307,11 +307,17 @@ seastar::future<> SocketConnection::close()
     // cannot happen
     ceph_assert(false);
   }
-  state = state_t::closing;
 
   // close_ready become valid only after state is state_t::closing
   assert(!close_ready.valid());
-  close_ready = socket->close().finally(std::move(cleanup));
+
+  if (socket) {
+    close_ready = socket->close().finally(std::move(cleanup));
+  } else {
+    ceph_assert(state == state_t::connecting);
+    close_ready = seastar::now();
+  }
+  state = state_t::closing;
   return close_ready.get_future();
 }
 
@@ -764,6 +770,11 @@ SocketConnection::start_connect(const entity_addr_t& _peer_addr,
   state = state_t::connecting;
   return seastar::connect(peer_addr.in4_addr())
     .then([this](seastar::connected_socket fd) {
+      if (state == state_t::closing) {
+        fd.shutdown_input();
+        fd.shutdown_output();
+        throw std::system_error(make_error_code(error::connection_aborted));
+      }
       socket.emplace(std::move(fd));
       // read server's handshake header
       return socket->read(server_header_size);