mturk 2004/11/08 05:42:23 Modified: jk/native/common jk_lb_worker.c Log: Backport load balancer algorithm from proxy_balancer. Use integer balancer factors instead double. This algorithim is much fatster and it actually behaves like it should. Revision Changes Path 1.25 +21 -41 jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c Index: jk_lb_worker.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- jk_lb_worker.c 8 Oct 2004 07:50:39 -0000 1.24 +++ jk_lb_worker.c 8 Nov 2004 13:42:23 -0000 1.25 @@ -18,8 +18,9 @@ * Description: Load balancer worker, knows how to load balance among * * several workers. * * Author: Gal Shachor <[EMAIL PROTECTED]> * + * Author: Mladen Turk <[EMAIL PROTECTED]> * * Based on: * - * Version: $Revision$ * + * Version: $Revision$ * ***************************************************************************/ #include "jk_pool.h" @@ -39,11 +40,17 @@ #define WAIT_BEFORE_RECOVER (60*1) #define ADDITINAL_WAIT_LOAD (20) +/** + * Worker record should be inside shared + * memory for correct behavior. + * Right now it operates on 'equal-load' + * presumption. + */ struct worker_record { char *name; - double lb_factor; - double lb_value; + int lb_factor; + int lb_value; int is_local_worker; int in_error_state; int in_recovering; @@ -98,7 +105,7 @@ * to be on the safe side lets remove the trailing query * string if appended... */ - if (id_end = strchr(id_start, '?')) { + if ((id_end = strchr(id_start, '?')) != NULL) { *id_end = '\0'; } /* @@ -189,31 +196,14 @@ } } -static double get_max_lb(lb_worker_t * p) -{ - unsigned i; - double rc = 0.0; - - for (i = 0; i < p->num_of_workers; i++) { - if (!p->lb_workers[i].in_error_state) { - if (p->lb_workers[i].lb_value > rc) { - rc = p->lb_workers[i].lb_value; - } - } - } - - return rc; - -} - static worker_record_t *get_most_suitable_worker(lb_worker_t * p, jk_ws_service_t *s, int attempt) { worker_record_t *rc = NULL; - double lb_min = 0.0; unsigned i; char *sessionid = NULL; + int total_factor = 0; if (p->sticky_session) { sessionid = get_sessionid(s); @@ -264,20 +254,19 @@ } } else { - if (p->lb_workers[i].lb_value < lb_min || !rc) { - lb_min = p->lb_workers[i].lb_value; + p->lb_workers[i].lb_value += p->lb_workers[i].lb_factor; + total_factor += p->lb_workers[i].lb_factor; + if (!rc || p->lb_workers[i].lb_value > rc->lb_value) rc = &(p->lb_workers[i]); - if (rc->is_local_worker) - break; - } } } } - if (rc && !rc->is_local_worker) { - rc->lb_value += rc->lb_factor; + if (rc) { + rc->lb_value -= total_factor; } + return rc; } @@ -316,7 +305,7 @@ rc = rec->w->get_endpoint(rec->w, &end, l); - jk_log(l, JK_LOG_DEBUG, + jk_log(l, JK_LOG_INFO, "Into jk_endpoint_t::service worker=%s jvm_route=%s rc=%d\n", rec->name, s->jvm_route, rc); @@ -324,10 +313,6 @@ int src = end->service(end, s, l, &is_recoverable); end->done(&end, l); if (src) { - if (rec->in_recovering && rec->lb_value != 0) { - rec->lb_value = - get_max_lb(p->worker) + ADDITINAL_WAIT_LOAD; - } rec->in_error_state = JK_FALSE; rec->in_recovering = JK_FALSE; rec->error_time = 0; @@ -431,13 +416,8 @@ jk_pool_strdup(&p->p, worker_names[i]); p->lb_workers[i].lb_factor = jk_get_lb_factor(props, worker_names[i]); - if (p->lb_workers[i].lb_factor < 0) { - p->lb_workers[i].lb_factor = - -1 * p->lb_workers[i].lb_factor; - } - if (0 < p->lb_workers[i].lb_factor) { - p->lb_workers[i].lb_factor = - 1 / p->lb_workers[i].lb_factor; + if (p->lb_workers[i].lb_factor < 1) { + p->lb_workers[i].lb_factor = 1; } p->lb_workers[i].is_local_worker =
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]