Welcome! Log In Create A New Profile

Advanced

Re: [PATCH 1 of 3] QUIC: post stream events instead of calling their handlers

Sergey Kandaurov
December 06, 2021 07:38AM
> On 25 Nov 2021, at 17:20, Roman Arutyunyan <arut@nginx.com> wrote:
>
> # HG changeset patch
> # User Roman Arutyunyan <arut@nginx.com>
> # Date 1637692791 -10800
> # Tue Nov 23 21:39:51 2021 +0300
> # Branch quic
> # Node ID 5b03ffd757804542daec73188a509b02e6b2c596
> # Parent d041b8d6ab0b2dea150536531345fa47c696b303
> QUIC: post stream events instead of calling their handlers.
>
> This potentially reduces the number of handler calls.
>
> 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
> @@ -1122,7 +1122,7 @@ ngx_quic_handle_stream_frame(ngx_connect
> rev->ready = 1;
>
> if (rev->active) {
> - rev->handler(rev);
> + ngx_post_event(rev, &ngx_posted_events);
> }
> }
>
> @@ -1369,7 +1369,7 @@ ngx_quic_handle_reset_stream_frame(ngx_c
> }
>
> if (rev->active) {
> - rev->handler(rev);
> + ngx_post_event(rev, &ngx_posted_events);
> }
>
> return NGX_OK;
> @@ -1438,7 +1438,7 @@ ngx_quic_handle_stop_sending_frame(ngx_c
> wev = qs->connection->write;
>
> if (wev->active) {
> - wev->handler(wev);
> + ngx_post_event(wev, &ngx_posted_events);
> }
>
> return NGX_OK;

I don't like this change.

While in practice this indeed tends to reduce the number of handler
invocations in certain edge cases, it also entails negative effects.
First, postponing processing the next part of a stream means that
if the stream spans multiple packets, its handling will be deferred
inadvertently until after the next packet is finished processing.
Next, if a stream is the encoder stream, used to send new dynamic
entries, then new request streams will be inevitably blocked.
I've run intentionally on this to see what happens:
looks like the blocked stream isn't woken up until connection close
(which consumes active streams in ngx_quic_close_streams()).

0x6 is the encoder stream, 0x40 is the request stream.

2021/12/06 14:45:36 [debug] 17379#0: *1 quic frame rx app STREAM id:0x6 off:1 len:428
2021/12/06 14:45:36 [debug] 17379#0: *4 post event 000062F000000740
2021/12/06 14:45:36 [debug] 17379#0: *1 quic frame rx app STREAM id:0x40 len:38 fin:1
....
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 check insert count req:23, have:0
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 block stream
....
2021/12/06 14:45:36 [debug] 17379#0: posted event 000062F000000740
2021/12/06 14:45:36 [debug] 17379#0: *4 delete posted event 000062F000000740
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 read handler
2021/12/06 14:45:36 [debug] 17379#0: *4 quic stream id:0x6 recv eof:0 buf:128
2021/12/06 14:45:36 [debug] 17379#0: *4 quic stream id:0x6 recv len:128
2021/12/06 14:45:36 [debug] 17379#0: *4 quic flow update 129
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse encoder instruction
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse prefix int 16384
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 set capacity 16384
2021/12/06 14:45:36 [debug] 17379#0: *1 malloc: 000062100005DD00:4096
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse encoder instruction
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse field inr
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse prefix int 0
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse prefix int 6
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse literal huff:1, len:6
2021/12/06 14:45:36 [debug] 17379#0: *4 malloc: 00006020000A5630:10
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse literal done "localhost"
2021/12/06 14:45:36 [debug] 17379#0: *4 http3 parse field inr done static[0] "localhost"
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 ref insert static[0] "localhost"
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 static[0] lookup ":authority":""
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 insert [0] ":authority":"localhost", size:51
2021/12/06 14:45:36 [debug] 17379#0: *1 malloc: 0000606000008D80:51
2021/12/06 14:45:36 [debug] 17379#0: *1 post event 0000614000005A78
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 new dynamic entry, blocked:1
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 unblock stream
2021/12/06 14:45:36 [debug] 17379#0: *1 post event 000062F000000608
....
2021/12/06 14:45:36 [debug] 17379#0: posted event 0000614000005A78
2021/12/06 14:45:36 [debug] 17379#0: *1 delete posted event 0000614000005A78
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 inc insert count handler
2021/12/06 14:45:36 [debug] 17379#0: *1 http3 send insert count increment 23
....
2021/12/06 14:45:36 [debug] 17379#0: posted event 000062F000000608
2021/12/06 14:45:36 [debug] 17379#0: *1 delete posted event 000062F000000608
2021/12/06 14:45:36 [debug] 17379#0: *1 quic input handler
[nothing]
2021/12/06 14:45:36 [debug] 17379#0: posted event 000061D00003C648
....
....
2021/12/06 14:45:37 [debug] 17379#0: *1 quic frame rx app CONNECTION_CLOSE err:0 ft:0
2021/12/06 14:45:37 [debug] 17379#0: *1 quic immediate close drain:1
2021/12/06 14:45:37 [debug] 17379#0: *22 post event 000062F000000A18
....
2021/12/06 14:45:37 [debug] 17379#0: posted event 000062F000000A18
2021/12/06 14:45:37 [debug] 17379#0: *22 delete posted event 000062F000000A18
2021/12/06 14:45:37 [debug] 17379#0: *22 http3 process request
2021/12/06 14:45:37 [debug] 17379#0: *1 http3 check insert count req:23, have:23
....
2021/12/06 14:45:37 [debug] 17379#0: *22 http3 parse field representation done
2021/12/06 14:45:37 [debug] 17379#0: *22 http3 parse headers done
2021/12/06 14:45:37 [debug] 17379#0: *1 http3 send section acknowledgement 64
2021/12/06 14:45:37 [debug] 17379#0: *1 quic creating server uni stream streams:2 max:100 id:0xb
2021/12/06 14:45:37 [debug] 17379#0: *1 quic stream id:0xb create
....
2021/12/06 14:45:37 [debug] 17379#0: *22 http3 header: "user-agent: something something"
2021/12/06 14:45:37 [debug] 17379#0: *22 http request count:1 blk:0
2021/12/06 14:45:37 [debug] 17379#0: *22 http close request
2021/12/06 14:45:37 [debug] 17379#0: *22 http log handler
2021/12/06 14:45:37 [debug] 17379#0: *22 malloc: 000060D000007AF0:130
2021/12/06 14:45:37 [debug] 17379#0: *22 malloc: 000060F000019EA0:169
2021/12/06 14:45:37 [debug] 17379#0: *22 run cleanup: 000060300007D500
2021/12/06 14:45:37 [debug] 17379#0: *1 event timer add: 8: 75000:2579974395
2021/12/06 14:45:37 [debug] 17379#0: *22 close http connection: 8
2021/12/06 14:45:37 [debug] 17379#0: *1 http3 send stream cancellation 64

--
Sergey Kandaurov

_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
http://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[PATCH 0 of 3] Misc QUIC stream patches

Roman Arutyunyan 379 November 25, 2021 09:22AM

[PATCH 1 of 3] QUIC: post stream events instead of calling their handlers

Roman Arutyunyan 92 November 25, 2021 09:22AM

Re: [PATCH 1 of 3] QUIC: post stream events instead of calling their handlers

Sergey Kandaurov 153 December 06, 2021 07:38AM

Re: [PATCH 1 of 3] QUIC: post stream events instead of calling their handlers

Roman Arutyunyan 99 December 13, 2021 07:20AM

[PATCH 2 of 3] QUIC: simplified stream initialization

Roman Arutyunyan 225 November 25, 2021 09:22AM

Re: [PATCH 2 of 3] QUIC: simplified stream initialization

Sergey Kandaurov 97 December 10, 2021 09:02AM

[PATCH 3 of 3] QUIC: stream recv shutdown support

Roman Arutyunyan 144 November 25, 2021 09:22AM

Re: [PATCH 3 of 3] QUIC: stream recv shutdown support

Roman Arutyunyan 333 November 26, 2021 08:12AM

Re: [PATCH 3 of 3] QUIC: stream recv shutdown support

Vladimir Homutov 122 December 10, 2021 02:40AM

Re: [PATCH 3 of 3] QUIC: stream recv shutdown support

Roman Arutyunyan 77 December 13, 2021 07:04AM

Re: [PATCH 3 of 3] QUIC: stream recv shutdown support

Vladimir Homutov 92 December 13, 2021 08:26AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 285
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready