mturk 2004/08/03 10:18:47 Modified: ajp/proxy mod_proxy.c Log: Add BalanceMember directive. Revision Changes Path 1.7 +126 -1 jakarta-tomcat-connectors/ajp/proxy/mod_proxy.c Index: mod_proxy.c =================================================================== RCS file: /home/cvs/jakarta-tomcat-connectors/ajp/proxy/mod_proxy.c,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- mod_proxy.c 3 Aug 2004 16:03:03 -0000 1.6 +++ mod_proxy.c 3 Aug 2004 17:18:47 -0000 1.7 @@ -1027,6 +1027,130 @@ return NULL; } +static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg) +{ + server_rec *s = cmd->server; + proxy_server_conf *conf = + ap_get_module_config(s->module_config, &proxy_module); + struct proxy_balancer *balancer, *balancers; + proxy_worker *worker, *workers; + proxy_runtime_worker *runtime; + char *path = NULL; + char *name = NULL; + char *args = apr_pstrdup(cmd->pool, arg); + char *word; + apr_table_t *params = apr_table_make(cmd->pool, 5); + const apr_array_header_t *arr; + const apr_table_entry_t *elts; + int i; + + if (cmd->path) + path = apr_pstrdup(cmd->pool, cmd->path); + while (*args) { + word = ap_getword_conf(cmd->pool, &args); + if (!path) + path = word; + else if (!name) + name = word; + else { + char *val = strchr(word, '='); + if (!val) + return "Invalid BalancerMember parameter. Paramet must be in the form key=value"; + else + *val++ = '\0'; + apr_table_setn(params, word, val); + } + } + if (!path) + return "BalanceMember must define balancer name when outside <Proxy > section"; + if (!name) + return "BalanceMember must define remote proxy server"; + + ap_str_tolower(path); /* lowercase scheme://hostname */ + ap_str_tolower(name); /* lowercase scheme://hostname */ + + /* Try to find existing worker */ + workers = (proxy_worker *)conf->workers->elts; + for (i = 0; i < conf->workers->nelts; i++) { + if (!strcmp(name, workers[i].name)) { + worker = &workers[i]; + break; + } + } + if (!worker) { + char *p, *q; + int port; + worker = apr_array_push(conf->workers); + worker->name = apr_pstrdup(cmd->pool, name); + worker->scheme = name; + p = strchr(name, ':'); + if (p == NULL || p[1] != '/' || p[2] != '/' || p[3] == '\0') { + return "BalanceMember: Bad syntax for a remote proxy server"; + } + *p = '\0'; + q = strchr(p + 3, ':'); + if (q != NULL) { + if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) { + return "BalanceMember: Bad syntax for a remote proxy server (bad port number)"; + } + *q = '\0'; + } + else + port = -1; + if (port == -1) + port = apr_uri_port_of_scheme(worker->scheme); + worker->port = port; + } + + arr = apr_table_elts(params); + elts = (const apr_table_entry_t *)arr->elts; + for (i = 0; i < arr->nelts; i++) { + if (!strcasecmp(elts[i].key, "loadfactor")) { + worker->lbfactor = atoi(elts[i].val); + if (worker->lbfactor < 1 || worker->lbfactor > 100) + return "BalanceMember: loadfactor must be number between 1..100"; + } + else if (!strcasecmp(elts[i].key, "retry")) { + int sec = atoi(elts[i].val); + if (sec < 0) + return "BalanceMember: retry must be positive number"; + worker->retry = apr_time_from_sec(sec); + } + } + /* Try to find the balancer */ + balancers = (struct proxy_balancer *)conf->balancers->elts; + for (i = 0; i < conf->balancers->nelts; i++) { + if (!strcmp(name, balancers[i].name)) { + balancer = &balancers[i]; + break; + } + } + + if (!balancer) { + apr_status_t rc = 0; +#if DEBUGGING + ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, NULL, + "Creating new balancer %s", path); +#endif + balancer = (struct proxy_balancer *)apr_pcalloc(cmd->pool, sizeof(struct proxy_balancer)); + balancer->name = path; + balancer->workers = apr_array_make(cmd->pool, 5, sizeof(proxy_runtime_worker)); + /* XXX Is this a right place to create mutex */ +#if APR_HAS_THREADS + if ((rc = apr_thread_mutex_create(&(balancer->mutex), + APR_THREAD_MUTEX_DEFAULT, cmd->pool)) != APR_SUCCESS) { + /* XXX: Do we need to log something here */ + return "BalanceMember: system error. Can not create thread mutex"; + } +#endif + } + /* Add the worker to the load balancer */ + runtime = apr_array_push(balancer->workers); + runtime->w = worker; + + return NULL; +} + static void ap_add_per_proxy_conf(server_rec *s, ap_conf_vector_t *dir_config) { proxy_server_conf *sconf = ap_get_module_config(s->module_config, @@ -1167,7 +1291,8 @@ "This overrides the server timeout"), AP_INIT_TAKE1("ProxyBadHeader", set_bad_opt, NULL, RSRC_CONF, "How to handle bad header line in response: IsError | Ignore | StartBody"), - + AP_INIT_ITERATE("BalancerMember", add_member, NULL, RSRC_CONF|ACCESS_CONF, + "A balancer name and scheme with list of params"), {NULL} };
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]