From: Paul Querna Date: Sat, 1 Apr 2006 18:55:28 +0000 (+0000) Subject: Merge r384580, r390210 and r390619 from trunk, changing the flushing band-aid in... X-Git-Tag: 2.2.1~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=19b06bb6d0db12d1648996d1ccbf0e1a799bb92e;p=thirdparty%2Fapache%2Fhttpd.git Merge r384580, r390210 and r390619 from trunk, changing the flushing band-aid in mod_proxy_ajp to be configurable. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@390728 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 373e47bab9c..eda6f1bbb7f 100644 --- a/CHANGES +++ b/CHANGES @@ -14,14 +14,19 @@ Changes with Apache 2.2.1 made to ap_escape_html so we escape quotes. Reported by JPCERT. [Mark Cox] + *) mod_proxy_ajp: Flushing of the output after each AJP chunk is now + configurable at runtime via the 'flushpackets' and 'flushwait' worker + params. Minor MMN bump. [Jim Jagielski] + *) mod_proxy: Fix incorrect usage of local and shared worker init. PR 38403. [Jim Jagielski] *) mod_isapi: Fix compiler errors on Unix platforms. [William Rowe] - *) mod_proxy_http: Send HTTP Keep-Alive Headers. PR 38524. - [Rüdiger Plüm, Joe Orton] + *) mod_proxy_http: Do send keep-alive header if the client sent + connection: keep-alive and do not close backend connection if the client + sent connection: close. PR 38524. [Ruediger Pluem, Joe Orton] *) mod_disk_cache: Return the correct error codes from bucket read failures, instead of APR_EGENERAL. diff --git a/STATUS b/STATUS index d3daeaf829b..b1667ffcbb3 100644 --- a/STATUS +++ b/STATUS @@ -73,22 +73,6 @@ RELEASE SHOWSTOPPERS: PATCHES ACCEPTED TO BACKPORT FROM TRUNK: [ start all new proposals below, under PATCHES PROPOSED. ] - * mod_proxy_ajp: Remove the Flushing Bandaid from compile time - to a more admin-friendly runtime setting. - http://svn.apache.org/viewcvs?rev=384580&view=rev - http://svn.apache.org/viewcvs?rev=390210&view=rev - http://svn.apache.org/viewcvs?rev=390619&view=rev - +1: jim, rpluem, pquerna - pquerna says: Why is this configuration for AJP polluting mod_proxy.h? - Shouldn't we be keeping the configuration of a Proxy Provider - separate from the main mod_proxy? - rpluem says: Because this configuration option should be also used for - HTTP and possibly other protocols in the future. Just - did not have the time to do so for HTTP (which has frequent - request / complains for this feature). See also - http://mail-archives.apache.org/mod_mbox/httpd-dev/200603.mbox/%3c200603092321.k29NLIi05689@devsys.jaguNET.com%3e - - PATCHES PROPOSED TO BACKPORT FROM TRUNK: * mod_dbd: When threaded, create a private pool in child_init diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 7784311bea9..e3d4209efcb 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -107,6 +107,8 @@ * 20050708.1 (2.1.7-dev) add proxy request_status hook (minor) * 20051006.0 (2.1.8-dev) NET_TIME filter eliminated * 20051115.0 (2.1.10-dev/2.2.0) add use_canonical_phys_port to core_dir_config + * 20051115.1 (2.2.1) flush_packets and flush_wait members added to + * proxy_server (minor) */ #define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */ @@ -114,7 +116,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20051115 #endif -#define MODULE_MAGIC_NUMBER_MINOR 0 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 1 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index 1424fe74294..d688c64df02 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -218,6 +218,26 @@ static const char *set_worker_param(apr_pool_t *p, } } } + else if (!strcasecmp(key, "flushpackets")) { + if (!strcasecmp(val, "on")) + worker->flush_packets = flush_on; + else if (!strcasecmp(val, "off")) + worker->flush_packets = flush_off; + else if (!strcasecmp(val, "auto")) + worker->flush_packets = flush_auto; + else + return "flushpackets must be on|off|auto"; + } + else if (!strcasecmp(key, "flushwait")) { + ival = atoi(val); + if (ival > 1000 || ival < 0) { + return "flushwait must be <= 1000, or 0 for system default of 10 millseconds."; + } + if (ival == 0) + worker->flush_wait = PROXY_FLUSH_WAIT; + else + worker->flush_wait = ival * 1000; /* change to microseconds */ + } else { return "unknown Worker parameter"; } diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 7bc092eac04..11ce04aff09 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -301,9 +301,21 @@ struct proxy_worker { #if APR_HAS_THREADS apr_thread_mutex_t *mutex; /* Thread lock for updating address cache */ #endif - void *context; /* general purpose storage */ + void *context; /* general purpose storage */ + enum { + flush_off, + flush_on, + flush_auto + } flush_packets; /* control AJP flushing */ + int flush_wait; /* poll wait time in microseconds if flush_auto */ }; +/* + * Wait 10000 microseconds to find out if more data is currently + * available at the backend. Just an arbitrary choose. + */ +#define PROXY_FLUSH_WAIT 10000 + struct proxy_balancer { apr_array_header_t *workers; /* array of proxy_workers */ const char *name; /* name of the load balancer */ diff --git a/modules/proxy/mod_proxy_ajp.c b/modules/proxy/mod_proxy_ajp.c index 3c97162cced..9b65590a479 100644 --- a/modules/proxy/mod_proxy_ajp.c +++ b/modules/proxy/mod_proxy_ajp.c @@ -90,7 +90,7 @@ static int proxy_ajp_canon(request_rec *r, char *url) } /* - * XXX: Flushing bandaid + * XXX: AJP Auto Flushing * * When processing CMD_AJP13_SEND_BODY_CHUNK AJP messages we will do a poll * with FLUSH_WAIT miliseconds timeout to determine if more data is currently @@ -105,15 +105,6 @@ static int proxy_ajp_canon(request_rec *r, char *url) * For further discussion see PR37100. * http://issues.apache.org/bugzilla/show_bug.cgi?id=37100 */ -#define FLUSHING_BANDAID 1 - -#ifdef FLUSHING_BANDAID -/* - * Wait 10000 microseconds to find out if more data is currently - * available at the backend. Just an arbitrary choose. - */ -#define FLUSH_WAIT 10000 -#endif /* * process the request and write the response. @@ -140,10 +131,8 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, apr_off_t bb_len; int data_sent = 0; int rv = 0; -#ifdef FLUSHING_BANDAID apr_int32_t conn_poll_fd; apr_pollfd_t *conn_poll; -#endif /* * Send the AJP request to the remote server @@ -250,9 +239,8 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, result = ajp_parse_type(r, conn->data); output_brigade = apr_brigade_create(p, r->connection->bucket_alloc); -#ifdef FLUSHING_BANDAID /* - * Prepare apr_pollfd_t struct for later check if there is currently + * Prepare apr_pollfd_t struct for possible later check if there is currently * data available from the backend (do not flush response to client) * or not (flush response to client) */ @@ -260,7 +248,6 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, conn_poll->reqevents = APR_POLLIN; conn_poll->desc_type = APR_POLL_SOCKET; conn_poll->desc.s = conn->sock; -#endif bufsiz = AJP13_MAX_SEND_BODY_SZ; while (isok) { @@ -330,17 +317,14 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(output_brigade, e); -#ifdef FLUSHING_BANDAID - /* - * If there is no more data available from backend side - * currently, flush response to client. - */ - if (apr_poll(conn_poll, 1, &conn_poll_fd, FLUSH_WAIT) - == APR_TIMEUP) { + if ( (conn->worker->flush_packets == flush_on) || + ( (conn->worker->flush_packets == flush_auto) && + (apr_poll(conn_poll, 1, &conn_poll_fd, + conn->worker->flush_wait) + == APR_TIMEUP) ) ) { e = apr_bucket_flush_create(r->connection->bucket_alloc); APR_BRIGADE_INSERT_TAIL(output_brigade, e); } -#endif apr_brigade_length(output_brigade, 0, &bb_len); if (bb_len != -1) conn->worker->s->read += bb_len; @@ -366,6 +350,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r, "proxy: error processing body"); isok = 0; } + /* XXX: what about flush here? See mod_jk */ data_sent = 1; break; default: diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index a52a146b839..e28687ec258 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1318,6 +1318,8 @@ PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker, (*worker)->hostname = uri.hostname; (*worker)->port = uri.port; (*worker)->id = proxy_lb_workers; + (*worker)->flush_packets = flush_off; + (*worker)->flush_wait = PROXY_FLUSH_WAIT; /* Increase the total worker count */ proxy_lb_workers++; init_conn_pool(p, *worker);