]> git.kaiwu.me - nginx.git/commitdiff
QUIC: asynchronous shutdown.
authorRoman Arutyunyan <arut@nginx.com>
Thu, 5 Aug 2021 06:20:32 +0000 (09:20 +0300)
committerRoman Arutyunyan <arut@nginx.com>
Thu, 5 Aug 2021 06:20:32 +0000 (09:20 +0300)
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.

src/event/quic/ngx_event_quic.c
src/event/quic/ngx_event_quic_streams.c

index e79a24e8a97a68d77217ff71c50eb062357ec881..076e194222f60cd33df8a803c29ce35dba6b21f1 100644 (file)
@@ -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;
     }
 
index c4fd4eb3eacc7234394e4a60a911490b56fc62e6..bff41b20c828d8e232af9f4d403ccf3792461fe1 100644 (file)
@@ -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);
     }
 }