You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by rj...@apache.org on 2006/11/22 17:14:55 UTC

svn commit: r478210 - in /tomcat/connectors/trunk/jk/native/common: jk_ajp14_worker.c jk_uri_worker_map.c jk_uri_worker_map.h jk_worker.c

Author: rjung
Date: Wed Nov 22 08:14:54 2006
New Revision: 478210

URL: http://svn.apache.org/viewvc?view=rev&rev=478210
Log:
Adding a source type to the mapping rules.
The different sources (worker.properties, JkMount,
uriworkermap and ajp14) might need differences
in their life cycle.
The first such case is reloading of the uriworkermap file.
We want to be able to completely reload the mappings in the file,
so we need to know, which of the old mappings
have been read from the file.
The new implementation now deletes all entries from uriworkermap
during reload. The old one continuously added the entries during reload.

Modified:
    tomcat/connectors/trunk/jk/native/common/jk_ajp14_worker.c
    tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
    tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h
    tomcat/connectors/trunk/jk/native/common/jk_worker.c

Modified: tomcat/connectors/trunk/jk/native/common/jk_ajp14_worker.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_ajp14_worker.c?view=diff&rev=478210&r1=478209&r2=478210
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_ajp14_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_ajp14_worker.c Wed Nov 22 08:14:54 2006
@@ -112,7 +112,7 @@
                    "worker %s will handle uri %s in context %s [%s]",
                    ae->worker->name, ci->uris[j], ci->cbase, buf);
 
-            uri_worker_map_add(we->uri_to_worker, buf, ae->worker->name, l);
+            uri_worker_map_add(we->uri_to_worker, buf, ae->worker->name, SOURCE_TYPE_DISCOVER, l);
         }
     }
 
@@ -122,11 +122,11 @@
 #else
 
     uri_worker_map_add(we->uri_to_worker, "/examples/servlet/*",
-                       ae->worker->name, l);
+                       ae->worker->name, SOURCE_TYPE_DISCOVER, l);
     uri_worker_map_add(we->uri_to_worker, "/examples/*.jsp", ae->worker->name,
-                       l);
+                       SOURCE_TYPE_DISCOVER, l);
     uri_worker_map_add(we->uri_to_worker, "/examples/*.gif", ae->worker->name,
-                       l);
+                       SOURCE_TYPE_DISCOVER, l);
 
 #endif
 

Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c?view=diff&rev=478210&r1=478209&r2=478210
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c Wed Nov 22 08:14:54 2006
@@ -38,6 +38,22 @@
 #endif
 
 
+static const char *uri_worker_map_source_type[] = {
+    "unknown",
+    SOURCE_TYPE_TEXT_WORKERDEF,
+    SOURCE_TYPE_TEXT_JKMOUNT,
+    SOURCE_TYPE_TEXT_URIMAP,
+    SOURCE_TYPE_TEXT_DISCOVER,
+    NULL
+};
+
+
+/* Return the string representation of the balance worker state */
+const char *uri_worker_map_get_source(uri_worker_record_t *uwr, jk_logger_t *l)
+{
+    return uri_worker_map_source_type[uwr->source_type];
+}
+
 /*
  * Given context uri, count the number of path tokens.
  *
@@ -79,7 +95,10 @@
     /* given the same number of URI tokens, use character
      * length as a tie breaker
      */
-    return ((int)e2->context_len - (int)e1->context_len);
+    if(e2->context_len != e1->context_len)
+        return ((int)e2->context_len - (int)e1->context_len);
+
+    return ((int)e2->source_type - (int)e1->source_type);
 }
 
 static void worker_qsort(jk_uri_worker_map_t *uw_map)
@@ -218,8 +237,41 @@
 }
 
 
