[PATCH 3 of 6] QUIC: call shutdown() callback only after handshake completion
Sergey Kandaurov
pluknet at nginx.com
Tue Sep 19 10:33:04 UTC 2023
> On 19 Sep 2023, at 13:59, Sergey Kandaurov <pluknet at nginx.com> wrote:
>
>>
>> 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?
More specifically, the check in ngx_quic_input_handler()
seems to take care for all possible cases, it won't reach there.
>
>> + }
>> +
>> for (q = ngx_queue_head(&qc->streams.uninitialized);
>> q != ngx_queue_sentinel(&qc->streams.uninitialized);
>> q = ngx_queue_next(q))
>
Other patches look good.
--
Sergey Kandaurov
More information about the nginx-devel
mailing list