Author: rjung Date: Mon Mar 7 16:40:20 2011 New Revision: 1078846 URL: http://svn.apache.org/viewvc?rev=1078846&view=rev Log: Forward worker activation state in load balancer as request attribute "JK_LB_ACTIVATION".
Possible values are "ACT" (active), "DIS" (disabled) and "STP" (stopped). Docs update will follow. This line, and those below, will be ignored-- M xdocs/miscellaneous/changelog.xml M native/common/jk_service.h M native/common/jk_util.c M native/common/jk_ajp_common.h M native/common/jk_ajp_common.c M native/common/jk_lb_worker.c Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c tomcat/jk/trunk/native/common/jk_ajp_common.h tomcat/jk/trunk/native/common/jk_lb_worker.c tomcat/jk/trunk/native/common/jk_service.h tomcat/jk/trunk/native/common/jk_util.c tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Modified: tomcat/jk/trunk/native/common/jk_ajp_common.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.c?rev=1078846&r1=1078845&r2=1078846&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_ajp_common.c (original) +++ tomcat/jk/trunk/native/common/jk_ajp_common.c Mon Mar 7 16:40:20 2011 @@ -599,6 +599,29 @@ static int ajp_marshal_into_msgb(jk_msg_ } } + /* Forward activation information from the load balancer. + * It can be used by the backend to deny access by requests, + * which come with a session id but for an invalid session. + * Such requests get forwarded to backends even if they + * are disabled" in the load balancer, because the balancer + * does not know, which sessions are valid. + * If the backend can check, that is was "disabled" it can + * delete the session cookie and respond with a self-referential + * redirect. The new request will then be balanced to some + * other node that is not disabled. + */ + { + if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) || + jk_b_append_string(msg, SC_A_JK_LB_ACTIVATION) || + jk_b_append_string(msg, s->activation)) { + jk_log(l, JK_LOG_ERROR, + "failed appending the activation state %s", + s->activation); + JK_TRACE_EXIT(l); + return JK_FALSE; + } + } + if (s->num_attributes > 0) { for (i = 0; i < s->num_attributes; i++) { if (jk_b_append_byte(msg, SC_A_REQ_ATTRIBUTE) || Modified: tomcat/jk/trunk/native/common/jk_ajp_common.h URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_ajp_common.h?rev=1078846&r1=1078845&r2=1078846&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_ajp_common.h (original) +++ tomcat/jk/trunk/native/common/jk_ajp_common.h Mon Mar 7 16:40:20 2011 @@ -79,6 +79,15 @@ extern "C" #define SC_A_REQ_REMOTE_PORT ("AJP_REMOTE_PORT") /* + * JK public request attributes + * + * Activation state of the worker in the load balancer. + * Can be any of the JK_LB_ACTIVATION_TEXT_* strings + * from jk_lb_worker.h. + */ +#define SC_A_JK_LB_ACTIVATION ("JK_LB_ACTIVATION") + +/* * Request methods, coded as numbers instead of strings. * The list of methods was taken from Section 5.1.1 of RFC 2616, * RFC 2518, the ACL IETF draft, and the DeltaV IESG Proposed Standard. Modified: tomcat/jk/trunk/native/common/jk_lb_worker.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_lb_worker.c?rev=1078846&r1=1078845&r2=1078846&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_lb_worker.c (original) +++ tomcat/jk/trunk/native/common/jk_lb_worker.c Mon Mar 7 16:40:20 2011 @@ -895,11 +895,11 @@ static int find_best_worker(jk_ws_servic return rc; } -static lb_sub_worker_t *get_most_suitable_worker(jk_ws_service_t *s, - lb_worker_t *p, - char *sessionid, - int *states, - jk_logger_t *l) +static int get_most_suitable_worker(jk_ws_service_t *s, + lb_worker_t *p, + char *sessionid, + int *states, + jk_logger_t *l) { int rc = -1; int r; @@ -917,12 +917,12 @@ static lb_sub_worker_t *get_most_suitabl if (JK_WORKER_USABLE_STICKY(states[0], activation)) { if (activation != JK_LB_ACTIVATION_DISABLED) { JK_TRACE_EXIT(l); - return p->lb_workers; + return 0; } } else { JK_TRACE_EXIT(l); - return NULL; + return -1; } } if (p->lblock == JK_LB_LOCK_PESSIMISTIC) @@ -969,7 +969,7 @@ static lb_sub_worker_t *get_most_suitabl "found worker %s (%s) for route %s and partial sessionid %s", wr->name, wr->route, session_route, sessionid); JK_TRACE_EXIT(l); - return wr; + return rc; } session_route = strchr(session_route, '.'); } @@ -987,7 +987,7 @@ static lb_sub_worker_t *get_most_suitabl "all workers are in error state for session %s", session); JK_TRACE_EXIT(l); - return NULL; + return -1; } } rc = find_best_worker(s, p, states, l); @@ -1003,10 +1003,10 @@ static lb_sub_worker_t *get_most_suitabl "found best worker %s (%s) using method '%s'", wr->name, wr->route, jk_lb_get_method(p, l)); JK_TRACE_EXIT(l); - return wr; + return rc; } JK_TRACE_EXIT(l); - return NULL; + return -1; } static void lb_add_log_items(jk_ws_service_t *s, @@ -1121,7 +1121,6 @@ static int JK_METHOD service(jk_endpoint p->worker->sticky_session, sessionid ? sessionid : "empty"); while (recoverable == JK_TRUE) { - lb_sub_worker_t *rec; if (attempt >= num_of_workers) { retry++; if (retry >= p->worker->retries) { @@ -1142,20 +1141,23 @@ static int JK_METHOD service(jk_endpoint } attempt = 0; } - rec = 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 - * that worker already failed. - */ - if (rec) { + i = get_most_suitable_worker(s, p->worker, sessionid, p->states, l); + if (i >= 0) { int r; int is_service_error = JK_HTTP_OK; + lb_sub_worker_t *rec = &(p->worker->lb_workers[i]); ajp_worker_t *aw = (ajp_worker_t *)rec->worker->worker_private; jk_endpoint_t *end = NULL; - + int activation = s->extension.activation ? + s->extension.activation[i] : + JK_LB_ACTIVATION_UNSET; + if (activation == JK_LB_ACTIVATION_UNSET) + activation = rec->activation; if (!s->route) s->route = rec->route; + s->activation = jk_lb_get_activation_direct(activation, l); prec = rec; if (JK_IS_DEBUG_LEVEL(l)) @@ -1423,7 +1425,7 @@ static int JK_METHOD service(jk_endpoint } } else { - /* NULL record, no more workers left ... */ + /* No more workers left ... */ if (!was_forced) { int nf; /* Force recovery only once. Modified: tomcat/jk/trunk/native/common/jk_service.h URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_service.h?rev=1078846&r1=1078845&r2=1078846&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_service.h (original) +++ tomcat/jk/trunk/native/common/jk_service.h Mon Mar 7 16:40:20 2011 @@ -218,6 +218,12 @@ struct jk_ws_service */ const char *route; + /* + * Activation state of the worker in the load balancer. + * Will be forwarded as a request attribute. + */ + const char *activation; + /* Temp solution for auth. For native1 it'll be sent on each request, if an option is present. For native2 it'll be sent with the first request. On java side, both cases will work. For tomcat3.2 or Modified: tomcat/jk/trunk/native/common/jk_util.c URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/native/common/jk_util.c?rev=1078846&r1=1078845&r2=1078846&view=diff ============================================================================== --- tomcat/jk/trunk/native/common/jk_util.c (original) +++ tomcat/jk/trunk/native/common/jk_util.c Mon Mar 7 16:40:20 2011 @@ -2068,6 +2068,7 @@ void jk_init_ws_service(jk_ws_service_t s->attributes_values = NULL; s->num_attributes = 0; s->route = NULL; + s->activation = JK_LB_ACTIVATION_ACTIVE; s->secret = NULL; s->reco_buf = NULL; s->reco_status = RECO_NONE; Modified: tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml?rev=1078846&r1=1078845&r2=1078846&view=diff ============================================================================== --- tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/jk/trunk/xdocs/miscellaneous/changelog.xml Mon Mar 7 16:40:20 2011 @@ -45,6 +45,11 @@ <subsection name="Native"> <changelog> <add> + LB: Forward worker activation state as request attribute + "JK_LB_ACTIVATION". Possible values are "ACT" (active), + "DIS" (disabled) and "STP" (stopped). (rjung) + </add> + <add> LB: Add support for versioned webapps in Tomcat by accepting multiple occurances of the route separator character '.' in the session id. (rjung) @@ -52,7 +57,7 @@ <fix> <bug>41263</bug>: Support Servlet API getRemotePort(). Works for Tomcat 5.5.28, 6.0.20 and 7.0.0 and Apache and ISAPI - plugins. + plugins. (rjung) </fix> <fix> <bug>50363</bug>: IIS: Prevent chunk encoding of empty message --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org