diff options
| author | Roman Arutyunyan <arut@nginx.com> | 2021-08-05 09:20:32 +0300 |
|---|---|---|
| committer | Roman Arutyunyan <arut@nginx.com> | 2021-08-05 09:20:32 +0300 |
| commit | dab9163a95cb9c1c00ee9a3644c58474528b0f2b (patch) | |
| tree | 095ec68bffcf70e1f4d32f4d1508c1ca7442b60d | |
| parent | 0b179efeb0bc18e92a31748685cc74240ddb5667 (diff) | |
| download | nginx-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.c | 4 | ||||
| -rw-r--r-- | src/event/quic/ngx_event_quic_streams.c | 2 |
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); } } |
