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