httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jir(í Tulach - Position <tul...@position.cz>
Subject mod_proxy in Apache 2.2 and HTTP_INTERNAL_SERVER_ERROR
Date Thu, 13 Dec 2007 22:52:08 GMT
Hello,

is there any reason why HTTP_INTERNAL_SERVER_ERROR returned by proxy 
handler cannot failover to another worker?
We use FastCGI together with FastCgiExternalServer option and want to 
use load balancer to prevent situation when external FastCGI instances 
are stopped or overloaded. mod_fastcgi returns status code 500 in that 
case but mod_proxy doesn't forward requests to another worker because 
HTTP_INTERNAL_SERVER_ERROR is handled separately.

We propose to handle HTTP_INTERNAL_SERVER_ERROR in the same way as 
HTTP_SERVICE_UNAVAILABLE or at least to make this behavior configurable 
(mod_proxy.c, line 833 - to test it simply remove "break;" line; please 
see code below).

Thank you in advance for any comments.

Regards

Jiri Tulach

Affected code with comments (mod_proxy.c):

       access_status = proxy_run_scheme_handler(r, worker, conf,
                                                url, NULL, 0);
       if (access_status == OK)
           break;
       else if (access_status == HTTP_INTERNAL_SERVER_ERROR) {
           /* Unrecoverable server error.
!!!          * We can not failover to another worker.   
<== Why? Server is not available because of some failure why not to use 
different working server?
            * Mark the worker as unusable if member of load balancer
            */
           if (balancer)
               worker->s->status |= PROXY_WORKER_IN_ERROR;
!!!         break;
<== this prevents failover to another worker
       }
       else if (access_status == HTTP_SERVICE_UNAVAILABLE) {
           /* Recoverable server error.
            * We can failover to another worker
            * Mark the worker as unusable if member of load balancer
            */
           if (balancer) {
               worker->s->status |= PROXY_WORKER_IN_ERROR;
           }
       }
       else {
           /* Unrecoverable error.
            * Return the origin status code to the client.
            */
           break;
       }



Mime
View raw message