]> granicus.if.org Git - apache/commitdiff
Merge r1592037 from trunk:
authorJeff Trawick <trawick@apache.org>
Thu, 26 Jun 2014 00:24:44 +0000 (00:24 +0000)
committerJeff Trawick <trawick@apache.org>
Thu, 26 Jun 2014 00:24:44 +0000 (00:24 +0000)
mod_proxy_fcgi: Fix occasional high CPU when handling request bodies.

Submitted by: trawick
Reviewed by: covener, ylavic

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1605639 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
STATUS
modules/proxy/mod_proxy_fcgi.c

diff --git a/CHANGES b/CHANGES
index a1e7e6a5a8e3c1944cc54a96c6cd82e6ba169883..692740153178b86fafbb352e3efdea20ecaa7d2d 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,9 @@
 
 Changes with Apache 2.4.10
 
+  *) mod_proxy_fcgi: Fix occasional high CPU when handling request bodies.
+     [Jeff Trawick]
+
   *) event MPM: Fix possible crashes (third party modules accessing c->sbh) 
      or occasional missed mod_status updates under load. 
      [Edward Lu <Chaosed0 gmail com>]
diff --git a/STATUS b/STATUS
index 317e48eab080211c5b6d1a3b73f0e392b07cb708..679ea458483995eded666fb47be2744bbf3ae90e 100644 (file)
--- a/STATUS
+++ b/STATUS
@@ -100,10 +100,6 @@ RELEASE SHOWSTOPPERS:
 PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
   [ start all new proposals below, under PATCHES PROPOSED. ]
  
-   * mod_proxy_fcgi: Fix occasional high CPU when handling request bodies.
-     trunk patch: http://svn.apache.org/r1592037
-     2.4.x patch: http://people.apache.org/~trawick/r1592037.txt
-     +1: trawick, covener, ylavic
 
 
 PATCHES PROPOSED TO BACKPORT FROM TRUNK:
index c7421e729c0562972b4df1268c4532b20b3e6f39..e2fb59cdc3dd88c00839e19bf8ba8021a1de4fe7 100644 (file)
@@ -90,26 +90,13 @@ static int proxy_fcgi_canon(request_rec *r, char *url)
 static apr_status_t send_data(proxy_conn_rec *conn,
                               struct iovec *vec,
                               int nvec,
-                              apr_size_t *len,
-                              int blocking)
+                              apr_size_t *len)
 {
-    apr_status_t rv = APR_SUCCESS, arv;
+    apr_status_t rv = APR_SUCCESS;
     apr_size_t written = 0, to_write = 0;
     int i, offset;
-    apr_interval_time_t old_timeout;
     apr_socket_t *s = conn->sock;
 
-    if (!blocking) {
-        arv = apr_socket_timeout_get(s, &old_timeout);
-        if (arv != APR_SUCCESS) {
-            return arv;
-        }
-        arv = apr_socket_timeout_set(s, 0);
-        if (arv != APR_SUCCESS) {
-            return arv;
-        }
-    }
-
     for (i = 0; i < nvec; i++) {
         to_write += vec[i].iov_len;
     }
@@ -118,7 +105,7 @@ static apr_status_t send_data(proxy_conn_rec *conn,
     while (to_write) {
         apr_size_t n = 0;
         rv = apr_socket_sendv(s, vec + offset, nvec - offset, &n);
-        if ((rv != APR_SUCCESS) && !APR_STATUS_IS_EAGAIN(rv)) {
+        if (rv != APR_SUCCESS) {
             break;
         }
         if (n > 0) {
@@ -141,12 +128,6 @@ static apr_status_t send_data(proxy_conn_rec *conn,
     conn->worker->s->transferred += written;
     *len = written;
 
-    if (!blocking) {
-        arv = apr_socket_timeout_set(s, old_timeout);
-        if ((arv != APR_SUCCESS) && (rv == APR_SUCCESS)) {
-            return arv;
-        }
-    }
     return rv;
 }
 
@@ -207,7 +188,7 @@ static apr_status_t send_begin_request(proxy_conn_rec *conn,
     vec[1].iov_base = (void *)abrb;
     vec[1].iov_len = sizeof(abrb);
 
-    return send_data(conn, vec, 2, &len, 1);
+    return send_data(conn, vec, 2, &len);
 }
 
 static apr_status_t send_environment(proxy_conn_rec *conn, request_rec *r,
@@ -294,7 +275,7 @@ static apr_status_t send_environment(proxy_conn_rec *conn, request_rec *r,
         vec[1].iov_base = body;
         vec[1].iov_len = required_len;
 
-        rv = send_data(conn, vec, 2, &len, 1);
+        rv = send_data(conn, vec, 2, &len);
         apr_pool_clear(temp_pool);
 
         if (rv) {
@@ -309,7 +290,7 @@ static apr_status_t send_environment(proxy_conn_rec *conn, request_rec *r,
     vec[0].iov_base = (void *)farray;
     vec[0].iov_len = sizeof(farray);
 
-    return send_data(conn, vec, 1, &len, 1);
+    return send_data(conn, vec, 1, &len);
 }
 
 enum {
@@ -482,7 +463,7 @@ static apr_status_t dispatch(proxy_conn_rec *conn, proxy_dir_conf *conf,
                     ++nvec;
                 }
 
-                rv = send_data(conn, vec, nvec, &len, 0);
+                rv = send_data(conn, vec, nvec, &len);
                 if (rv != APR_SUCCESS) {
                     *err = "sending stdin";
                     break;
@@ -506,7 +487,7 @@ static apr_status_t dispatch(proxy_conn_rec *conn, proxy_dir_conf *conf,
                 vec[0].iov_base = (void *)farray;
                 vec[0].iov_len = sizeof(farray);
 
-                rv = send_data(conn, vec, 1, &len, 1);
+                rv = send_data(conn, vec, 1, &len);
                 if (rv != APR_SUCCESS) {
                     *err = "sending empty stdin";
                     break;