trafficserver-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From mas...@apache.org
Subject [trafficserver] branch quic-latest updated: Fix a crash on idle timeout
Date Fri, 01 Dec 2017 07:29:33 GMT
This is an automated email from the ASF dual-hosted git repository.

maskit pushed a commit to branch quic-latest
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/quic-latest by this push:
     new 877d9ff  Fix a crash on idle timeout
877d9ff is described below

commit 877d9ff1f2f867ca184e83fae4fde41ec1d8c910
Author: Masakazu Kitajo <maskit@apache.org>
AuthorDate: Fri Dec 1 16:29:10 2017 +0900

    Fix a crash on idle timeout
---
 iocore/net/P_QUICNetVConnection.h |  4 +++-
 iocore/net/QUICNetVConnection.cc  | 39 +++++++++++++++++++++------------------
 2 files changed, 24 insertions(+), 19 deletions(-)

diff --git a/iocore/net/P_QUICNetVConnection.h b/iocore/net/P_QUICNetVConnection.h
index c80a2b6..77b13f1 100644
--- a/iocore/net/P_QUICNetVConnection.h
+++ b/iocore/net/P_QUICNetVConnection.h
@@ -260,9 +260,11 @@ private:
   int _complete_handshake_if_possible();
   void _switch_to_handshake_state();
   void _switch_to_established_state();
-  void _switch_to_closing_state();
+  void _switch_to_closing_state(QUICConnectionErrorUPtr error);
   void _switch_to_close_state();
 
+  void _handle_idle_timeout();
+
   QUICStatelessToken _token;
 };
 
diff --git a/iocore/net/QUICNetVConnection.cc b/iocore/net/QUICNetVConnection.cc
index 9522cc3..97ec7b6 100644
--- a/iocore/net/QUICNetVConnection.cc
+++ b/iocore/net/QUICNetVConnection.cc
@@ -302,12 +302,7 @@ QUICNetVConnection::close(QUICConnectionErrorUPtr error)
       this->handler == reinterpret_cast<ContinuationHandler>(&QUICNetVConnection::state_connection_closing))
{
     // do nothing
   } else {
-    this->_switch_to_closing_state();
-    if (error->cls == QUICErrorClass::APPLICATION) {
-      this->transmit_frame(QUICFrameFactory::create_application_close_frame(std::move(error)));
-    } else {
-      this->transmit_frame(QUICFrameFactory::create_connection_close_frame(std::move(error)));
-    }
+    this->_switch_to_closing_state(std::move(error));
   }
 }
 
@@ -403,11 +398,8 @@ QUICNetVConnection::state_handshake(int event, Event *data)
     break;
   }
   case EVENT_IMMEDIATE:
-    // Start Implicit Shutdown. Because of no network activity for the duration of the idle
timeout.
-    this->remove_from_active_queue();
-    this->close(std::make_unique<QUICConnectionError>());
-
-    // TODO: signal VC_EVENT_ACTIVE_TIMEOUT/VC_EVENT_INACTIVITY_TIMEOUT to application
+    // Start Immediate Close because of Idle Timeout
+    this->_handle_idle_timeout();
     break;
   default:
     DebugQUICCon("Unexpected event: %s", QUICDebugNames::quic_event(event));
@@ -436,11 +428,8 @@ QUICNetVConnection::state_connection_established(int event, Event *data)
     break;
   }
   case EVENT_IMMEDIATE: {
-    // Start Implicit Shutdown. Because of no network activity for the duration of the idle
timeout.
-    this->remove_from_active_queue();
-    this->close(std::make_unique<QUICConnectionError>());
-
-    // TODO: signal VC_EVENT_ACTIVE_TIMEOUT/VC_EVENT_INACTIVITY_TIMEOUT to application
+    // Start Immediate Close because of Idle Timeout
+    this->_handle_idle_timeout();
     break;
   }
   default:
@@ -479,7 +468,7 @@ QUICNetVConnection::state_connection_closing(int event, Event *data)
     DebugQUICCon("Unexpected event: %s", QUICDebugNames::quic_event(event));
   }
 
-  // FIXME Enter closed state if CONNECTION_CLOSE was ACKed
+  // FIXME Enter closed state if CONNECTION_CLOSE was ACKed and draining period end
   if (true) {
     this->_switch_to_close_state();
   }
@@ -1020,11 +1009,16 @@ QUICNetVConnection::_switch_to_established_state()
 }
 
 void
-QUICNetVConnection::_switch_to_closing_state()
+QUICNetVConnection::_switch_to_closing_state(QUICConnectionErrorUPtr error)
 {
   if (this->_complete_handshake_if_possible() != 0) {
     DebugQUICCon("Switching state without handshake completion");
   }
+  if (error->cls == QUICErrorClass::APPLICATION) {
+    this->transmit_frame(QUICFrameFactory::create_application_close_frame(std::move(error)));
+  } else {
+    this->transmit_frame(QUICFrameFactory::create_connection_close_frame(std::move(error)));
+  }
   DebugQUICCon("Enter state_connection_closing");
   SET_HANDLER((NetVConnHandler)&QUICNetVConnection::state_connection_closing);
 }
@@ -1039,3 +1033,12 @@ QUICNetVConnection::_switch_to_close_state()
   SET_HANDLER((NetVConnHandler)&QUICNetVConnection::state_connection_closed);
   this_ethread()->schedule_imm(this, QUIC_EVENT_SHUTDOWN, nullptr);
 }
+
+void
+QUICNetVConnection::_handle_idle_timeout()
+{
+  this->remove_from_active_queue();
+  this->close(std::make_unique<QUICConnectionError>(QUICTransErrorCode::NO_ERROR,
"Idle Timeout"));
+
+  // TODO: signal VC_EVENT_ACTIVE_TIMEOUT/VC_EVENT_INACTIVITY_TIMEOUT to application
+}

-- 
To stop receiving notification emails like this one, please contact
['"commits@trafficserver.apache.org" <commits@trafficserver.apache.org>'].

Mime
View raw message