Things have been quite busy here, because of the release. Hence I think it's 
worth asking again :-).

Regards

RĂ¼diger

On 9/14/21 1:43 PM, Ruediger Pluem wrote:
> When looking at this again while researching something I couldn't answer 
> myself the questions below
> and as event mpm and mod_http2 are sometimes pretty complex I thought I ask 
> :-)
> 
> On 7/3/19 3:46 PM, ic...@apache.org wrote:
>> Author: icing
>> Date: Wed Jul  3 13:46:31 2019
>> New Revision: 1862475
>>
>> URL: http://svn.apache.org/viewvc?rev=1862475&view=rev
>> Log:
>>   *) mod_http2/mpm_event: Fixes the behaviour when a HTTP/2 connection has 
>> nothing
>>      more to write with streams ongoing (flow control block). The timeout 
>> waiting
>>      for the client to send WINODW_UPDATE was incorrectly KeepAliveTimeout 
>> and not
>>      Timeout as it should be. Fixes PR 63534. [Yann Ylavic, Stefan Eissing]
>>
>>
>> Modified:
>>     httpd/httpd/trunk/CHANGES
>>     httpd/httpd/trunk/modules/http2/h2_conn.c
>>     httpd/httpd/trunk/modules/http2/h2_version.h
>>     httpd/httpd/trunk/server/mpm/event/event.c
>>
> 
>> Modified: httpd/httpd/trunk/modules/http2/h2_conn.c
>> URL: 
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/http2/h2_conn.c?rev=1862475&r1=1862474&r2=1862475&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/modules/http2/h2_conn.c (original)
>> +++ httpd/httpd/trunk/modules/http2/h2_conn.c Wed Jul  3 13:46:31 2019
>> @@ -231,6 +231,13 @@ apr_status_t h2_conn_run(conn_rec *c)
>>              case H2_SESSION_ST_BUSY:
>>              case H2_SESSION_ST_WAIT:
>>                  c->cs->state = CONN_STATE_WRITE_COMPLETION;
>> +                if (c->cs && (session->open_streams || 
>> !session->remote.emitted_count)) {
>> +                    /* let the MPM know that we are not done and want
>> +                     * the Timeout behaviour instead of a KeepAliveTimeout
>> +                     * See PR 63534. 
>> +                     */
>> +                    c->cs->sense = CONN_SENSE_WANT_READ;
> 
> Can we get here with session->open_streams > 0 and all the open streams are 
> only producing output and none of them is waiting for
> something from the client?
> 
> 
>> +                }
>>                  break;
>>              case H2_SESSION_ST_CLEANUP:
>>              case H2_SESSION_ST_DONE:
>>
> 
>> Modified: httpd/httpd/trunk/server/mpm/event/event.c
>> URL: 
>> http://svn.apache.org/viewvc/httpd/httpd/trunk/server/mpm/event/event.c?rev=1862475&r1=1862474&r2=1862475&view=diff
>> ==============================================================================
>> --- httpd/httpd/trunk/server/mpm/event/event.c (original)
>> +++ httpd/httpd/trunk/server/mpm/event/event.c Wed Jul  3 13:46:31 2019
>> @@ -1153,10 +1153,11 @@ read_request:
>>          else if (ap_filter_should_yield(c->output_filters)) {
>>              pending = OK;
>>          }
>> -        if (pending == OK) {
>> +        if (pending == OK || (pending == DECLINED &&
>> +                              cs->pub.sense == CONN_SENSE_WANT_READ)) {
>>              /* Still in WRITE_COMPLETION_STATE:
>> -             * Set a write timeout for this connection, and let the
>> -             * event thread poll for writeability.
>> +             * Set a read/write timeout for this connection, and let the
>> +             * event thread poll for read/writeability.
>>               */
>>              cs->queue_timestamp = apr_time_now();
>>              notify_suspend(cs);
> 
> Hm. Showing following code lines from trunk for my next question:
> 
> 
>             update_reqevents_from_sense(cs, -1);
> 
> if cs->pub.sense == CONN_SENSE_WANT_READ we subscribe on to POLLIN only on 
> the pfd
> 
> 
>             apr_thread_mutex_lock(timeout_mutex);
>             TO_QUEUE_APPEND(cs->sc->wc_q, cs);
>             rv = apr_pollset_add(event_pollset, &cs->pfd);
> 
> If the read event triggers we will get back to the
> 
>     if (cs->pub.state == CONN_STATE_WRITE_COMPLETION) {
>         int pending = DECLINED;
> 
> above. This means we try flush the output queue if it is not empty and if it 
> is empty after this we would fall through to
> set cs->pub.state = CONN_STATE_CHECK_REQUEST_LINE_READABLE; and then add the 
> pfd to the pollset again and poll again. This should
> trigger the read event again and we would process the input. But if I see 
> this correctly we would need to poll twice for getting
> the read data processed.
> OTOH if we do not manage to clear the output queue above we would add the pfd 
> to the pollset again but this time for writing and
> only once all output has been processed we would take care of the reading.
> Maybe we should take care of both?
> 
> 
> Regards
> 
> RĂ¼diger
> 
> 

Reply via email to