]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r384580, r390210 and r390619 from trunk, changing the flushing band-aid in...
authorPaul Querna <pquerna@apache.org>
Sat, 1 Apr 2006 18:55:28 +0000 (18:55 +0000)
committerPaul Querna <pquerna@apache.org>
Sat, 1 Apr 2006 18:55:28 +0000 (18:55 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.2.x@390728 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
include/ap_mmn.h
modules/proxy/mod_proxy.c
modules/proxy/mod_proxy.h
modules/proxy/mod_proxy_ajp.c
modules/proxy/proxy_util.c

diff --git a/CHANGES b/CHANGES
index 373e47bab9c43adf7370f7ed64c2fa42c8ae29de..eda6f1bbb7ffcc2dcc1aee82f6776e7424e5a430 100644 (file)
--- 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 d3daeaf829b84b961910e77a96febb7df995182a..b1667ffcbb32b5f9b1720acd4709df9ed860afc7 100644 (file)
--- 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
index 7784311bea9ef376e6091f4b7c808dba1a333156..e3d4209efcb4cf84e564b01e10932b14672791c0 100644 (file)
  * 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" */
 #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
index 1424fe74294cebc6152364359b903ec50ddd6720..d688c64df0243860304a4197bc2b869714e7ee4a 100644 (file)
@@ -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";
     }
index 7bc092eac0480660200b36ccf438944db8aa36ea..11ce04aff09e9ce38d7bfbff19b6408918b93686 100644 (file)
@@ -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 */
index 3c97162cced75e7ebd07bd395679ed5fa433aa46..9b65590a4799bb5626f278f419d5c04a349927d8 100644 (file)
@@ -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:
index a52a146b8397fcdf362c09b4b53203902c69ab23..e28687ec25818a311176c179a987d2de3c779c36 100644 (file)
@@ -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);