[PATCH 3 of 6] QUIC: call shutdown() callback only after handshake completion

Sergey Kandaurov pluknet at nginx.com
Tue Sep 19 09:59:27 UTC 2023


> On 14 Sep 2023, at 14:17, Roman Arutyunyan <arut at nginx.com> wrote:
> 
> # HG changeset patch
> # User Roman Arutyunyan <arut at nginx.com>
> # Date 1694613709 -14400
> #      Wed Sep 13 18:01:49 2023 +0400
> # Node ID 51166a8f35ba880415ddc2bf2745012a8d4cea34
> # Parent  6d3ca6f8db357a1db267978f730875e51e87c608
> QUIC: call shutdown() callback only after handshake completion.
> 
> Previously the callback could be called while QUIC handshake was in progress
> and, what's more important, before the init() callback.  Now it's postponed
> after init().
> 
> This change is a preparation to postponing HTTP/3 session creation to init().
> 
> diff --git a/src/event/quic/ngx_event_quic.c b/src/event/quic/ngx_event_quic.c
> --- a/src/event/quic/ngx_event_quic.c
> +++ b/src/event/quic/ngx_event_quic.c
> @@ -427,7 +427,7 @@ ngx_quic_input_handler(ngx_event_t *rev)
>             return;
>         }
> 
> -        if (!qc->closing && qc->conf->shutdown) {
> +        if (!qc->closing && qc->streams.initialized && qc->conf->shutdown) {
>             qc->conf->shutdown(c);

Adding condition here will now prevent doing anything on graceful shutdown,
input handler will just return, connection will stuck for handshake_timeout.
I'd rather move it above, to handle similar to closing reusable connections:

        if (!ngx_exiting || !qc->streams.initialized) {


>         }
> 
> diff --git a/src/event/quic/ngx_event_quic_streams.c b/src/event/quic/ngx_event_quic_streams.c
> --- a/src/event/quic/ngx_event_quic_streams.c
> +++ b/src/event/quic/ngx_event_quic_streams.c
> @@ -620,6 +620,10 @@ ngx_quic_do_init_streams(ngx_connection_
>         }
>     }
> 
> +    if (ngx_exiting && qc->conf->shutdown) {
> +        qc->conf->shutdown(c);

how this can be reached?

> +    }
> +
>     for (q = ngx_queue_head(&qc->streams.uninitialized);
>          q != ngx_queue_sentinel(&qc->streams.uninitialized);
>          q = ngx_queue_next(q))

-- 
Sergey Kandaurov


More information about the nginx-devel mailing list