You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by mt...@apache.org on 2008/09/22 12:26:00 UTC

svn commit: r697774 - /tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c

Author: mturk
Date: Mon Sep 22 03:25:58 2008
New Revision: 697774

URL: http://svn.apache.org/viewvc?rev=697774&view=rev
Log:
Move local states array allocation to endpoint allocation

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

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=697774&r1=697773&r2=697774&view=diff
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Mon Sep 22 03:25:58 2008
@@ -117,9 +117,9 @@
 
 struct lb_endpoint
 {
-    lb_worker_t *worker;
-
-    jk_endpoint_t endpoint;
+    lb_worker_t     *worker;
+    jk_endpoint_t    endpoint;
+    int             *states;
 };
 typedef struct lb_endpoint lb_endpoint_t;
 
@@ -1020,7 +1020,6 @@
     int recoverable = JK_TRUE;
     int rc = JK_UNSET;
     char *sessionid = NULL;
-    int  *states = NULL;
     int i;
 
     JK_TRACE_ENTER(l);
@@ -1038,13 +1037,6 @@
 
     /* Set returned error to OK */
     *is_error = JK_HTTP_OK;
-    if (!(states = (int *)malloc(num_of_workers * sizeof(int)))) {
-        *is_error = JK_HTTP_SERVER_ERROR;
-        jk_log(l, JK_LOG_ERROR,
-               "Failed allocating private worker state memory");
-        JK_TRACE_EXIT(l);
-        return JK_SERVER_ERROR;
-    }
 
     jk_shm_lock();
     if (p->worker->sequence != p->worker->s->h.sequence)
@@ -1052,7 +1044,7 @@
     jk_shm_unlock();
     for (i = 0; i < num_of_workers; i++) {
         /* Copy the shared state info */
-        states[i] = p->worker->lb_workers[i].s->state;
+        p->states[i] = p->worker->lb_workers[i].s->state;
     }
 
     /* set the recovery post, for LB mode */
@@ -1062,7 +1054,6 @@
         jk_log(l, JK_LOG_ERROR,
                "Failed allocating AJP message");
         JK_TRACE_EXIT(l);
-        free(states);
         return JK_SERVER_ERROR;
     }
     if (jk_b_set_buffer_size(s->reco_buf, p->worker->max_packet_size)) {
@@ -1070,7 +1061,6 @@
         jk_log(l, JK_LOG_ERROR,
                "Failed allocating AJP message buffer");
         JK_TRACE_EXIT(l);
-        free(states);
         return JK_SERVER_ERROR;
     }
     jk_b_reset(s->reco_buf);
@@ -1089,7 +1079,7 @@
 
     while (attempt <= num_of_workers && recoverable == JK_TRUE) {
         lb_sub_worker_t *rec =
-            get_most_suitable_worker(s, p->worker, sessionid, states, l);
+            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
@@ -1116,7 +1106,7 @@
                 jk_shm_lock();
             if (rec->s->state == JK_LB_STATE_RECOVER) {
                 rec->s->state  = JK_LB_STATE_PROBE;
-                states[rec->i] = JK_LB_STATE_PROBE;
+                p->states[rec->i] = JK_LB_STATE_PROBE;
             }
             if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
                 jk_shm_unlock();
@@ -1149,7 +1139,7 @@
                     jk_shm_lock();
                 if (rec->s->state != JK_LB_STATE_ERROR) {
                     rec->s->state  = JK_LB_STATE_BUSY;
-                    states[rec->i] = JK_LB_STATE_BUSY;
+                    p->states[rec->i] = JK_LB_STATE_BUSY;
                 }
                 if (p->worker->lblock == JK_LB_LOCK_PESSIMISTIC)
                     jk_shm_unlock();
@@ -1222,7 +1212,7 @@
                  */
                 if (rec->s->state == JK_LB_STATE_BUSY) {
                     rec->s->state  = JK_LB_STATE_OK;
-                    states[rec->i] = JK_LB_STATE_OK;
+                    p->states[rec->i] = JK_LB_STATE_OK;
                 }
                 /* Decrement the busy worker count.
                  * Check if the busy was reset to zero by graceful
@@ -1234,7 +1224,7 @@
                     rec->s->busy--;
                 if (service_stat == JK_TRUE) {
                     rec->s->state  = JK_LB_STATE_OK;
-                    states[rec->i] = JK_LB_STATE_OK;
+                    p->states[rec->i] = JK_LB_STATE_OK;
                     rec->s->error_time = 0;
                     rc = JK_TRUE;
                     recoverable = JK_UNSET;
@@ -1245,7 +1235,7 @@
                     * Since this is bad request do not fail over.
                     */
                     rec->s->state  = JK_LB_STATE_OK;
-                    states[rec->i] = JK_LB_STATE_ERROR;
+                    p->states[rec->i] = JK_LB_STATE_ERROR;
                     rec->s->error_time = 0;
                     rc = JK_CLIENT_ERROR;
                     recoverable = JK_FALSE;
@@ -1257,7 +1247,7 @@
                     * Failing over to another node could help.
                     */
                     rec->s->state  = JK_LB_STATE_OK;
-                    states[rec->i] = JK_LB_STATE_ERROR;
+                    p->states[rec->i] = JK_LB_STATE_ERROR;
                     rec->s->error_time = 0;
                     rc = JK_FALSE;
                 }
