On Mon, May 27, 2024 at 1:04 PM <[email protected]> wrote:
>
> Author: icing
> Date: Mon May 27 11:04:52 2024
> New Revision: 1918003
>
> URL: http://svn.apache.org/viewvc?rev=1918003&view=rev
> Log:
> *) mod_http2: sync with module's github.
> - on newer HTTPD versions, return connection monitoring
> to the event MPM when block on client updates.
> 2.4.x versions still treat connections in the event
> MPM as KeepAlive and purge them on load in the middle
> of response processing.
> - spelling fixes
> - support for yield calls in c2 "network" filter
[]
>
> --- httpd/httpd/trunk/modules/http2/h2_c1.c (original)
> +++ httpd/httpd/trunk/modules/http2/h2_c1.c Mon May 27 11:04:52 2024
> @@ -116,7 +116,7 @@ cleanup:
> apr_status_t h2_c1_run(conn_rec *c)
> {
> apr_status_t status;
> - int mpm_state = 0;
> + int mpm_state = 0, keepalive = 0;
> h2_conn_ctx_t *conn_ctx = h2_conn_ctx_get(c);
>
> ap_assert(conn_ctx);
> @@ -127,7 +127,7 @@ apr_status_t h2_c1_run(conn_rec *c)
> c->cs->state = CONN_STATE_HANDLER;
> }
>
> - status = h2_session_process(conn_ctx->session, async_mpm);
> + status = h2_session_process(conn_ctx->session, async_mpm,
> &keepalive);
>
> if (APR_STATUS_IS_EOF(status)) {
> ap_log_cerror(APLOG_MARK, APLOG_DEBUG, status, c,
> @@ -153,7 +153,7 @@ apr_status_t h2_c1_run(conn_rec *c)
> case H2_SESSION_ST_BUSY:
> case H2_SESSION_ST_WAIT:
> c->cs->state = CONN_STATE_WRITE_COMPLETION;
> - if (c->cs && !conn_ctx->session->remote.emitted_count) {
> + if (!keepalive) {
> /* let the MPM know that we are not done and want
> * the Timeout behaviour instead of a KeepAliveTimeout
> * See PR 63534.
Per our discussion the other day, if you want to avoid c1 connections
to be killed by mpm_event on high load in this case, I think you can
do this here:
Index: modules/http2/h2_c1.c
===================================================================
--- modules/http2/h2_c1.c (revision 1918003)
+++ modules/http2/h2_c1.c (working copy)
@@ -147,6 +147,7 @@ apr_status_t h2_c1_run(conn_rec *c)
&& mpm_state != AP_MPMQ_STOPPING);
if (c->cs) {
+ c->clogging_input_filters = 0;
switch (conn_ctx->session->state) {
case H2_SESSION_ST_INIT:
case H2_SESSION_ST_IDLE:
@@ -159,6 +160,7 @@ apr_status_t h2_c1_run(conn_rec *c)
* See PR 63534.
*/
c->cs->sense = CONN_SENSE_WANT_READ;
+ c->clogging_input_filters = 1;
}
break;
case H2_SESSION_ST_CLEANUP:
--
c->clogging_input_filters = 1 will tell the MPM to always call
process_connection() hooks after the WRITE_COMPLETION state did the
poll(), rather than entering the (killable) keepalive state.
Looks like the correct workaround with current mpm_event..
Regards;
Yann.