diff -ru httpd-2.2.3.orig/modules/proxy/mod_proxy.c httpd-2.2.3/modules/proxy/mod_proxy.c
--- httpd-2.2.3.orig/modules/proxy/mod_proxy.c	2006-07-12 12:38:44.000000000 +0900
+++ httpd-2.2.3/modules/proxy/mod_proxy.c	2006-09-21 12:40:01.000000000 +0900
@@ -89,6 +89,18 @@
             return "Retry must be at least one second";
         worker->retry = apr_time_from_sec(ival);
     }
+    else if (!strcasecmp(key, "quick_retry")) {
+        ival = atoi(val);
+        if (ival < 1)
+            return "Quick_Retry must be at least one second";
+        worker->quick_retry = apr_time_from_sec(ival);
+    }
+    else if (!strcasecmp(key, "quick_retry_max")) {
+        ival = atoi(val);
+        if (ival < 0)
+            return "Quick_Retry_Max must be a positive number";
+        worker->quick_retry_max = ival;
+    }
     else if (!strcasecmp(key, "ttl")) {
         /* Time in seconds that will destroy all the connections
          * that exced the smax
diff -ru httpd-2.2.3.orig/modules/proxy/mod_proxy.h httpd-2.2.3/modules/proxy/mod_proxy.h
--- httpd-2.2.3.orig/modules/proxy/mod_proxy.h	2006-07-12 12:38:44.000000000 +0900
+++ httpd-2.2.3/modules/proxy/mod_proxy.h	2006-09-21 12:30:46.000000000 +0900
@@ -274,6 +274,8 @@
 struct proxy_worker {
     int             id;         /* scoreboard id */
     apr_interval_time_t retry;  /* retry interval */
+    apr_interval_time_t quick_retry; /* quick retry interval */
+    int             quick_retry_max; /* quick retry max */
     int             lbfactor;   /* initial load balancing factor */
     const char      *name;
     const char      *scheme;    /* scheme to use ajp|http|https */
diff -ru httpd-2.2.3.orig/modules/proxy/proxy_util.c httpd-2.2.3/modules/proxy/proxy_util.c
--- httpd-2.2.3.orig/modules/proxy/proxy_util.c	2006-07-12 12:38:44.000000000 +0900
+++ httpd-2.2.3/modules/proxy/proxy_util.c	2006-09-21 12:57:52.000000000 +0900
@@ -1675,6 +1675,10 @@
     /* Set default parameters */
     if (!worker->retry)
         worker->retry = apr_time_from_sec(PROXY_WORKER_DEFAULT_RETRY);
+    if (!worker->quick_retry)
+        worker->quick_retry = apr_time_from_sec(PROXY_WORKER_DEFAULT_RETRY);
+    if (!worker->quick_retry_max)
+        worker->quick_retry_max = 0;
     /* By default address is reusable */
     worker->is_address_reusable = 1;
 
@@ -1739,7 +1743,15 @@
         ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                     "proxy: %s: retrying the worker for (%s)",
                      proxy_function, worker->hostname);
-        if (apr_time_now() > worker->s->error_time + worker->retry) {
+        if (worker->s->retries < worker->quick_retry_max && apr_time_now() > worker->s->error_time + worker->quick_retry) {
+            ++worker->s->retries;
+            worker->s->status &= ~PROXY_WORKER_IN_ERROR;
+            ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
+                         "proxy: %s: worker for (%s) has been marked for quick_retry",
+                         proxy_function, worker->hostname);
+            return OK;
+        }
+        else if (apr_time_now() > worker->s->error_time + worker->retry) {
             ++worker->s->retries;
             worker->s->status &= ~PROXY_WORKER_IN_ERROR;
             ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,

