]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/net: introduce 3 ways to abort the active protocol state
authorYingxin Cheng <yingxin.cheng@intel.com>
Wed, 7 Aug 2019 13:08:15 +0000 (21:08 +0800)
committerYingxin Cheng <yingxin.cheng@intel.com>
Mon, 12 Aug 2019 08:34:38 +0000 (16:34 +0800)
* abort_in_fault(): a fault is happening and needs to be handled.
* abort_protocol(): abort the current protocol state due to preemptive
                    state change.
* abort_in_close(): close this connection and abort the current protocol
                    state due to some fatal error.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
src/crimson/net/Errors.cc
src/crimson/net/Errors.h
src/crimson/net/ProtocolV2.cc

index abd34a809f92475265b45cadb8c4e93b573560c8..57d793250ec65858005729d7285d25c8580008e0 100644 (file)
@@ -49,6 +49,8 @@ const std::error_category& net_category()
           return "address in use";
         case error::broken_pipe:
           return "broken pipe";
+        case error::protocol_aborted:
+          return "protocol aborted";
         default:
           return "unknown";
       }
index d8c712bf2d06e45b5c2ac962848c1d7444fb5d22..596a0d5f2de8bf90b41ad8f05e19cd2eab773a18 100644 (file)
@@ -32,6 +32,7 @@ enum class error {
   invalid_argument,
   address_in_use,
   broken_pipe,
+  protocol_aborted,
 };
 
 /// net error category
index 0d97b62df73fb1c9b932f1ba8141694f308c7dad..49aa51549c4fb87b400e889610a7a89aa160376d 100644 (file)
@@ -54,12 +54,17 @@ seastar::logger& logger() {
   return ceph::get_logger(ceph_subsys_ms);
 }
 
-seastar::future<> abort_in_fault() {
+void abort_in_fault() {
   throw std::system_error(make_error_code(ceph::net::error::negotiation_failure));
 }
 
-seastar::future<> abort_in_close() {
-  throw std::system_error(make_error_code(ceph::net::error::connection_aborted));
+void abort_protocol() {
+  throw std::system_error(make_error_code(ceph::net::error::protocol_aborted));
+}
+
+void abort_in_close(ceph::net::ProtocolV2& proto) {
+  proto.close();
+  abort_protocol();
 }
 
 inline void expect_tag(const Tag& expected,
@@ -500,13 +505,13 @@ seastar::future<entity_type_t, entity_addr_t> ProtocolV2::banner_exchange()
         logger().error("{} peer does not support all required features"
                        " required={} peer_supported={}",
                        conn, required_features, peer_supported_features);
-        abort_in_close();
+        abort_in_close(*this);
       }
       if ((supported_features & peer_required_features) != peer_required_features) {
         logger().error("{} we do not support all peer required features"
                        " peer_required={} supported={}",
                        conn, peer_required_features, supported_features);
-        abort_in_close();
+        abort_in_close(*this);
       }
       this->peer_required_features = peer_required_features;
       if (this->peer_required_features == 0) {
@@ -631,7 +636,7 @@ seastar::future<> ProtocolV2::client_auth(std::vector<uint32_t> &allowed_methods
   } catch (const ceph::auth::error& e) {
     logger().error("{} get_initial_auth_request returned {}", conn, e);
     dispatch_reset();
-    abort_in_close();
+    abort_in_close(*this);
     return seastar::now();
   }
 }
@@ -848,7 +853,7 @@ void ProtocolV2::execute_connecting()
           if (state == state_t::CLOSING) {
             return socket->close().then([this] {
               logger().warn("{} is closed during Socket::connect()", conn);
-              abort_in_fault();
+              abort_protocol();
             });
           }
           return seastar::now();
@@ -861,7 +866,7 @@ void ProtocolV2::execute_connecting()
                           conn, ceph_entity_type_name(conn.get_peer_type()),
                           ceph_entity_type_name(_peer_type));
             dispatch_reset();
-            abort_in_close();
+            abort_in_close(*this);
           }
           conn.set_ephemeral_port(_my_addr_from_peer.get_port(),
                                   SocketConnection::side_t::connector);
@@ -965,7 +970,8 @@ seastar::future<> ProtocolV2::_handle_auth_request(bufferlist& auth_payload, boo
    }
    case -EBUSY: {
     logger().warn("{} auth_server handle_auth_request returned -EBUSY", conn);
-    return abort_in_fault();
+    abort_in_fault();
+    return seastar::now();
    }
    default: {
     logger().warn("{} auth_server handle_auth_request returned {}", conn, r);
@@ -1035,7 +1041,7 @@ seastar::future<bool> ProtocolV2::handle_existing_connection(SocketConnectionRef
                   " in favor of existing connection {}",
                   conn, peer_global_seq, exproto->peer_global_seq, *existing);
     dispatch_reset();
-    abort_in_close();
+    abort_in_close(*this);
   }
 
   if (existing->policy.lossy) {