summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRoman Arutyunyan <arut@nginx.com>2021-08-05 09:20:32 +0300
committerRoman Arutyunyan <arut@nginx.com>2021-08-05 09:20:32 +0300
commitdab9163a95cb9c1c00ee9a3644c58474528b0f2b (patch)
tree095ec68bffcf70e1f4d32f4d1508c1ca7442b60d
parent0b179efeb0bc18e92a31748685cc74240ddb5667 (diff)
downloadnginx-dab9163a95cb9c1c00ee9a3644c58474528b0f2b.tar.gz
nginx-dab9163a95cb9c1c00ee9a3644c58474528b0f2b.tar.bz2
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.
-rw-r--r--src/event/quic/ngx_event_quic.c4
-rw-r--r--src/event/quic/ngx_event_quic_streams.c2
2 files changed, 5 insertions, 1 deletions
diff --git a/src/event/quic/ngx_event_quic.c b/src/event/quic/ngx_event_quic.c
index e79a24e8a..076e19422 100644
--- 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;
}
diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c
index c4fd4eb3e..bff41b20c 100644
--- 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);
}
}