@@ -1268,7 +1258,7 @@
                     * Failing over to another node could help.
                     */
                     rec->s->state  = JK_LB_STATE_OK;
-                    states[rec->i] = JK_LB_STATE_ERROR;
+                    p->states[rec->i] = JK_LB_STATE_ERROR;
                     rec->s->error_time = 0;
                     rc = JK_FALSE;
                 }
@@ -1285,7 +1275,7 @@
                     else {
                         rec->s->state = JK_LB_STATE_ERROR;
                     }
-                    states[rec->i] = JK_LB_STATE_ERROR;
+                    p->states[rec->i] = JK_LB_STATE_ERROR;
                     rec->s->error_time = time(NULL);
                     rc = JK_FALSE;
                 }
@@ -1302,7 +1292,7 @@
                         else {
                             rec->s->state = JK_LB_STATE_ERROR;
                         }
-                        states[rec->i] = JK_LB_STATE_ERROR;
+                        p->states[rec->i] = JK_LB_STATE_ERROR;
                         rec->s->error_time = time(NULL);
                     }
                     else {
@@ -1314,7 +1304,7 @@
                          * to other nodes?
                          */
                         rec->s->state  = JK_LB_STATE_OK;
-                        states[rec->i] = JK_LB_STATE_ERROR;
+                        p->states[rec->i] = JK_LB_STATE_ERROR;
                         rec->s->error_time = 0;
                     }
                     rc = JK_FALSE;
@@ -1331,11 +1321,11 @@
                     else {
                         rec->s->state = JK_LB_STATE_ERROR;
                     }
-                    states[rec->i] = JK_LB_STATE_ERROR;
+                    p->states[rec->i] = JK_LB_STATE_ERROR;
                     rec->s->error_time = time(NULL);
                     rc = JK_FALSE;
                 }
-                if (states[rec->i] == JK_LB_STATE_ERROR)
+                if (p->states[rec->i] == JK_LB_STATE_ERROR)
                     jk_log(l, JK_LOG_INFO,
                            "service failed, %sworker %s is in error state",
                            rec->s->state == JK_LB_STATE_ERROR ? "entire " : "",
@@ -1422,8 +1412,6 @@
         lb_add_log_items(s, lb_last_log_names, prec, l);
     }
 
-    /* Free any private memory used */
-    free(states);
     JK_TRACE_EXIT(l);
     return rc;
 }
@@ -1434,7 +1422,7 @@
 
     if (e && *e && (*e)->endpoint_private) {
         lb_endpoint_t *p = (*e)->endpoint_private;
-
+        free(p->states);
         free(p);
         *e = NULL;
         JK_TRACE_EXIT(l);
@@ -1647,8 +1635,15 @@
         p->endpoint.endpoint_private = p;
         p->endpoint.service = service;
         p->endpoint.done = done;
+        p->states = (int *)malloc((p->worker->num_of_workers + 1) * sizeof(int));
+        if (!p->states) {
+            free(p);
+            jk_log(l, JK_LOG_ERROR,
+	               "Failed allocating private worker state memory");
+    	    JK_TRACE_EXIT(l);
+        	return JK_FALSE;
+    	}
         *pend = &p->endpoint;
-
         JK_TRACE_EXIT(l);
         return JK_TRUE;
     }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org