> -----Original Message-----
> From: Bert Huijben [mailto:b...@qqmail.nl]
> Sent: zaterdag 28 november 2015 14:09
> To: stefan.eiss...@greenbytes.de; dev@httpd.apache.org
> Subject: RE: No H2 Window updates!
> 
> 
> 
> > -----Original Message-----
> > From: Stefan Eissing [mailto:stefan.eiss...@greenbytes.de]
> > Sent: zaterdag 28 november 2015 13:01
> > To: dev@httpd.apache.org
> > Subject: Re: No H2 Window updates!
> >
> > I am not really here, but...
> >
> > the window updates are sent out via update_window(), line 1001,
> > h2_session.c. If you do not see any window updates with a client, it may
> > be that the server app you called does not read its input. I have
> > several test cases with uploads and they work with nghttp and curl.
> 
> In my case it doesn't...
> 
> -----------------------
> if (h2_stream_set_has_open_input(session->streams)) {
>                 /* Check that any pending window updates are sent. */
>                 status = h2_mplx_in_update_windows(session->mplx,
> update_window, session);
>                 if (APR_STATUS_IS_EAGAIN(status)) {
>                     status = APR_SUCCESS;
>                 }
>                 else if (status == APR_SUCCESS) {
>                     /* need to flush window updates onto the connection
asap
> */
>                     h2_conn_io_flush(&session->io);
>                 }
>             }
> ------------------------
> 
> 
> Looks like that ' h2_stream_set_has_open_input()' always returns false for
> me, with those tiny requests of only 1 data frame.
> 
> The streams are marked as closed the moment a data frame with EOS is
> received... that is: before the frame is processed.
> 
> In this testcase all data frames have EOS set, so this value would only be
> true for me if some other outstanding request did not receive its data
yet.
> (Which doesn't happen yet as Subversion still assumes http/1 like
> processing)

If I just replace the

if (h2_stream_set_has_open_input(session->streams))

with if(TRUE) {

then I do receive a few window updates... Of a few bytes each though...
I would have expected a few huge returns (Kbyte+) every few requests that
send data.

So over the course of hundreds of requests my connection level window
shrinks to almost zero... at some points I receive a few updates of a few
hundred bytes... I even see one of a single byte.



Data on closed streams must be accounted towards the connection window, so
conditionalizing the whole processing on 'are there any readable streams' is
a clear bug. Skipping all data in the last frame is another one.
Perhaps the code can skip some of the processing in this case, but (as a
client) I would like to see my outgoing window at the connection updated
sooner.


In case of Subversion's real usage, I want to commit potentially hundreds of
MByte, so a connection level window of more than a few bytes would be very
welcome.... With HTTP/1 we send out the data as fast as we can and the TCP
windowing handles this from the httpd side... Now the http/2 level windowing
should handle this.


Mod_dav and mod_dav_svn are usually fast readers; just limited by trivial
disk io or xml processing in the common operations, so I don't expect real
problems there.


        Bert


Reply via email to