+/*
+ * Delete all entries of a given source type
+ */
+
+int uri_worker_map_clear(jk_uri_worker_map_t *uw_map,
+                         unsigned int source_type, jk_logger_t *l)
+{
+    uri_worker_record_t *uwr = NULL;
+    unsigned int i;
+    unsigned int j;
+
+    JK_TRACE_ENTER(l);
+
+    /* Find if duplicate entry */
+    for (i = 0; i < uw_map->size; i++) {
+        uwr = uw_map->maps[i];
+        if (uwr->source_type == source_type) {
+            jk_log(l, JK_LOG_DEBUG,
+                   "deleting map rule '%s=%s' source '%s'",
+                   uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
+            for (j = i; j < uw_map->size-1; j++)
+                uw_map->maps[j] = uw_map->maps[j+1];
+            uw_map->size--;
+        }
+    }
+
+    JK_TRACE_EXIT(l);
+    return JK_TRUE;
+}
+
+
+
 int uri_worker_map_add(jk_uri_worker_map_t *uw_map,
-                       const char *puri, const char *worker, jk_logger_t *l)
+                       const char *puri, const char *worker,
+                       unsigned int source_type, jk_logger_t *l)
 {
     uri_worker_record_t *uwr = NULL;
     char *uri;
@@ -241,34 +293,6 @@
         puri++;
     }
 
-    /* Find if duplicate entry */
-    for (i = 0; i < uw_map->size; i++) {
-        uwr = uw_map->maps[i];
-        if (strcmp(uwr->uri, puri) == 0) {
-            if ((uwr->match_type & MATCH_TYPE_NO_MATCH) == (match_type & MATCH_TYPE_NO_MATCH)) {
-                /* Update disabled flag */
-                if (match_type & MATCH_TYPE_DISABLED)
-                    uwr->match_type |= MATCH_TYPE_DISABLED;
-                else
-                    uwr->match_type &= ~MATCH_TYPE_DISABLED;
-                if (strcmp(uwr->worker_name, worker) == 0) {
-                    jk_log(l, JK_LOG_DEBUG,
-                           "map rule %s=%s already exists",
-                           puri, worker);
-                    JK_TRACE_EXIT(l);
-                    return JK_TRUE;
-                }
-                else {
-                    jk_log(l, JK_LOG_DEBUG,
-                           "changing map rule %s=%s ",
-                           puri, worker);
-                    uwr->worker_name = jk_pool_strdup(&uw_map->p, worker);
-                    JK_TRACE_EXIT(l);
-                    return JK_TRUE;
-                }
-            }
-        }
-    }
     if (uri_worker_map_realloc(uw_map) == JK_FALSE) {
         JK_TRACE_EXIT(l);
         return JK_FALSE;
@@ -291,6 +315,11 @@
     }
 
     if (*uri == '/') {
+        uwr->uri = uri;
+        uwr->context = uri;
+        uwr->worker_name = jk_pool_strdup(&uw_map->p, worker);
+        uwr->context_len = strlen(uwr->context);
+        uwr->source_type = source_type;
         if (strchr(uri, '*') ||
             strchr(uri, '?')) {
             /* Something like
@@ -299,21 +328,17 @@
              */
             match_type |= MATCH_TYPE_WILDCHAR_PATH;
             jk_log(l, JK_LOG_DEBUG,
-                    "wildchar rule %s=%s was added",
-                    uri, worker);
+                   "wildchar rule '%s=%s' source '%s' was added",
+                   uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
 
         }
         else {
             /* Something like:  JkMount /login/j_security_check ajp13 */
             match_type |= MATCH_TYPE_EXACT;
             jk_log(l, JK_LOG_DEBUG,
-                   "exact rule %s=%s was added",
-                   uri, worker);
+                   "exact rule '%s=%s' source '%s' was added",
+                   uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
         }
-        uwr->uri = uri;
-        uwr->context = uri;
-        uwr->worker_name = jk_pool_strdup(&uw_map->p, worker);
-        uwr->context_len = strlen(uwr->context);
     }
     else {
         /*
@@ -323,7 +348,7 @@
          * not arrive here when using Apache.
          */
         jk_log(l, JK_LOG_ERROR,
-               "invalid context %s",
+               "invalid context '%s': does not begin with '/'",
                uri);
         JK_TRACE_EXIT(l);
         return JK_FALSE;
@@ -382,7 +407,7 @@
                     s = strchr(r, '|');
                     *(s++) = '\0';
                     /* Add first mapping */
-                    if (!uri_worker_map_add(uw_map, r, w, l)) {
+                    if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_JKMOUNT, l)) {
                         jk_log(l, JK_LOG_ERROR,
                         "invalid mapping rule %s->%s", r, w);
                         rc = JK_FALSE;
@@ -391,14 +416,14 @@
                         *(s - 1) = *s;
                     *(s - 1) = '\0';
                     /* add second mapping */
-                    if (!uri_worker_map_add(uw_map, r, w, l)) {
+                    if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_JKMOUNT, l)) {
                         jk_log(l, JK_LOG_ERROR,
                                "invalid mapping rule %s->%s", r, w);
                         rc = JK_FALSE;
                     }
                     free(r);
                 }
