Author: mturk
Date: Sun Oct  5 04:28:58 2008
New Revision: 701777

URL: http://svn.apache.org/viewvc?rev=701777&view=rev
Log:
Add and use retry_interval for load balancer. Like with ajp worker retries and 
retry_interval are used to create multiple calls to get_worker. On retry the 
internal tables are reset and everything goes again like with new request

Modified:
    tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
    tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h

Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c?rev=701777&r1=701776&r2=701777&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Sun Oct  5 04:28:58 
2008
@@ -1016,7 +1016,7 @@
                              jk_logger_t *l, int *is_error)
 {
     lb_endpoint_t *p;
-    int attempt = 1;
+    int attempt = 0;
     lb_sub_worker_t *prec = NULL;
     int num_of_workers;
     int first = 1;
@@ -1025,6 +1025,7 @@
     int rc = JK_UNSET;
     char *sessionid = NULL;
     int i;
+    int retry;
 
     JK_TRACE_ENTER(l);
 
@@ -1081,9 +1082,31 @@
                "service sticky_session=%d id='%s'",
                p->worker->sticky_session, sessionid ? sessionid : "empty");
 
-    while (attempt <= num_of_workers && recoverable == JK_TRUE) {
-        lb_sub_worker_t *rec =
-            get_most_suitable_worker(s, p->worker, sessionid, p->states, l);
+    while (recoverable == JK_TRUE) {
+        lb_sub_worker_t *rec;
+        if (attempt >= num_of_workers) {
+            retry++;
+            if (retry > p->worker->retries) {
+                /* Done with retrying */
+                break;
+            }
+            if (JK_IS_DEBUG_LEVEL(l))
+                jk_log(l, JK_LOG_DEBUG,
+                       "retry %d, sleeping for %d ms before retrying",
+                       retry, p->worker->retry_interval);
+            jk_sleep(p->worker->retry_interval);
+            /* Pull shared memory if something changed during sleep */
+            jk_shm_lock();
+            if (p->worker->sequence != p->worker->s->h.sequence)
+                jk_lb_pull(p->worker, l);
+            jk_shm_unlock();
+            for (i = 0; i < num_of_workers; i++) {
+                /* Copy the shared state info */
+                p->states[i] = p->worker->lb_workers[i].s->state;
+            }
+            attempt = 0;
+        }
+        rec = get_most_suitable_worker(s, p->worker, sessionid, p->states, l);
         rc = JK_FALSE;
         *is_error = JK_HTTP_SERVER_BUSY;
         /* Do not reuse previous worker, because
@@ -1594,8 +1617,11 @@
 
     p->retries = jk_get_worker_retries(props, p->name,
                                        JK_RETRIES);
+    p->retry_interval =
+            jk_get_worker_retry_interval(props, p->name,
+                                        JK_SLEEP_DEF);
     p->recover_wait_time = jk_get_worker_recover_timeout(props, p->name,
-                                                            
WAIT_BEFORE_RECOVER);
+                                                         WAIT_BEFORE_RECOVER);
     if (p->recover_wait_time < 1)
         p->recover_wait_time = 1;
     p->max_reply_timeouts = jk_get_worker_max_reply_timeouts(props, p->name,

Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h
URL: 
http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h?rev=701777&r1=701776&r2=701777&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h Sun Oct  5 04:28:58 
2008
@@ -189,6 +189,7 @@
     int          recover_wait_time;
     int          max_reply_timeouts;
     int          retries;
+    int          retry_interval;
     int          lbmethod;
     int          lblock;
     int          maintain_time;



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to