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.
This commit is contained in:
Roman Arutyunyan 2021-08-05 09:20:32 +03:00
parent 4d7ce86ff5
commit 923de21472
2 changed files with 5 additions and 1 deletions

View file

@ -421,7 +421,11 @@ ngx_quic_input_handler(ngx_event_t *rev)
if (!rev->ready) { if (!rev->ready) {
if (qc->closing) { if (qc->closing) {
ngx_quic_close_connection(c, NGX_OK); ngx_quic_close_connection(c, NGX_OK);
} else if (qc->shutdown) {
ngx_quic_shutdown_quic(c);
} }
return; return;
} }

View file

@ -849,7 +849,7 @@ done:
(void) ngx_quic_output(pc); (void) ngx_quic_output(pc);
if (qc->shutdown) { if (qc->shutdown) {
ngx_quic_shutdown_quic(pc); ngx_post_event(pc->read, &ngx_posted_events);
} }
} }