On 02/08/2011 10:08 PM, j...@apache.org wrote:
> Author: jim
> Date: Tue Feb  8 21:08:10 2011
> New Revision: 1068581
> 
> URL: http://svn.apache.org/viewvc?rev=1068581&view=rev
> Log:
> Remove the thread mutex from the worker... it really should be
> in the balancer. Thus we have global and thread for the balancer.
> Use global when updating the full, shm list of workers; use
> thread when being local.
> 
> Modified:
>     httpd/httpd/trunk/modules/proxy/mod_proxy.h
>     httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c
>     httpd/httpd/trunk/modules/proxy/mod_proxy_ftp.c
>     httpd/httpd/trunk/modules/proxy/proxy_util.c
> 
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy.h
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy.h?rev=1068581&r1=1068580&r2=1068581&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy.h (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy.h Tue Feb  8 21:08:10 2011
> @@ -375,7 +376,6 @@ 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  *mutex; /* Thread lock for updating address cache */


Don't we need to protect the address cache for unbalanced workers as well by a 
thread lock?


>      void            *context;   /* general purpose storage */
>  };
>  
> Modified: httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c?rev=1068581&r1=1068580&r2=1068581&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c (original)
> +++ httpd/httpd/trunk/modules/proxy/mod_proxy_balancer.c Tue Feb  8 21:08:10 
> 2011
>> @@ -336,12 +336,7 @@ static proxy_worker *find_best_worker(pr
>      if (candidate)
>          candidate->s->elected++;

Hm, why don't we need to protect the data in the shared mem like 
candidate->s->elected
or the other elements that are touched by the finder with a global lock?


>  
> -/*
> -        PROXY_GLOBAL_UNLOCK(conf);
> -        return NULL;
> -*/
> -
> -    if ((rv = PROXY_GLOBAL_UNLOCK(balancer)) != APR_SUCCESS) {
> +    if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) {
>          ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
>          "proxy: BALANCER: (%s). Unlock failed for find_best_worker()", 
> balancer->name);
>      }
> @@ -463,7 +458,7 @@ static int proxy_balancer_pre_request(pr
>      /* Step 2: Lock the LoadBalancer
>       * XXX: perhaps we need the process lock here
>       */
> -    if ((rv = PROXY_GLOBAL_LOCK(*balancer)) != APR_SUCCESS) {
> +    if ((rv = PROXY_THREAD_LOCK(*balancer)) != APR_SUCCESS) {

Same question as above: We change data in the shared mem. So why only a thread 
lock?

>          ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
>                       "proxy: BALANCER: (%s). Lock failed for pre_request",
>                       (*balancer)->name);
> @@ -614,7 +609,7 @@ static int proxy_balancer_post_request(p
>  
>      apr_status_t rv;
>  
> -    if ((rv = PROXY_GLOBAL_LOCK(balancer)) != APR_SUCCESS) {
> +    if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) {

I assume you wanted PROXY_THREAD_LOCK instead of PROXY_THREAD_UNLOCK :-)

Same question as above: We change data in the shared mem. So why only a thread 
lock?


>          ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
>              "proxy: BALANCER: (%s). Lock failed for post_request",
>              balancer->name);
> @@ -878,13 +875,13 @@ static int balancer_handler(request_rec 
>      balancer = (proxy_balancer *)conf->balancers->elts;
>      for (i = 0; i < conf->balancers->nelts; i++, balancer++) {
>          apr_status_t rv;
> -        if ((rv = PROXY_GLOBAL_LOCK(balancer)) != APR_SUCCESS) {
> +        if ((rv = PROXY_THREAD_LOCK(balancer)) != APR_SUCCESS) {
>              ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
>                           "proxy: BALANCER: (%s). Lock failed for 
> balancer_handler",
>                           balancer->name);
>          }
>          ap_proxy_update_members(balancer, r->server, conf);

Can't the data change in shared memory while we update our local data, e.g. by 
balancer_handler that
is executed in another process and that adds or removes members at the same 
time?

> -        if ((rv = PROXY_GLOBAL_UNLOCK(balancer)) != APR_SUCCESS) {
> +        if ((rv = PROXY_THREAD_UNLOCK(balancer)) != APR_SUCCESS) {
>              ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
>                           "proxy: BALANCER: (%s). Unlock failed for 
> balancer_handler",
>                           balancer->name);


Regards

RĂ¼diger

Reply via email to