-                else if (!uri_worker_map_add(uw_map, u, w, l)) {
+                else if (!uri_worker_map_add(uw_map, u, w, SOURCE_TYPE_JKMOUNT, l)) {
                     jk_log(l, JK_LOG_ERROR,
                            "invalid mapping rule %s->%s",
                            u, w);
@@ -449,8 +474,8 @@
 #endif
                                ) == 0) {
                     jk_log(l, JK_LOG_DEBUG,
-                           "Found a no match %s -> %s",
-                           uwr->worker_name, uwr->context);
+                           "Found a wildchar no match '%s=%s' source '%s'",
+                           uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
                     JK_TRACE_EXIT(l);
                     return JK_TRUE;
              }
@@ -459,8 +484,8 @@
             if (strlen(uri) == uwr->context_len) {
                 if (JK_IS_DEBUG_LEVEL(l))
                     jk_log(l, JK_LOG_DEBUG,
-                            "Found an exact no match %s -> %s",
-                            uwr->worker_name, uwr->context);
+                           "Found an exact no match '%s=%s' source '%s'",
+                           uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
                 JK_TRACE_EXIT(l);
                 return JK_TRUE;
             }
@@ -525,7 +550,8 @@
             continue;
 
         if (JK_IS_DEBUG_LEVEL(l))
-            jk_log(l, JK_LOG_DEBUG, "Attempting to map context URI '%s'", uwr->uri);
+            jk_log(l, JK_LOG_DEBUG, "Attempting to map context URI '%s=%s' source '%s'",
+                   uwr->context, uwr->worker_name, uri_worker_map_get_source(uwr, l));
 
         if (uwr->match_type & MATCH_TYPE_WILDCHAR_PATH) {
             const char *wname;
@@ -540,8 +566,8 @@
                     wname = uwr->worker_name;
                     if (JK_IS_DEBUG_LEVEL(l))
                         jk_log(l, JK_LOG_DEBUG,
-                               "Found a wildchar match %s -> %s",
-                               uwr->worker_name, uwr->context);
+                               "Found a wildchar match '%s=%s'",
+                               uwr->context, uwr->worker_name);
                     JK_TRACE_EXIT(l);
                     rv = wname;
                     goto cleanup;
@@ -551,8 +577,8 @@
             if (strlen(url) == uwr->context_len) {
                 if (JK_IS_DEBUG_LEVEL(l))
                     jk_log(l, JK_LOG_DEBUG,
-                           "Found an exact match %s -> %s",
-                           uwr->worker_name, uwr->context);
+                           "Found an exact match '%s=%s'",
+                           uwr->context, uwr->worker_name);
                 JK_TRACE_EXIT(l);
                 rv = uwr->worker_name;
                 goto cleanup;
