--- libapache-mod-jk-1.2.26~/native/common/jk_lb_worker.c 2008-03-10 20:25:34.000000000 +0800 +++ libapache-mod-jk-1.2.26~/native/common/jk_lb_worker.c 2008-03-10 20:25:34.000000000 +0800 @@ -40,8 +40,8 @@ * The load balancing code in this */ -#define JK_WORKER_USABLE(w) ((w)->state != JK_LB_STATE_ERROR && (w)->state != JK_LB_STATE_PROBE && (w)->state != JK_LB_STATE_BUSY && (w)->activation != JK_LB_ACTIVATION_STOPPED && (w)->activation != JK_LB_ACTIVATION_DISABLED) -#define JK_WORKER_USABLE_STICKY(w) ((w)->state != JK_LB_STATE_ERROR && (w)->state != JK_LB_STATE_PROBE && (w)->activation != JK_LB_ACTIVATION_STOPPED) +#define JK_WORKER_USABLE(w) ((w)->state != JK_LB_STATE_ERROR && (w)->state != JK_LB_STATE_PROBE && (w)->state != JK_LB_STATE_BUSY && (w)->activation != JK_LB_ACTIVATION_STOPPED && (w)->activation != JK_LB_ACTIVATION_DISABLED && ((w)->busylimit == 0 || (w)->busy < (w)->busylimit)) +#define JK_WORKER_USABLE_STICKY(w) ((w)->state != JK_LB_STATE_ERROR && (w)->state != JK_LB_STATE_PROBE && (w)->activation != JK_LB_ACTIVATION_STOPPED && ((w)->busylimit == 0 || (w)->busy < (w)->busylimit)) static const char *lb_locking_type[] = { JK_LB_LOCK_TEXT_OPTIMISTIC, @@ -1319,6 +1319,8 @@ JK_SHM_STR_SIZ); p->lb_workers[i].s->lb_factor = jk_get_lb_factor(props, worker_names[i]); + p->lb_workers[i].s->busylimit = + jk_get_lb_worker_busylimit(props, worker_names[i]); if (p->lb_workers[i].s->lb_factor < 1) { p->lb_workers[i].s->lb_factor = 1; } --- libapache-mod-jk-1.2.26~/native/common/jk_shm.h 2007-06-25 02:33:33.000000000 +0800 +++ libapache-mod-jk-1.2.26~/native/common/jk_shm.h 2008-03-10 20:25:34.000000000 +0800 @@ -85,6 +85,7 @@ volatile int state; /* Current lb factor */ volatile int lb_factor; + volatile int busylimit; /* Current lb reciprocal factor */ volatile jk_uint64_t lb_mult; /* Current lb value */ --- libapache-mod-jk-1.2.26~/native/common/jk_status.c 2007-12-17 16:12:54.000000000 +0800 +++ libapache-mod-jk-1.2.26~/native/common/jk_status.c 2008-03-10 20:26:43.000000000 +0800 @@ -210,7 +210,8 @@ " NameType" \ "HostAddr" \ "ActState" \ - "DFM" \ + "DF" \ + "BusyLimitM" \ "VAcc" \ "ErrCERE" \ "WrRdBusyMax" \ @@ -225,6 +226,7 @@ "%s" \ "%d" \ "%d" \ + "%d" \ "%" JK_UINT64_T_FMT "" \ "%" JK_UINT64_T_FMT "" \ "%" JK_UINT64_T_FMT "" \ @@ -1587,6 +1589,7 @@ jk_lb_get_state(wr, l), wr->s->distance, wr->s->lb_factor, + wr->s->busylimit, wr->s->lb_mult, wr->s->lb_value, wr->s->elected, @@ -1619,6 +1622,7 @@ jk_print_xml_att_string(s, 8, "domain", wr->s->domain); jk_print_xml_att_int(s, 8, "distance", wr->s->distance); jk_print_xml_att_string(s, 8, "state", jk_lb_get_state(wr, l)); + jk_print_xml_att_uint32(s, 8, "busylimit", wr->s->busylimit); jk_print_xml_att_uint64(s, 8, "lbmult", wr->s->lb_mult); jk_print_xml_att_uint64(s, 8, "lbvalue", wr->s->lb_value); jk_print_xml_att_uint64(s, 8, "elected", wr->s->elected); @@ -1650,6 +1654,7 @@ jk_printf(s, " domain=\"%s\"", wr->s->domain ? wr->s->domain : ""); jk_printf(s, " distance=%d", wr->s->distance); jk_printf(s, " state=%s", jk_lb_get_state(wr, l)); + jk_printf(s, " busylimit=%" JK_UINT32_T_FMT, wr->s->busylimit); jk_printf(s, " lbmult=%" JK_UINT64_T_FMT, wr->s->lb_mult); jk_printf(s, " lbvalue=%" JK_UINT64_T_FMT, wr->s->lb_value); jk_printf(s, " elected=%" JK_UINT64_T_FMT, wr->s->elected); @@ -1679,6 +1684,7 @@ jk_print_prop_att_string(s, w, wr->s->name, "domain", wr->s->domain); jk_print_prop_att_int(s, w, wr->s->name, "distance", wr->s->distance); jk_print_prop_att_string(s, w, wr->s->name, "state", jk_lb_get_state(wr, l)); + jk_print_prop_att_uint32(s, w, wr->s->name, "busylimit", wr->s->busylimit); jk_print_prop_att_uint64(s, w, wr->s->name, "lbmult", wr->s->lb_mult); jk_print_prop_att_uint64(s, w, wr->s->name, "lbvalue", wr->s->lb_value); jk_print_prop_att_uint64(s, w, wr->s->name, "elected", wr->s->elected); --- libapache-mod-jk-1.2.26~/native/common/jk_util.c 2008-03-10 20:25:34.000000000 +0800 +++ libapache-mod-jk-1.2.26~/native/common/jk_util.c 2008-03-10 20:25:34.000000000 +0800 @@ -119,6 +119,9 @@ #define SESSION_COOKIE ("session_cookie") +#define MAXBUSY ("busylimit") + + #define MAKE_WORKER_PARAM(P) \ strcpy(buf, "worker."); \ strcat(buf, wname); \ @@ -204,6 +207,7 @@ XML_DOCTYPE_OF_WORKER, PROP_PREFIX_OF_WORKER, USER_CASE_OF_WORKER, + MAXBUSY, NULL }; @@ -297,6 +301,7 @@ STATUS_FAIL_OF_WORKER, LIST_PROPERTY_NAME, SESSION_COOKIE, + MAXBUSY, MAINTAIN_PROPERTY_NAME }; @@ -1437,6 +1442,19 @@ return v; } +int jk_get_lb_worker_busylimit(jk_map_t *m, const char *wname) +{ + char buf[1024]; + + if (!m || !wname) { + return -1; + } + + MAKE_WORKER_PARAM(MAXBUSY); + + return jk_map_get_int(m, buf, 0); +} + int jk_get_worker_mount_list(jk_map_t *m, const char *wname, char ***list, unsigned int *num_of_maps) --- libapache-mod-jk-1.2.26~/native/common/jk_util.h 2008-03-10 20:25:34.000000000 +0800 +++ libapache-mod-jk-1.2.26~/native/common/jk_util.h 2008-03-10 20:25:34.000000000 +0800 @@ -127,6 +127,9 @@ const char *jk_get_lb_session_cookie(jk_map_t *m, const char *wname); +int jk_get_lb_worker_busylimit(jk_map_t *m, const char *wname); + + int jk_get_worker_mount_list(jk_map_t *m, const char *wname, char ***list, unsigned int *num_of_maps);