changeset 8828:a9f6540e61da quic

QUIC: asynchronous shutdown. Previously, when cleaning up a QUIC stream in shutdown mode, ngx_quic_shutdown_quic() was called, which could close the QUIC connection right away. This could be a problem if the connection was referenced up the stack. For example, this could happen in ngx_quic_init_streams(), ngx_quic_close_streams(), ngx_quic_create_client_stream() etc. With a typical HTTP/3 client the issue is unlikely because of HTTP/3 uni streams which need a posted event to close. In this case QUIC connection cannot be closed right away. Now QUIC connection read event is posted and it will shut down the connection asynchronously.
author Roman Arutyunyan <arut@nginx.com>
date Thu, 05 Aug 2021 09:20:32 +0300
parents fe919fd63b0b
children 4f922f611135
files src/event/quic/ngx_event_quic.c src/event/quic/ngx_event_quic_streams.c
diffstat 2 files changed, 5 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/src/event/quic/ngx_event_quic.c
+++ b/src/event/quic/ngx_event_quic.c
@@ -421,7 +421,11 @@ ngx_quic_input_handler(ngx_event_t *rev)
     if (!rev->ready) {
         if (qc->closing) {
             ngx_quic_close_connection(c, NGX_OK);
+
+        } else if (qc->shutdown) {
+            ngx_quic_shutdown_quic(c);
         }
+
         return;
     }
 
--- a/src/event/quic/ngx_event_quic_streams.c
+++ b/src/event/quic/ngx_event_quic_streams.c
@@ -849,7 +849,7 @@ done:
     (void) ngx_quic_output(pc);
 
     if (qc->shutdown) {
-        ngx_quic_shutdown_quic(pc);
+        ngx_post_event(pc->read, &ngx_posted_events);
     }
 }