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

Reply via email to