This is an automated email from the ASF dual-hosted git repository. cmcfarlen pushed a commit to branch 10.0.x in repository https://gitbox.apache.org/repos/asf/trafficserver.git
commit fbd21285153c7a2814724bf2cb1cd8a0cde45cc3 Author: Masakazu Kitajo <[email protected]> AuthorDate: Fri Feb 16 17:04:13 2024 -0700 http3: Propagate events from QUICNetVC (#11071) * http3: Propagate events from QUICNetVC * Propagate events to HttpSM (cherry picked from commit 9d26d12adf16a67d176aeb28c0e626bc10c68e6a) --- include/proxy/http3/Http3Session.h | 4 ++-- include/proxy/http3/Http3Transaction.h | 1 + src/iocore/net/P_QUICNetVConnection.h | 2 ++ src/iocore/net/QUICNetVConnection.cc | 26 ++++++++++++++++++---- src/proxy/http3/Http3Session.cc | 40 +++++++++++++++++++--------------- src/proxy/http3/Http3Transaction.cc | 14 ++++++++++++ 6 files changed, 64 insertions(+), 23 deletions(-) diff --git a/include/proxy/http3/Http3Session.h b/include/proxy/http3/Http3Session.h index cfcb7e7f76..cc0d7c488b 100644 --- a/include/proxy/http3/Http3Session.h +++ b/include/proxy/http3/Http3Session.h @@ -37,8 +37,6 @@ public: virtual ~HQSession(); // Implement VConnection interface - VIO *do_io_read(Continuation *c, int64_t nbytes = INT64_MAX, MIOBuffer *buf = nullptr) override; - VIO *do_io_write(Continuation *c = nullptr, int64_t nbytes = INT64_MAX, IOBufferReader *buf = 0, bool owner = false) override; void do_io_close(int lerrno = -1) override; void do_io_shutdown(ShutdownHowTo_t howto) override; void reenable(VIO *vio) override; @@ -63,6 +61,8 @@ private: Queue<HQTransaction> _transaction_list; char _protocol_string[16]; + + int main_event_handler(int, void *); }; class Http3Session : public HQSession diff --git a/include/proxy/http3/Http3Transaction.h b/include/proxy/http3/Http3Transaction.h index 833fc39ae8..3db3ac1d6d 100644 --- a/include/proxy/http3/Http3Transaction.h +++ b/include/proxy/http3/Http3Transaction.h @@ -84,6 +84,7 @@ protected: void _schedule_write_complete_event(); void _unschedule_write_complete_event(); void _close_write_complete_event(Event *e); + void _signal_event(int event); void _signal_read_event(); void _signal_write_event(); void _delete_if_possible(); diff --git a/src/iocore/net/P_QUICNetVConnection.h b/src/iocore/net/P_QUICNetVConnection.h index bef664de34..06a366b968 100644 --- a/src/iocore/net/P_QUICNetVConnection.h +++ b/src/iocore/net/P_QUICNetVConnection.h @@ -204,6 +204,8 @@ private: void _handle_write_ready(); void _handle_interval(); + void _propagate_event(int event); + void _switch_to_established_state(); bool _handshake_completed = false; diff --git a/src/iocore/net/QUICNetVConnection.cc b/src/iocore/net/QUICNetVConnection.cc index 8642b62637..bfd0421357 100644 --- a/src/iocore/net/QUICNetVConnection.cc +++ b/src/iocore/net/QUICNetVConnection.cc @@ -171,6 +171,7 @@ QUICNetVConnection::state_handshake(int event, Event *data) case VC_EVENT_ACTIVE_TIMEOUT: case VC_EVENT_INACTIVITY_TIMEOUT: _unschedule_packet_write_ready(); + this->_propagate_event(event); this->closed = 1; break; default: @@ -207,6 +208,7 @@ QUICNetVConnection::state_established(int event, Event *data) case VC_EVENT_ACTIVE_TIMEOUT: case VC_EVENT_INACTIVITY_TIMEOUT: _unschedule_packet_write_ready(); + this->_propagate_event(event); this->closed = 1; break; default: @@ -254,6 +256,20 @@ QUICNetVConnection::_start_application() } } +void +QUICNetVConnection::_propagate_event(int event) +{ + QUICConVDebug("Propagating: %d", event); + if (this->read.vio.cont && this->read.vio.mutex == this->read.vio.cont->mutex) { + this->read.vio.cont->handleEvent(event, &this->read.vio); + } else if (this->write.vio.cont && this->write.vio.mutex == this->write.vio.cont->mutex) { + this->write.vio.cont->handleEvent(event, &this->write.vio); + } else { + // Proxy Session does not exist + QUICConVDebug("Session does not exist"); + } +} + bool QUICNetVConnection::shouldDestroy() { @@ -263,15 +279,17 @@ QUICNetVConnection::shouldDestroy() VIO * QUICNetVConnection::do_io_read(Continuation *c, int64_t nbytes, MIOBuffer *buf) { - ink_assert(false); - return nullptr; + auto vio = super::do_io_read(c, nbytes, buf); + this->read.enabled = 1; + return vio; } VIO * QUICNetVConnection::do_io_write(Continuation *c, int64_t nbytes, IOBufferReader *buf, bool owner) { - ink_assert(false); - return nullptr; + auto vio = super::do_io_write(c, nbytes, buf); + this->write.enabled = 1; + return vio; } int diff --git a/src/proxy/http3/Http3Session.cc b/src/proxy/http3/Http3Session.cc index eb31215572..14ce9c18c4 100644 --- a/src/proxy/http3/Http3Session.cc +++ b/src/proxy/http3/Http3Session.cc @@ -90,20 +90,6 @@ HQSession::get_transaction(QUICStreamId id) return nullptr; } -VIO * -HQSession::do_io_read(Continuation *c, int64_t nbytes, MIOBuffer *buf) -{ - ink_assert(false); - return nullptr; -} - -VIO * -HQSession::do_io_write(Continuation *c, int64_t nbytes, IOBufferReader *buf, bool owner) -{ - ink_assert(false); - return nullptr; -} - void HQSession::do_io_close(int lerrno) { @@ -131,14 +117,15 @@ HQSession::new_connection(NetVConnection *new_vc, MIOBuffer *iobuf, IOBufferRead this->con_id = new_vc->get_service<QUICSupport>()->get_quic_connection()->connection_id(); this->_handle_if_ssl(new_vc); - return; + do_api_callout(TS_HTTP_SSN_START_HOOK); } void HQSession::start() { - ink_assert(false); - return; + SET_HANDLER(&HQSession::main_event_handler); + this->do_io_read(this, 0, nullptr); + this->do_io_write(this, 0, nullptr); } void @@ -166,6 +153,25 @@ HQSession::get_transact_count() const return 0; } +int +HQSession::main_event_handler(int event, void *edata) +{ + switch (event) { + case VC_EVENT_ACTIVE_TIMEOUT: + case VC_EVENT_INACTIVITY_TIMEOUT: + case VC_EVENT_ERROR: + case VC_EVENT_EOS: + this->do_io_close(); + for (HQTransaction *t = this->_transaction_list.head; t; t = static_cast<HQTransaction *>(t->link.next)) { + SCOPED_MUTEX_LOCK(lock, t->mutex, this_ethread()); + t->handleEvent(event); + } + break; + } + + return 0; +} + // // Http3Session // diff --git a/src/proxy/http3/Http3Transaction.cc b/src/proxy/http3/Http3Transaction.cc index 1b2388fcc4..11ce096ebd 100644 --- a/src/proxy/http3/Http3Transaction.cc +++ b/src/proxy/http3/Http3Transaction.cc @@ -345,6 +345,19 @@ HQTransaction::_close_write_complete_event(Event *e) } } +void +HQTransaction::_signal_event(int event) +{ + if (this->_write_vio.cont) { + SCOPED_MUTEX_LOCK(lock, this->_write_vio.mutex, this_ethread()); + this->_write_vio.cont->handleEvent(event); + } + if (this->_read_vio.cont && this->_read_vio.cont != this->_write_vio.cont) { + SCOPED_MUTEX_LOCK(lock, this->_read_vio.mutex, this_ethread()); + this->_read_vio.cont->handleEvent(event); + } +} + /** * @brief Signal event to this->_read_vio.cont */ @@ -490,6 +503,7 @@ Http3Transaction::state_stream_open(int event, Event *edata) case VC_EVENT_INACTIVITY_TIMEOUT: case VC_EVENT_ACTIVE_TIMEOUT: { Http3TransVDebug("%s (%d)", get_vc_event_name(event), event); + this->_signal_event(event); break; } default:
