Hi again,
included int this message is a patch to the current CVS which adds the notion of local workers to both jk1 and jk2. I did not have time to test the patch, I can only say it does compile. The modifications are rather slim so the validation should be easy. Feedback welcome, Mathias. ---8<------8<------8<------8<------8<------8<------8<------8<------8<--- Index: jk/native/common/jk_lb_worker.c =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-connectors/jk/native/common/jk_lb_worker.c,v retrieving revision 1.9 diff -r1.9 jk_lb_worker.c 97a98,121 > /* > * These are the names of the local workers. > */ > char ** local_workers_names; > > /* > * This is the number of local workers. > */ > unsigned num_local_workers; > > /* > * This is the index of the last local worker in the workers' array. > * The workers' array is assumed sorted with the local workers first. > */ > int last_local_worker_index; > > /* > * What to do if the local worker is unavailable, > * JK_LOCAL_WORKER_FAULT_REJECT to reject the reaques thus generating an error, > * JK_LOCAL_WORKER_FAULT_BALANCE to load balance the request on another worker. > */ > int local_worker_fault_action; > > 253c277 < unsigned i; --- > int i; 257c281 < for(i = 0 ; i < p->num_of_workers ; i++) { --- > for(i = 0 ; (unsigned) i < p->num_of_workers ; i++) { 272c296 < for(i = 0 ; i < p->num_of_workers ; i++) { --- > for(i = 0 ; (unsigned) i < p->num_of_workers ; i++) { 280,281d303 < p->lb_workers[i].error_time = now; < rc = &(p->lb_workers[i]); 283c305,320 < break; --- > /* > * Recovering worker is only eligible for requests > * part of a session and whose worker has failed or > * for session less requests when local workers have > * all been tried and fault_action is BALANCE. > * > * For other requests those workers do not have > * priority over local workers. > */ > > if(session_route || i > p->last_local_worker_index) { > p->lb_workers[i].error_time = now; > rc = &(p->lb_workers[i]); > > break; > } 291,292c328 < } < } --- > } 294,295c330,355 < if(rc && rc->lb_value != 0 ) { < rc->lb_value += rc->lb_factor; --- > /* > * If no session route is set and we reached the end of local workers > * use the local worker with the least lb_value if available, > * otherwise act according to local_worker_fault_action. > * > * If no local workers we specified, continue worker selection. > */ > > if(!session_route && i == p->last_local_worker_index) { > /* > * If we have selected a worker then use it as it is the local worker > * with the lowest lb_value. > * > * If rc is NULL, no worker was selected so far, all local workers are > * in error. If fault_action is to reject the request do so. > * > * If rc is NULL but fault_action is to balance the request continue. > * worker selection. > * > */ > if(rc) { > break; > } else if(p->local_worker_fault_action == JK_LOCAL_WORKER_FAULT_REJECT) { > return rc; > } > } 297a358,359 > rc->lb_value += rc->lb_factor; > 416a479 > char **local_worker_names; 417a481 > unsigned num_local_workers; 459a524,564 > /* > * Check if a list of local workers was provided. > * If so reorder the workers list so as to put the > * local workers at the beginning. > */ > > p->last_local_worker_index = -1; > > if(jk_get_local_worker_list(props, > p->name, > &local_worker_names, > &num_local_workers) && num_local_workers) { > unsigned j = 0; > unsigned k = 0; > unsigned fault_action = JK_LOCAL_WORKER_FAULT_REJECT; > > for(j = 0; j < num_local_workers; j++) { > for(k = p->last_local_worker_index + 1; k < num_of_workers; k++) { > if(strcmp(p->lb_workers[k].name, local_worker_names[j]) == 0) { > worker_record_t tmpwkr; > > p->last_local_worker_index++; > > tmpwkr = p->lb_workers[p->last_local_worker_index]; > p->lb_workers[p->last_local_worker_index] = >p->lb_workers[k]; > p->lb_workers[k] = tmpwkr; > } > } > } > > if(jk_get_local_worker_fault_action(props, > p->name, > &fault_action) == JK_TRUE) { > p->local_worker_fault_action = fault_action; > } else { > jk_log(l, JK_LOG_INFO, > "In jk_worker_t::validate: Local worker fault action >defaults to REJECT for worker %s\n", > p->name); > } > } > 470c575 < } --- > } 562c667 < private_data->num_of_workers = 0; --- > private_data->num_of_workers = 0; 567a673,677 > > private_data->local_workers_names = NULL; > private_data->num_local_workers = 0; > private_data->last_local_worker_index = -1; > private_data->local_worker_fault_action = JK_LOCAL_WORKER_FAULT_REJECT; Index: jk/native/common/jk_util.c =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-connectors/jk/native/common/jk_util.c,v retrieving revision 1.13 diff -r1.13 jk_util.c 87a88 > #define LOCAL_WORKERS ("local_workers") 468a470,518 > return JK_FALSE; > } > > int jk_get_local_worker_list(jk_map_t *m, > const char *lb_wname, > char ***list, > unsigned *num_local_workers) > { > char buf[1024]; > > if(m && list && num_local_workers && lb_wname) { > char **ar = NULL; > > sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, lb_wname, LOCAL_WORKERS); > ar = map_get_string_list(m, buf, num_local_workers, NULL); > if(ar) { > *list = ar; > return JK_TRUE; > } > *list = NULL; > *num_local_workers = 0; > } > > return JK_FALSE; > } > > int jk_get_local_worker_fault_action(jk_map_t *m, > const char *lb_wname, > int *action) > { > char buf[1024]; > > if(m && action && lb_wname) { > char *fault_action = NULL; > > sprintf(buf, "%s.%s.%s", PREFIX_OF_WORKER, lb_wname, >LOCAL_WORKER_FAULT_ACTION); > fault_action = map_get_string(m, buf, NULL); > > if(fault_action) { > if(strcmp(fault_action,"reject") == 0) { > *action = JK_LOCAL_WORKER_FAULT_REJECT; > } else if(strcmp(fault_action,"balance") == 0) { > *action = JK_LOCAL_WORKER_FAULT_BALANCE; > } else { > return JK_FALSE; > } > return JK_TRUE; > } > } Index: jk/native/common/jk_util.h =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-connectors/jk/native/common/jk_util.h,v retrieving revision 1.5 diff -r1.5 jk_util.h 72a73,79 > /* > * Default actions for load balancing worker. > */ > > #define JK_LOCAL_WORKER_FAULT_REJECT 1 > #define JK_LOCAL_WORKER_FAULT_BALANCE 2 > 128a136,144 > > int jk_get_local_worker_list(jk_map_t *m, > const char *lb_wname, > char ***list, > unsigned *num_of_wokers); > > int jk_get_local_worker_fault_action(jk_map_t *m, > const char *lb_wname, > int *action); Index: jk/native2/common/jk_worker_lb.c =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-connectors/jk/native2/common/jk_worker_lb.c,v retrieving revision 1.9 diff -r1.9 jk_worker_lb.c 156a157 > 158,167d158 < if(lb->lb_workers[i]->lb_value == 0 ) { < /* That's the 'default' worker, it'll take all requests. < * All other workers are not used unless this is in error state. < * < * The 'break' will disable checking for recovery on other < * workers - but that doesn't matter as long as the default is alive. < */ < rc=lb->lb_workers[i]; < break; < } 171c162 < rc = lb->lb_workers[i]; --- > rc = lb->lb_workers[i]; 173a165,191 > > /* > * If no session route is set and we reached the end of local workers > * use the local worker with the least lb_value if available, > * otherwise act according to local_worker_fault_action. > * > * If no local workers we specified, continue worker selection. > */ > > if(!session_route && i == lb->last_local_worker_index) { > /* > * If we have selected a worker then use it as it is the local worker > * with the lowest lb_value. > * > * If rc is NULL, no worker was selected so far, all local workers are > * in error. If fault_action is to reject the request do so. > * > * If rc is NULL but fault_action is to balance the request continue. > * worker selection. > * > */ > if(rc) { > break; > } else if(lb->local_worker_fault_action == JK_LOCAL_WORKER_FAULT_REJECT) { > return rc; > } > } 221,226c239 < if( rc->lb_value != 0 ) { < /* It it's the default, it'll remain the default - we don't < increase the factor < */ < rc->lb_value += rc->lb_factor; < } --- > rc->lb_value += rc->lb_factor; 415a429 > unsigned j; 433a448,452 > /* > * Init the index of the local_worker to -1. > */ > lb->last_local_worker_index=-1; > 435a455 > 444,458c464,465 < if( w->lb_factor != 0 ) { < w->lb_factor = 1/ w->lb_factor; < lb->lb_workers[currentWorker]=w; < } else { < /* If == 0, then this is the default worker. Switch it with the first < worker to avoid looking too much for it. < */ < jk_worker_t *first=lb->lb_workers[0]; < lb->lb_workers[0]=w; < /* Only do the exchange if the worker is not the first */ < if( currentWorker > 0 ) { < lb->lb_workers[currentWorker]=first; < } < } < --- > w->lb_factor = 1/ w->lb_factor; > lb->lb_workers[currentWorker]=w; 460,465d466 < /* < * Allow using lb in fault-tolerant mode. < * Just set lbfactor in worker.properties to 0 to have < * a worker used only when principal is down or session route < * point to it. Provided by Paul Frieden <[EMAIL PROTECTED]> < */ 470a472,487 > /* > * Move the local workers at the beginning of the workers array. > */ > if (lb->local_workers_names) { > for(j = 0; j < lb->num_local_workers; j++) { > if (strcmp(lb->local_workers_names[j], name) == 0) { > jk_worker_t * worker; > lb->last_local_worker_index++; > worker=lb->lb_workers[lb->last_local_worker_index]; > >lb->lb_workers[lb->last_local_worker_index]=lb->lb_workers[currentWorker]; > lb->lb_workers[currentWorker]=worker; > break; > } > } > } > 514a532,552 > } else if(strcmp(name, "local_worker") == 0) { > lb->local_workers_names=jk2_config_split(env, lb->mbean->pool, > value, NULL, &lb->num_local_workers); > if(lb->local_workers_names==NULL || lb->num_local_workers == 0) { > env->l->jkLog(env, env->l, JK_LOG_ERROR, > "lb_worker.validate(): no local workers specified\n"); > return JK_ERR; > } > jk2_lb_refresh( env, lb ); > return JK_OK; > } else if(strcmp(name, "fault_action") == 0) { > if(strcmp(value, "balance") == 0) { > lb->local_worker_fault_action=JK_LOCAL_WORKER_FAULT_BALANCE; > } else if(strcmp(value, "reject") == 0) { > lb->local_worker_fault_action=JK_LOCAL_WORKER_FAULT_REJECT; > } else { > env->l->jkLog(env, env->l, JK_LOG_ERROR, > "lb_worker.validate(): invalid fault_action\n"); > return JK_ERR; > } > return JK_OK; 515a554 > 587a627,634 > /* > * Init local workers parameters. > */ > w->local_workers_names = NULL; > w->num_local_workers = 0; > w->last_local_worker_index = -1; > w->local_worker_fault_action = JK_LOCAL_WORKER_FAULT_REJECT; > Index: jk/native2/include/jk_worker.h =================================================================== RCS file: /home/cvspublic/jakarta-tomcat-connectors/jk/native2/include/jk_worker.h,v retrieving revision 1.17 diff -r1.17 jk_worker.h 90a91,97 > * Possible actions when local worker fails. > */ > > #define JK_LOCAL_WORKER_FAULT_REJECT 1 > #define JK_LOCAL_WORKER_FAULT_BALANCE 2 > > /* 208a216,238 > > /* > * These are the names of the local workers. > */ > char ** local_workers_names; > > /* > * This is the number of local workers. > */ > unsigned num_local_workers; > > /* > * This is the index of the last local worker in the workers' array. > * The workers' array is assumed sorted with the local workers first. > */ > int last_local_worker_index; > > /* > * What to do if the local worker is unavailable, > * JK_LOCAL_WORKER_FAULT_REJECT to reject the reaques thus generating an error, > * JK_LOCAL_WORKER_FAULT_BALANCE to load balance the request on another worker. > */ > int local_worker_fault_action; -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>