summaryrefslogtreecommitdiffhomepage
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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);
}
}