Author: mturk Date: Wed Mar 15 23:53:27 2006 New Revision: 386279 URL: http://svn.apache.org/viewcvs?rev=386279&view=rev Log: Commit #36138. It was waiting for a long time... Modified from original patch provided by Chris Lamprecht.
Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h tomcat/connectors/trunk/jk/native/common/jk_status.c tomcat/connectors/trunk/jk/native/common/jk_util.c tomcat/connectors/trunk/jk/xdocs/changelog.xml Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c URL: http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c?rev=386279&r1=386278&r2=386279&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.c Wed Mar 15 23:53:27 2006 @@ -359,6 +359,77 @@ return candidate; } +static worker_record_t *find_best_bybusyness(lb_worker_t *p, + jk_logger_t *l) +{ + static unsigned int next_offset = 0; + unsigned int i; + unsigned int j; + unsigned int offset; + int bfn = 1; /* Numerator of best busy factor */ + int bfd = 1; /* Denominator of best busy factor */ + int curn; /* Numerator of current busy factor */ + int curd; /* Denominator of current busy factor */ + + int left; /* left and right are used to compare rational numbers */ + int right; + + /* find the least busy worker */ + worker_record_t *candidate = NULL; + + offset = next_offset; + + /* First try to see if we have available candidate + */ + for (j = 0; j < p->num_of_workers; j++) { + i = (j + offset) % p->num_of_workers; + + /* If the worker is in error state run + * retry on that worker. It will be marked as + * operational if the retry timeout is elapsed. + * The worker might still be unusable, but we try + * anyway. + */ + if (JK_WORKER_IN_ERROR(p->lb_workers[i].s)) { + retry_worker(&p->lb_workers[i], p->s->recover_wait_time, l); + } + /* Take into calculation only the workers that are + * not in error state, stopped or not disabled. + */ + if (JK_WORKER_USABLE(p->lb_workers[i].s)) { + curn = p->lb_workers[i].s->busy; + curd = p->lb_workers[i].s->lb_factor; + + /* If the server is restarted under load there is a bug that causes + * busy to be reset to zero before all the outstanding connections + * finish, they then finally finish. As a result, the busy value + * becomes negative, messing up the busyness load balancing. + * When this bug is fixed, this section can be removed + */ + if (curn < 0) { + jk_log(l, JK_LOG_WARNING, + "busy value is %d for worker %s, resetting it to zero", + curn, p->lb_workers[i].s->name); + p->lb_workers[i].s->busy = 0; + curn = 0; + } + + /* compare rational numbers: (a/b) < (c/d) iff a*d < c*b + */ + left = curn * bfd; + right = bfn * curd; + + if (!candidate || (left < right)) { + candidate = &p->lb_workers[i]; + bfn = curn; + bfd = curd; + next_offset = i + 1; + } + } + } + return candidate; +} + static worker_record_t *find_bysession_route(lb_worker_t *p, const char *name, jk_logger_t *l) @@ -441,6 +512,8 @@ rc = find_best_byrequests(p, l); else if (p->lbmethod == JK_LB_BYTRAFFIC) rc = find_best_bytraffic(p, l); + else if (p->lbmethod == JK_LB_BYBUSYNESS) + rc = find_best_bybusyness(p, l); /* By default use worker name as session route */ if (rc) rc->r = &(rc->s->name[0]); Modified: tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h URL: http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h?rev=386279&r1=386278&r2=386279&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h (original) +++ tomcat/connectors/trunk/jk/native/common/jk_lb_worker.h Wed Mar 15 23:53:27 2006 @@ -39,8 +39,10 @@ #define JK_LB_BYREQUESTS (0) #define JK_LB_BYTRAFFIC (1) +#define JK_LB_BYBUSYNESS (2) #define JK_LB_METHOD_REQUESTS ("Request") #define JK_LB_METHOD_TRAFFIC ("Traffic") +#define JK_LB_METHOD_BUSYNESS ("Busyness") #define JK_LB_LOCK_DEFAULT (0) #define JK_LB_LOCK_PESSIMISTIC (1) #define JK_LB_LM_DEFAULT ("Optimistic") @@ -69,7 +71,7 @@ jk_pool_atom_t buf[TINY_POOL_SIZE]; jk_worker_t worker; - JK_CRIT_SEC cs; + JK_CRIT_SEC cs; /* Shared memory worker data */ jk_shm_worker_t *s; Modified: tomcat/connectors/trunk/jk/native/common/jk_status.c URL: http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_status.c?rev=386279&r1=386278&r2=386279&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_status.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_status.c Wed Mar 15 23:53:27 2006 @@ -90,6 +90,14 @@ NULL }; +static const char *lb_method_type[] = { + JK_LB_METHOD_REQUESTS, + JK_LB_METHOD_TRAFFIC, + JK_LB_METHOD_BUSYNESS, + "unknown", + NULL +}; + #define HEADERS_NO_CACHE "no-cache", "no-cache", NULL static const char *headers_vhtml[] = { @@ -443,7 +451,7 @@ jk_putv(s, "<td>", status_val_bool(lb->s->sticky_session_force), "</td>", NULL); jk_printf(s, "<td>%d</td>", lb->s->retries); - jk_printf(s, "<td>%s</td>", lb->lbmethod == JK_LB_BYREQUESTS ? JK_LB_METHOD_REQUESTS : JK_LB_METHOD_TRAFFIC); + jk_printf(s, "<td>%s</td>", lb_method_type[lb->lbmethod]); jk_printf(s, "<td>%s</td>", lb->lblock == JK_LB_LOCK_DEFAULT ? JK_LB_LM_DEFAULT : JK_LB_LM_PESSIMISTIC); jk_puts(s, "</tr>\n</table>\n<br/>\n"); jk_puts(s, "<table><tr>" Modified: tomcat/connectors/trunk/jk/native/common/jk_util.c URL: http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/native/common/jk_util.c?rev=386279&r1=386278&r2=386279&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_util.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_util.c Wed Mar 15 23:53:27 2006 @@ -770,6 +770,8 @@ return JK_LB_BYTRAFFIC; else if (*v == 'r' || *v == 'R' || *v == '0') return JK_LB_BYREQUESTS; + else if (*v == 'b' || *v == 'B' || *v == '2') + return JK_LB_BYBUSYNESS; else return JK_LB_BYREQUESTS; } Modified: tomcat/connectors/trunk/jk/xdocs/changelog.xml URL: http://svn.apache.org/viewcvs/tomcat/connectors/trunk/jk/xdocs/changelog.xml?rev=386279&r1=386278&r2=386279&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/xdocs/changelog.xml (original) +++ tomcat/connectors/trunk/jk/xdocs/changelog.xml Wed Mar 15 23:53:27 2006 @@ -25,6 +25,10 @@ <br /> <subsection name="Native"> <changelog> + <update> + <bug>36138</bug>: Added Busyness lb method. Patch provided + by Chris Lamprecht. (mturk) + </update> <fix> Fix pessimistic locking mode. The patch correctly handles the burst load, by syncing the access to the shared memory data. (mturk) --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]