Author: rjung Date: Sun Jan 20 04:49:03 2008 New Revision: 613546 URL: http://svn.apache.org/viewvc?rev=613546&view=rev Log: Add fail_on_status to uri worker map extension attributes. No more attributes planned for now, reply_timeout, activation and fail_on_status seem to be the ones, where context individual configuration could be useful.
Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c tomcat/connectors/trunk/jk/native/common/jk_service.h tomcat/connectors/trunk/jk/native/common/jk_status.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_util.c tomcat/connectors/trunk/jk/native/common/jk_util.h tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Modified: tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-1.3/mod_jk.c Sun Jan 20 04:49:03 2008 @@ -650,6 +650,10 @@ s->extension.activation = ap_palloc(r->pool, e->activation_size * sizeof(int)); memcpy(s->extension.activation, e->activation, e->activation_size * sizeof(int)); } + if (e->fail_on_status_size > 0) { + s->extension.fail_on_status = ap_palloc(r->pool, e->fail_on_status_size * sizeof(int)); + memcpy(s->extension.fail_on_status, e->fail_on_status, e->fail_on_status_size * sizeof(int)); + } } reply_timeout = ap_table_get(r->subprocess_env, "JK_REPLY_TIMEOUT"); if (reply_timeout) { Modified: tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c (original) +++ tomcat/connectors/trunk/jk/native/apache-2.0/mod_jk.c Sun Jan 20 04:49:03 2008 @@ -662,6 +662,10 @@ s->extension.activation = apr_palloc(r->pool, e->activation_size * sizeof(int)); memcpy(s->extension.activation, e->activation, e->activation_size * sizeof(int)); } + if (e->fail_on_status_size > 0) { + s->extension.fail_on_status = apr_palloc(r->pool, e->fail_on_status_size * sizeof(int)); + memcpy(s->extension.fail_on_status, e->fail_on_status, e->fail_on_status_size * sizeof(int)); + } } reply_timeout = apr_table_get(r->subprocess_env, "JK_REPLY_TIMEOUT"); if (reply_timeout) { Modified: tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_ajp_common.c Sun Jan 20 04:49:03 2008 @@ -1602,20 +1602,6 @@ } -static int is_http_status_fail(ajp_worker_t *w, int status) -{ - unsigned int i; - int soft_status = -1 * status; - for (i = 0; i < w->http_status_fail_num; i++) { - if (w->http_status_fail[i] == status) - return 1; - else if (w->http_status_fail[i] == soft_status) - return -1; - } - return 0; -} - - /* * What to do with incoming data (dispatcher) */ @@ -1641,7 +1627,12 @@ return JK_AJP13_ERROR; } r->http_response_status = res.status; - rc = is_http_status_fail(ae->worker, res.status); + if (r->extension.fail_on_status_size > 0) + rc = is_http_status_fail(r->extension.fail_on_status_size, + r->extension.fail_on_status, res.status); + else + rc = is_http_status_fail(ae->worker->http_status_fail_num, + ae->worker->http_status_fail, res.status); if (rc > 0) { JK_TRACE_EXIT(l); return JK_STATUS_FATAL_ERROR; Modified: tomcat/connectors/trunk/jk/native/common/jk_service.h URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_service.h?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_service.h (original) +++ tomcat/connectors/trunk/jk/native/common/jk_service.h Sun Jan 20 04:49:03 2008 @@ -82,6 +82,11 @@ /* activation state overwrites for load balancers */ /* Dynamically allocated array with one entry per lb member. */ int *activation; + /* fail_on_status overwrites */ + /* Number of elements in the array fail_on_status. */ + int fail_on_status_size; + /* Dynamically allocated array with one entry per status. */ + int *fail_on_status; }; typedef struct svc_extension svc_extension_t; Modified: tomcat/connectors/trunk/jk/native/common/jk_status.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_status.c?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_status.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_status.c Sun Jan 20 04:49:03 2008 @@ -209,10 +209,10 @@ #define JK_STATUS_FORM_START "<form method=\"%s\" action=\"%s\">\n" #define JK_STATUS_FORM_HIDDEN_INT "<input type=\"hidden\" name=\"%s\" value=\"%d\"/>\n" #define JK_STATUS_FORM_HIDDEN_STRING "<input type=\"hidden\" name=\"%s\" value=\"%s\"/>\n" -#define JK_STATUS_URI_MAP_TABLE_HEAD "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" -#define JK_STATUS_URI_MAP_TABLE_ROW "<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>\n" -#define JK_STATUS_URI_MAP_TABLE_HEAD2 "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" -#define JK_STATUS_URI_MAP_TABLE_ROW2 "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_HEAD "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_ROW "<tr><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_HEAD2 "<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n" +#define JK_STATUS_URI_MAP_TABLE_ROW2 "<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%d</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n" #define JK_STATUS_SHOW_AJP_CONF_HEAD "<tr>" \ "<th>Type</th>" \ "<th>Host</th><th>Addr</th>" \ @@ -1423,6 +1423,7 @@ uri_worker_map_get_match(uwr, buf, l), uri_worker_map_get_source(uwr, l), uwr->extensions.reply_timeout, + uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-", uwr->extensions.active ? uwr->extensions.active : "-", uwr->extensions.disabled ? uwr->extensions.disabled : "-", uwr->extensions.stopped ? uwr->extensions.stopped : "-"); @@ -1432,6 +1433,7 @@ uri_worker_map_get_match(uwr, buf, l), uri_worker_map_get_source(uwr, l), uwr->extensions.reply_timeout, + uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : "-", uwr->extensions.active ? uwr->extensions.active : "-", uwr->extensions.disabled ? uwr->extensions.disabled : "-", uwr->extensions.stopped ? uwr->extensions.stopped : "-"); @@ -1445,6 +1447,7 @@ jk_print_xml_att_string(s, 8, "type", uri_worker_map_get_match(uwr, buf, l)); jk_print_xml_att_string(s, 8, "source", uri_worker_map_get_source(uwr, l)); jk_print_xml_att_int(s, 8, "reply_timeout", uwr->extensions.reply_timeout); + jk_print_xml_att_string(s, 8, "fail_on_status", uwr->extensions.fail_on_status_str); jk_print_xml_att_string(s, 8, "active", uwr->extensions.active); jk_print_xml_att_string(s, 8, "disabled", uwr->extensions.disabled); jk_print_xml_att_string(s, 8, "stopped", uwr->extensions.stopped); @@ -1459,6 +1462,7 @@ jk_printf(s, " type=\"%s\"", uri_worker_map_get_match(uwr, buf, l)); jk_printf(s, " source=\"%s\"", uri_worker_map_get_source(uwr, l)); jk_printf(s, " reply_timeout=\"%d\"", uwr->extensions.reply_timeout); + jk_printf(s, " fail_on_status=\"%s\"", uwr->extensions.fail_on_status_str ? uwr->extensions.fail_on_status_str : ""); jk_printf(s, " active=\"%s\"", uwr->extensions.active); jk_printf(s, " disabled=\"%s\"", uwr->extensions.disabled); jk_printf(s, " stopped=\"%s\"", uwr->extensions.stopped); @@ -1471,6 +1475,7 @@ jk_print_prop_item_string(s, w, worker, "map", count, "type", uri_worker_map_get_match(uwr, buf, l)); jk_print_prop_item_string(s, w, worker, "map", count, "source", uri_worker_map_get_source(uwr, l)); jk_print_prop_item_int(s, w, worker, "map", count, "reply_timeout", uwr->extensions.reply_timeout); + jk_print_prop_item_string(s, w, worker, "map", count, "fail_on_status", uwr->extensions.fail_on_status_str); jk_print_prop_item_string(s, w, worker, "map", count, "active", uwr->extensions.active); jk_print_prop_item_string(s, w, worker, "map", count, "disabled", uwr->extensions.disabled); jk_print_prop_item_string(s, w, worker, "map", count, "stopped", uwr->extensions.stopped); @@ -1523,10 +1528,10 @@ jk_puts(s, "]</h3><table>\n"); if (has_server_iterator) jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD2, - "Server", "URI", "Match Type", "Source", "Reply Timeout", "Active", "Disabled", "Stopped"); + "Server", "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped"); else jk_printf(s, JK_STATUS_URI_MAP_TABLE_HEAD, - "URI", "Match Type", "Source", "Reply Timeout", "Active", "Disabled", "Stopped"); + "URI", "Match Type", "Source", "Reply Timeout", "Fail on Status", "Active", "Disabled", "Stopped"); } count = 0; if (has_server_iterator) { 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?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.c Sun Jan 20 04:49:03 2008 @@ -39,10 +39,11 @@ #define JK_STRNCMP strncmp #endif -#define JK_UWMAP_EXTENSION_REPLY_TIMEOUT "reply_timeout=" -#define JK_UWMAP_EXTENSION_ACTIVE "active=" -#define JK_UWMAP_EXTENSION_DISABLED "disabled=" -#define JK_UWMAP_EXTENSION_STOPPED "stopped=" +#define JK_UWMAP_EXTENSION_REPLY_TIMEOUT "reply_timeout=" +#define JK_UWMAP_EXTENSION_ACTIVE "active=" +#define JK_UWMAP_EXTENSION_DISABLED "disabled=" +#define JK_UWMAP_EXTENSION_STOPPED "stopped=" +#define JK_UWMAP_EXTENSION_FAIL_ON_STATUS "fail_on_status=" #define IND_THIS(x) ((x)[uw_map->index]) #define IND_NEXT(x) ((x)[(uw_map->index+1) % 2]) @@ -391,6 +392,63 @@ } +static void extract_fail_on_status(jk_uri_worker_map_t *uw_map, + uri_worker_record_t *uwr, + jk_logger_t *l) +{ + unsigned int i; + int j; + int cnt = 1; + jk_pool_t *p; + char *status; +#ifdef _MT_CODE_PTHREAD + char *lasts; +#endif + + JK_TRACE_ENTER(l); + + for (i=0; i<strlen(uwr->extensions.fail_on_status_str); i++) { + if (uwr->extensions.fail_on_status_str[i] == ',' || + uwr->extensions.fail_on_status_str[i] == ' ') + cnt++; + } + uwr->extensions.fail_on_status_size = cnt; + + if (uwr->source_type == SOURCE_TYPE_URIMAP) + p = &IND_NEXT(uw_map->p_dyn); + else + p = &uw_map->p; + uwr->extensions.fail_on_status = (int *)jk_pool_alloc(p, + uwr->extensions.fail_on_status_size * sizeof(int)); + if (!uwr->extensions.fail_on_status) { + jk_log(l, JK_LOG_ERROR, + "can't alloc extensions fail_on_status list"); + return; + } else if (JK_IS_DEBUG_LEVEL(l)) + jk_log(l, JK_LOG_DEBUG, + "Allocated fail_on_status array of size %d for worker %s", + uwr->extensions.fail_on_status, uwr->worker_name); + + + for (j=0; j<uwr->extensions.activation_size; j++) { + uwr->extensions.activation[j] = JK_LB_ACTIVATION_UNSET; + } + + cnt = 0; +#ifdef _MT_CODE_PTHREAD + for (status = strtok_r(uwr->extensions.fail_on_status_str, ", ", &lasts); + status; status = strtok_r(NULL, "&", &lasts)) { +#else + for (status = strtok(uwr->extensions.fail_on_status_str, ", "); status; status = strtok(NULL, ", ")) { +#endif + uwr->extensions.fail_on_status[cnt] = atoi(status); + cnt++; + } + + JK_TRACE_EXIT(l); + +} + void uri_worker_map_ext(jk_uri_worker_map_t *uw_map, jk_logger_t *l) { unsigned int i; @@ -458,6 +516,9 @@ JK_UWMAP_EXTENSION_STOPPED " for %s ignored", uwr->worker_name, uwr->extensions.stopped); } + else if (uwr->extensions.fail_on_status_str) { + extract_fail_on_status(uw_map, uwr, l); + } } uw_map->index = (uw_map->index + 1) % 2; jk_reset_pool(&(IND_NEXT(uw_map->p_dyn))); @@ -530,6 +591,9 @@ uwr->extensions.stopped = NULL; uwr->extensions.activation_size = 0; uwr->extensions.activation = NULL; + uwr->extensions.fail_on_status_size = 0; + uwr->extensions.fail_on_status = NULL; + uwr->extensions.fail_on_status_str = NULL; #ifdef _MT_CODE_PTHREAD param = strtok_r(w, ";", &lasts); @@ -568,6 +632,14 @@ JK_UWMAP_EXTENSION_STOPPED); else uwr->extensions.stopped = param + strlen(JK_UWMAP_EXTENSION_STOPPED); + } + else if (!strncmp(param, JK_UWMAP_EXTENSION_FAIL_ON_STATUS, strlen(JK_UWMAP_EXTENSION_FAIL_ON_STATUS))) { + if (uwr->extensions.fail_on_status_str) + jk_log(l, JK_LOG_WARNING, + "extension '%s' in uri worker map only allowed once", + JK_UWMAP_EXTENSION_ACTIVE); + else + uwr->extensions.fail_on_status_str = param + strlen(JK_UWMAP_EXTENSION_FAIL_ON_STATUS); } else { jk_log(l, JK_LOG_WARNING, 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?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h (original) +++ tomcat/connectors/trunk/jk/native/common/jk_uri_worker_map.h Sun Jan 20 04:49:03 2008 @@ -82,6 +82,13 @@ char *active; char *disabled; char *stopped; + /* fail_on_status overwrites */ + /* Number of elements in the array fail_on_status. */ + int fail_on_status_size; + /* Dynamically allocated array with one entry per status. */ + int *fail_on_status; + /* Temporary storage for the original extension strings. */ + char *fail_on_status_str; }; typedef struct rule_extension rule_extension_t; Modified: tomcat/connectors/trunk/jk/native/common/jk_util.c URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_util.c?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_util.c (original) +++ tomcat/connectors/trunk/jk/native/common/jk_util.c Sun Jan 20 04:49:03 2008 @@ -1760,6 +1760,20 @@ return JK_FALSE; } +int is_http_status_fail(unsigned int http_status_fail_num, + int *http_status_fail, int status) +{ + unsigned int i; + int soft_status = -1 * status; + for (i = 0; i < http_status_fail_num; i++) { + if (http_status_fail[i] == status) + return 1; + else if (http_status_fail[i] == soft_status) + return -1; + } + return 0; +} + char **jk_parse_sysprops(jk_pool_t *p, const char *sysprops) { char **rc = NULL; Modified: tomcat/connectors/trunk/jk/native/common/jk_util.h URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/native/common/jk_util.h?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/native/common/jk_util.h (original) +++ tomcat/connectors/trunk/jk/native/common/jk_util.h Sun Jan 20 04:49:03 2008 @@ -206,8 +206,10 @@ int jk_get_worker_fail_on_status(jk_map_t *m, const char *wname, int *list, unsigned int list_size); - int jk_get_worker_user_case_insensitive(jk_map_t *m, const char *wname); + +int is_http_status_fail(unsigned int http_status_fail_num, + int *http_status_fail, int status); #define TC32_BRIDGE_TYPE 32 #define TC33_BRIDGE_TYPE 33 Modified: tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml URL: http://svn.apache.org/viewvc/tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml?rev=613546&r1=613545&r2=613546&view=diff ============================================================================== --- tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml (original) +++ tomcat/connectors/trunk/jk/xdocs/miscellaneous/changelog.xml Sun Jan 20 04:49:03 2008 @@ -44,8 +44,9 @@ <subsection name="Native"> <changelog> <update> - URI Map: Add extension attribute parsing. - First uses are reply_timeout and activation status per mount. + URI Map: Add extension attributes to uri worker map. + Allowed are reply_timeout, active/disabled/stopped + and fail_on_status. Usage currently only implemented for httpd. (rjung) </update> <fix> --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]