@@ -585,6 +611,10 @@
     if (jk_map_read_properties(map, uw_map->fname,
                                &uw_map->modified, l)) {
         int i;
+        if (JK_IS_DEBUG_LEVEL(l))
+            jk_log(l, JK_LOG_DEBUG,
+                   "Reloading urimaps from %s", uw_map->fname);
+        uri_worker_map_clear(uw_map, SOURCE_TYPE_URIMAP, l);
         for (i = 0; i < jk_map_size(map); i++) {
             const char *u = jk_map_name_at(map, i);
             const char *w = jk_map_value_at(map, i);
@@ -600,7 +630,7 @@
                 s = strchr(r, '|');
                 *(s++) = '\0';
                 /* Add first mapping */
-                if (!uri_worker_map_add(uw_map, r, w, l)) {
+                if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_URIMAP, l)) {
                     jk_log(l, JK_LOG_ERROR,
                     "invalid mapping rule %s->%s", r, w);
                 }
@@ -608,13 +638,13 @@
                    *(s - 1) = *s;
                 *(s - 1) = '\0';
                 /* add second mapping */
-                if (!uri_worker_map_add(uw_map, r, w, l)) {
+                if (!uri_worker_map_add(uw_map, r, w, SOURCE_TYPE_URIMAP, l)) {
                     jk_log(l, JK_LOG_ERROR,
                     "invalid mapping rule %s->%s", r, w);
                 }
                 free(r);
             }
-            else if (!uri_worker_map_add(uw_map, u, w, l)) {
+            else if (!uri_worker_map_add(uw_map, u, w, SOURCE_TYPE_URIMAP, l)) {
                 jk_log(l, JK_LOG_ERROR,
                        "invalid mapping rule %s->%s",
                        u, w);
@@ -666,4 +696,3 @@
     }
     return JK_TRUE;
 }
-

Modified: tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h?view=diff&rev=478210&r1=478209&r2=478210
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h Wed Nov 22 08:14:54 2006
@@ -62,6 +62,15 @@
 #define MATCH_TYPE_STOPPED          0x4000
  */
 
+#define SOURCE_TYPE_WORKERDEF       0x0001
+#define SOURCE_TYPE_JKMOUNT         0x0002
+#define SOURCE_TYPE_URIMAP          0x0003
+#define SOURCE_TYPE_DISCOVER        0x0004
+#define SOURCE_TYPE_TEXT_WORKERDEF  ("worker definition")
+#define SOURCE_TYPE_TEXT_JKMOUNT    ("JkMount")
+#define SOURCE_TYPE_TEXT_URIMAP     ("uriworkermap")
+#define SOURCE_TYPE_TEXT_DISCOVER   ("ajp14")
+
 #define JK_MAX_URI_LEN              4095
 struct uri_worker_record
 {
@@ -77,6 +86,9 @@
     /* Match type */
     unsigned int match_type;
 
+    /* Definition source type */
+    unsigned int source_type;
+
     /* char length of the context */
     size_t context_len;
 };
@@ -112,6 +124,8 @@
 };
 typedef struct jk_uri_worker_map jk_uri_worker_map_t;
 
+const char *uri_worker_map_get_source(uri_worker_record_t *uwr, jk_logger_t *l);
+
 int uri_worker_map_alloc(jk_uri_worker_map_t **uw_map,
                          jk_map_t *init_data, jk_logger_t *l);
 
@@ -121,7 +135,8 @@
                         jk_map_t *init_data, jk_logger_t *l);
 
 int uri_worker_map_add(jk_uri_worker_map_t *uw_map,
-                       const char *puri, const char *pworker, jk_logger_t *l);
+                       const char *puri, const char *worker,
+                       unsigned int source_type, jk_logger_t *l);
 
 const char *map_uri_to_worker(jk_uri_worker_map_t *uw_map,
                               const char *uri, jk_logger_t *l);

Modified: tomcat/connectors/trunk/jk/native/common/jk_worker.c
URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_worker.c?view=diff&rev=478210&r1=478209&r2=478210
==============================================================================
--- tomcat/connectors/trunk/jk/native/common/jk_worker.c (original)
+++ tomcat/connectors/trunk/jk/native/common/jk_worker.c Wed Nov 22 08:14:54 2006
@@ -179,7 +179,7 @@
                             "mounting %s to worker %s",
                             map_names[i], name);
                 if (uri_worker_map_add(we->uri_to_worker, map_names[i],
-                                       name, l) == JK_FALSE) {
+                                       name, SOURCE_TYPE_WORKERDEF, l) == JK_FALSE) {
                     w->destroy(&w, l);
                     jk_log(l, JK_LOG_ERROR,
                            "validate failed for %s", name);



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org