On Thu, Sep 13, 2018 at 8:49 AM Plüm, Rüdiger, Vodafone Group <ruediger.pl...@vodafone.com> wrote: > > I don't like the "misuse" of c->aborted here. I for instance log in > the access log whether connections have been aborted or not and this > approach would mean that all proxied websocket connections would get > marked as aborted. Can't we use any other flag to tell the MPM to > close the socket and push the pool, e.g. a note in c->notes? > Why is the lingering close no longer needed?
Agreed, let lingering close do its job if the client connection is not closed already. Better in v2 (attached)? > Why now doing ap_mpm_resume_suspended after > ap_finalize_request_protocol(baton->r) and > ap_process_request_after_handler(baton->r)? I think we don't want EOS/EOR filtering race with the MPM on the connection... Regards, Yann.
Index: modules/proxy/mod_proxy_wstunnel.c =================================================================== --- modules/proxy/mod_proxy_wstunnel.c (revision 1840709) +++ modules/proxy/mod_proxy_wstunnel.c (working copy) @@ -155,15 +155,14 @@ static int proxy_wstunnel_pump(ws_baton_t *baton, static void proxy_wstunnel_finish(ws_baton_t *baton) { + conn_rec *c = baton->r->connection; ap_log_rerror(APLOG_MARK, APLOG_TRACE1, 0, baton->r, "proxy_wstunnel_finish"); baton->proxy_connrec->close = 1; /* new handshake expected on each back-conn */ - baton->r->connection->keepalive = AP_CONN_CLOSE; ap_proxy_release_connection(baton->scheme, baton->proxy_connrec, baton->r->server); - ap_finalize_request_protocol(baton->r); - ap_lingering_close(baton->r->connection); - apr_socket_close(baton->client_soc); - ap_mpm_resume_suspended(baton->r->connection); + ap_finalize_request_protocol(baton->r); /* send EOS */ ap_process_request_after_handler(baton->r); /* don't touch baton or r after here */ + c->cs->state = CONN_STATE_LINGER; + ap_mpm_resume_suspended(c); } /* If neither socket becomes readable in the specified timeout, Index: server/mpm/event/event.c =================================================================== --- server/mpm/event/event.c (revision 1840709) +++ server/mpm/event/event.c (working copy) @@ -1273,6 +1273,14 @@ static apr_status_t event_resume_suspended (conn_r apr_atomic_dec32(&suspended_count); c->suspended_baton = NULL; + if (cs->pub.state == CONN_STATE_LINGER) { + if (start_lingering_close_blocking(cs) == OK) { + process_lingering_close(cs); + } + return OK; + } + + cs->pub.state = CONN_STATE_WRITE_COMPLETION; cs->queue_timestamp = apr_time_now(); cs->pfd.reqevents = ( cs->pub.sense == CONN_SENSE_WANT_READ ? APR_POLLIN :