]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Ugg... unbalanced workers *do* need a mutex as well (good catch RĂ¼diger!)
authorJim Jagielski <jim@apache.org>
Wed, 9 Feb 2011 13:20:09 +0000 (13:20 +0000)
committerJim Jagielski <jim@apache.org>
Wed, 9 Feb 2011 13:20:09 +0000 (13:20 +0000)
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1068879 13f79535-47bb-0310-9956-ffa450edef68

modules/proxy/mod_proxy.h
modules/proxy/mod_proxy_balancer.c
modules/proxy/proxy_util.c

index 0f7ecccef02f10980ed5a76ac64eb8fe4316d550..b612b904ff76211c816f2a4d2a3a2ed45f7bd0c8 100644 (file)
@@ -376,6 +376,7 @@ struct proxy_worker {
     proxy_conn_pool     *cp;    /* Connection pool to use */
     proxy_worker_shared   *s;   /* Shared data */
     proxy_balancer  *balancer;  /* which balancer am I in? */
+    apr_thread_mutex_t  *tmutex; /* Thread lock for updating address cache */
     void            *context;   /* general purpose storage */
 };
 
@@ -413,7 +414,7 @@ struct proxy_balancer {
     const char *sname;            /* filesystem safe balancer name */
     apr_time_t      wupdated;    /* timestamp of last change to workers list */
     apr_global_mutex_t  *gmutex; /* global lock for updating list of workers */
-    apr_thread_mutex_t  *tmutex; /* Thread lock for updating address cache and worker selection*/
+    apr_thread_mutex_t  *tmutex; /* Thread lock for updating shm */
     void            *context;    /* general purpose storage */
     proxy_balancer_shared *s;    /* Shared data */
 };
index b9e3443cc49b3df5fc8a96f3e22d257fea6a8861..f4c6915d58195199de2e82e745be6e352cc5ce0a 100644 (file)
@@ -1373,6 +1373,7 @@ PROXY_DECLARE(apr_status_t) ap_proxy_update_members(proxy_balancer *b, server_re
             (*runtime)->cp = NULL;
             (*runtime)->balancer = b;
             (*runtime)->s = shm;
+            (*runtime)->tmutex = NULL;
             if ((rv = ap_proxy_initialize_worker(*runtime, s, conf->pool)) != APR_SUCCESS) {
                 ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "Cannot init worker");
                 return rv;
index 45d3ac07b86b0cc85bf6c7a7fdb4afe05dee250c..89abd248d5e9f325d895323aa7ec4160e8287fc4 100644 (file)
@@ -1467,7 +1467,7 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_balancer(proxy_balancer *balance
         rv = apr_thread_mutex_create(&(balancer->tmutex), APR_THREAD_MUTEX_DEFAULT, p);
         if (rv != APR_SUCCESS) {
             ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
-                         "can not create thread mutex");
+                         "can not create balancer thread mutex");
             return rv;
         }
     }    
@@ -1890,6 +1890,14 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_worker(proxy_worker *worker, ser
         ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                      "initializing worker %s local", worker->s->name);
         /* Now init local worker data */
+        if (worker->tmutex == NULL) {
+            rv = apr_thread_mutex_create(&(worker->tmutex), APR_THREAD_MUTEX_DEFAULT, p);
+            if (rv != APR_SUCCESS) {
+                ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
+                             "can not create worker thread mutex");
+                return rv;
+            }
+        }    
         if (worker->cp == NULL)
             init_conn_pool(p, worker);
         if (worker->cp == NULL) {
@@ -2293,7 +2301,7 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
                                     conn->pool);
     }
     else if (!worker->cp->addr) {
-        if ((err = PROXY_THREAD_LOCK(worker->balancer)) != APR_SUCCESS) {
+        if ((err = PROXY_THREAD_LOCK(worker)) != APR_SUCCESS) {
             ap_log_error(APLOG_MARK, APLOG_ERR, err, r->server,
                          "proxy: lock");
             return HTTP_INTERNAL_SERVER_ERROR;
@@ -2310,7 +2318,7 @@ ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
                                     conn->port, 0,
                                     worker->cp->pool);
         conn->addr = worker->cp->addr;
-        if ((uerr = PROXY_THREAD_UNLOCK(worker->balancer)) != APR_SUCCESS) {
+        if ((uerr = PROXY_THREAD_UNLOCK(worker)) != APR_SUCCESS) {
             ap_log_error(APLOG_MARK, APLOG_ERR, uerr, r->server,
                          "proxy: unlock");
         }