diff --git a/modules/proxy/balancers/mod_lbmethod_bybusyness.c b/modules/proxy/balancers/mod_lbmethod_bybusyness.c
index 5b4e54ee6a..d27aa395bd 100644
--- a/modules/proxy/balancers/mod_lbmethod_bybusyness.c
+++ b/modules/proxy/balancers/mod_lbmethod_bybusyness.c
@@ -97,7 +97,7 @@ static proxy_worker *find_best_bybusyness(proxy_balancer *balancer,
mycandidate->s->lbstatus -= total_factor;
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: bybusyness selected worker \"%s\" : busy %" APR_SIZE_T_FMT " : lbstatus %d",
- mycandidate->name, mycandidate->s->busy, mycandidate->s->lbstatus);
+ mycandidate->s->name, mycandidate->s->busy, mycandidate->s->lbstatus);
}
diff --git a/modules/proxy/balancers/mod_lbmethod_byrequests.c b/modules/proxy/balancers/mod_lbmethod_byrequests.c
index 6c94e67fd1..9b453ceaf3 100644
--- a/modules/proxy/balancers/mod_lbmethod_byrequests.c
+++ b/modules/proxy/balancers/mod_lbmethod_byrequests.c
@@ -125,7 +125,7 @@ static proxy_worker *find_best_byrequests(proxy_balancer *balancer,
mycandidate->s->lbstatus -= total_factor;
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: byrequests selected worker \"%s\" : busy %" APR_SIZE_T_FMT " : lbstatus %d",
- mycandidate->name, mycandidate->s->busy, mycandidate->s->lbstatus);
+ mycandidate->s->name, mycandidate->s->busy, mycandidate->s->lbstatus);
}
diff --git a/modules/proxy/balancers/mod_lbmethod_bytraffic.c b/modules/proxy/balancers/mod_lbmethod_bytraffic.c
index 4cec05b20d..d0aea4bf1f 100644
--- a/modules/proxy/balancers/mod_lbmethod_bytraffic.c
+++ b/modules/proxy/balancers/mod_lbmethod_bytraffic.c
@@ -98,7 +98,7 @@ static proxy_worker *find_best_bytraffic(proxy_balancer *balancer,
if (mycandidate) {
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: bytraffic selected worker \"%s\" : busy %" APR_SIZE_T_FMT,
- mycandidate->name, mycandidate->s->busy);
+ mycandidate->s->name, mycandidate->s->busy);
}
diff --git a/modules/proxy/balancers/mod_lbmethod_heartbeat.c b/modules/proxy/balancers/mod_lbmethod_heartbeat.c
index 0bf1fec9de..63304e83f4 100644
--- a/modules/proxy/balancers/mod_lbmethod_heartbeat.c
+++ b/modules/proxy/balancers/mod_lbmethod_heartbeat.c
@@ -318,11 +318,11 @@ static proxy_worker *find_best_hb(proxy_balancer *balancer,
for (i = 0; i < balancer->workers->nelts; i++) {
worker = &APR_ARRAY_IDX(balancer->workers, i, proxy_worker *);
- server = apr_hash_get(servers, (*worker)->hostname, APR_HASH_KEY_STRING);
+ server = apr_hash_get(servers, (*worker)->s->hostname, APR_HASH_KEY_STRING);
if (!server) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r,
- "lb_heartbeat: No server for worker %s", (*worker)->name);
+ "lb_heartbeat: No server for worker %s", (*worker)->s->name);
continue;
}
diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c
index 83c8557367..742c81f153 100644
--- a/modules/proxy/mod_proxy.c
+++ b/modules/proxy/mod_proxy.c
@@ -35,12 +35,6 @@ APR_DECLARE_OPTIONAL_FN(char *, ssl_var_lookup,
#define MAX(x,y) ((x) >= (y) ? (x) : (y))
#endif
-/* return the sizeof of one lb_worker in scoreboard. */
-static int ap_proxy_lb_worker_size(void)
-{
- return sizeof(proxy_worker_shared);
-}
-
/*
* A Web proxy module. Stages:
*
@@ -992,7 +986,6 @@ static int proxy_handler(request_rec *r)
/* Initialise worker if needed, note the shared area must be initialized by the balancer logic */
if (balancer) {
ap_proxy_initialize_worker(worker, r->server, conf->pool);
- ap_proxy_initialize_worker_share(conf, worker, r->server);
}
if (balancer && balancer->max_attempts_set && !max_attempts)
@@ -1452,9 +1445,7 @@ static const char *
if (ap_proxy_valid_balancer_name(r)) {
proxy_balancer *balancer = ap_proxy_get_balancer(cmd->pool, conf, r);
if (!balancer) {
- const char *err = ap_proxy_alloc_balancer(&balancer,
- cmd->pool,
- conf, r);
+ const char *err = ap_proxy_define_balancer(cmd->pool, &balancer, conf, r);
if (err)
return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL);
}
@@ -1466,10 +1457,10 @@ static const char *
}
}
else {
- proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, conf, r);
+ proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, r);
int reuse = 0;
if (!worker) {
- const char *err = ap_proxy_add_worker(&worker, cmd->pool, conf, r);
+ const char *err = ap_proxy_define_worker(cmd->pool, &worker, NULL, conf, r);
if (err)
return apr_pstrcat(cmd->temp_pool, "ProxyPass ", err, NULL);
PROXY_COPY_CONF_PARAMS(worker, conf);
@@ -1477,14 +1468,14 @@ static const char *
reuse = 1;
ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server,
"Sharing worker '%s' instead of creating new worker '%s'",
- worker->name, new->real);
+ worker->s->name, new->real);
}
for (i = 0; i < arr->nelts; i++) {
if (reuse) {
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server,
"Ignoring parameter '%s=%s' for worker '%s' because of worker sharing",
- elts[i].key, elts[i].val, worker->name);
+ elts[i].key, elts[i].val, worker->s->name);
} else {
const char *err = set_worker_param(cmd->pool, worker, elts[i].key,
elts[i].val);
@@ -1844,6 +1835,7 @@ static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg)
const apr_table_entry_t *elts;
int reuse = 0;
int i;
+ const char *err;
if (cmd->path)
path = apr_pstrdup(cmd->pool, cmd->path);
@@ -1877,18 +1869,25 @@ static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg)
ap_str_tolower(path); /* lowercase scheme://hostname */
+ /* Try to find the balancer */
+ balancer = ap_proxy_get_balancer(cmd->temp_pool, conf, path);
+ if (!balancer) {
+ err = ap_proxy_define_balancer(cmd->pool, &balancer, conf, path);
+ if (err)
+ return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL);
+ }
+
/* Try to find existing worker */
- worker = ap_proxy_get_worker(cmd->temp_pool, conf, name);
+ worker = ap_proxy_get_worker(cmd->temp_pool, balancer, conf, name);
if (!worker) {
- const char *err;
- if ((err = ap_proxy_add_worker(&worker, cmd->pool, conf, name)) != NULL)
+ if ((err = ap_proxy_define_worker(cmd->pool, &worker, balancer, conf, name)) != NULL)
return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL);
PROXY_COPY_CONF_PARAMS(worker, conf);
} else {
reuse = 1;
ap_log_error(APLOG_MARK, APLOG_INFO, 0, cmd->server,
"Sharing worker '%s' instead of creating new worker '%s'",
- worker->name, name);
+ worker->s->name, name);
}
arr = apr_table_elts(params);
@@ -1897,25 +1896,15 @@ static const char *add_member(cmd_parms *cmd, void *dummy, const char *arg)
if (reuse) {
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server,
"Ignoring parameter '%s=%s' for worker '%s' because of worker sharing",
- elts[i].key, elts[i].val, worker->name);
+ elts[i].key, elts[i].val, worker->s->name);
} else {
- const char *err = set_worker_param(cmd->pool, worker, elts[i].key,
+ err = set_worker_param(cmd->pool, worker, elts[i].key,
elts[i].val);
if (err)
return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL);
}
}
- /* Try to find the balancer */
- balancer = ap_proxy_get_balancer(cmd->temp_pool, conf, path);
- if (!balancer) {
- const char *err = ap_proxy_alloc_balancer(&balancer,
- cmd->pool,
- conf, path);
- if (err)
- return apr_pstrcat(cmd->temp_pool, "BalancerMember ", err, NULL);
- }
- /* Add the worker to the load balancer */
- ap_proxy_add_worker_to_balancer(cmd->pool, balancer, worker);
+
return NULL;
}
@@ -1951,13 +1940,11 @@ static const char *
name = ap_getword_conf(cmd->temp_pool, &arg);
}
- if (ap_proxy_valid_balancer_name(name) {
+ if (ap_proxy_valid_balancer_name(name)) {
balancer = ap_proxy_get_balancer(cmd->pool, conf, name);
if (!balancer) {
if (in_proxy_section) {
- err = ap_proxy_alloc_balancer(&balancer,
- cmd->pool,
- conf, name);
+ err = ap_proxy_define_balancer(cmd->pool, &balancer, conf, name);
if (err)
return apr_pstrcat(cmd->temp_pool, "ProxySet ",
err, NULL);
@@ -1968,11 +1955,11 @@ static const char *
}
}
else {
- worker = ap_proxy_get_worker(cmd->temp_pool, conf, name);
+ worker = ap_proxy_get_worker(cmd->temp_pool, NULL, conf, name);
if (!worker) {
if (in_proxy_section) {
- err = ap_proxy_add_worker(&worker, cmd->pool,
- conf, name);
+ err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
+ conf, name);
if (err)
return apr_pstrcat(cmd->temp_pool, "ProxySet ",
err, NULL);
@@ -2102,22 +2089,21 @@ static const char *proxysection(cmd_parms *cmd, void *mconfig, const char *arg)
return apr_pstrcat(cmd->pool, thiscmd->name,
"> arguments are not supported for non url.",
NULL);
- if (ap_proxy_valid_balancer_name(conf->p) {
+ if (ap_proxy_valid_balancer_name(conf->p)) {
balancer = ap_proxy_get_balancer(cmd->pool, sconf, conf->p);
if (!balancer) {
- err = ap_proxy_alloc_balancer(&balancer,
- cmd->pool,
- sconf, conf->p);
+ err = ap_proxy_define_balancer(cmd->pool, &balancer,
+ sconf, conf->p);
if (err)
return apr_pstrcat(cmd->temp_pool, thiscmd->name,
" ", err, NULL);
}
}
else {
- worker = ap_proxy_get_worker(cmd->temp_pool, sconf,
+ worker = ap_proxy_get_worker(cmd->temp_pool, NULL, sconf,
conf->p);
if (!worker) {
- err = ap_proxy_add_worker(&worker, cmd->pool,
+ err = ap_proxy_define_worker(cmd->pool, &worker, NULL,
sconf, conf->p);
if (err)
return apr_pstrcat(cmd->temp_pool, thiscmd->name,
@@ -2325,8 +2311,8 @@ static int proxy_status_hook(request_rec *r, int flags)
worker = (proxy_worker **)balancer->workers->elts;
for (n = 0; n < balancer->workers->nelts; n++) {
char fbuf[50];
- ap_rvputs(r, "
\n", (*worker)->s->scheme, " | ", NULL);
+ ap_rvputs(r, "", (*worker)->s->hostname, " | ", NULL);
if ((*worker)->s->status & PROXY_WORKER_DISABLED)
ap_rputs("Dis", r);
else if ((*worker)->s->status & PROXY_WORKER_IN_ERROR)
@@ -2374,44 +2360,42 @@ static void child_init(apr_pool_t *p, server_rec *s)
{
proxy_worker *reverse = NULL;
+ /* TODO */
while (s) {
void *sconf = s->module_config;
proxy_server_conf *conf;
proxy_worker *worker;
- int i;
conf = (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
- /* Initialize worker's shared scoreboard data */
- worker = (proxy_worker *)conf->workers->elts;
- for (i = 0; i < conf->workers->nelts; i++) {
- ap_proxy_initialize_worker_share(conf, worker, s);
- ap_proxy_initialize_worker(worker, s, p);
- worker++;
- }
+ /*
+ * NOTE: non-balancer members don't use shm at all...
+ * after all, why should they?
+ */
/* Create and initialize forward worker if defined */
if (conf->req_set && conf->req) {
- conf->forward = ap_proxy_create_worker(p);
- conf->forward->name = "proxy:forward";
- conf->forward->hostname = "*";
- conf->forward->scheme = "*";
- ap_proxy_initialize_worker_share(conf, conf->forward, s);
- ap_proxy_initialize_worker(conf->forward, s, p);
- /* Do not disable worker in case of errors */
+ ap_proxy_define_worker(p, &worker, NULL, NULL, "http://www.apache.org");
+ conf->forward = worker;
+ PROXY_STRNCPY(conf->forward->s->name, "proxy:forward");
+ PROXY_STRNCPY(conf->forward->s->hostname, "*");
+ PROXY_STRNCPY(conf->forward->s->scheme, "*");
+ conf->forward->hash = conf->forward->s->hash =
+ ap_proxy_hashfunc(conf->forward->s->name, PROXY_HASHFUNC_DEFAULT);
+ /* Do not disable worker in case of errors */
conf->forward->s->status |= PROXY_WORKER_IGNORE_ERRORS;
/* Disable address cache for generic forward worker */
- conf->forward->is_address_reusable = 0;
+ conf->forward->s->is_address_reusable = 0;
}
if (!reverse) {
- reverse = ap_proxy_create_worker(p);
- reverse->name = "proxy:reverse";
- reverse->hostname = "*";
- reverse->scheme = "*";
- ap_proxy_initialize_worker_share(conf, reverse, s);
- ap_proxy_initialize_worker(reverse, s, p);
+ ap_proxy_define_worker(p, &reverse, NULL, NULL, "http://www.apache.org");
+ PROXY_STRNCPY(reverse->s->name, "proxy:reverse");
+ PROXY_STRNCPY(reverse->s->hostname, "*");
+ PROXY_STRNCPY(reverse->s->scheme, "*");
+ reverse->hash = reverse->s->hash =
+ ap_proxy_hashfunc(reverse->s->name, PROXY_HASHFUNC_DEFAULT);
/* Do not disable worker in case of errors */
reverse->s->status |= PROXY_WORKER_IGNORE_ERRORS;
/* Disable address cache for generic reverse worker */
- reverse->is_address_reusable = 0;
+ reverse->s->is_address_reusable = 0;
}
conf->reverse = reverse;
s = s->next;
@@ -2441,10 +2425,8 @@ static void register_hooks(apr_pool_t *p)
* make sure that we are called after the mpm
* initializes.
*/
- static const char *const aszPred[] = { "mpm_winnt.c", "mod_proxy_balancer.c", NULL};
+ static const char *const aszPred[] = { "mpm_winnt.c", "mod_proxy_balancer.c", "mod_slotmem_shm.c", NULL};
- APR_REGISTER_OPTIONAL_FN(ap_proxy_lb_workers);
- APR_REGISTER_OPTIONAL_FN(ap_proxy_lb_worker_size);
/* handler */
ap_hook_handler(proxy_handler, NULL, NULL, APR_HOOK_FIRST);
/* filename-to-URI translation */
diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h
index 81da7d148a..1b5e245d6a 100644
--- a/modules/proxy/mod_proxy.h
+++ b/modules/proxy/mod_proxy.h
@@ -42,7 +42,9 @@
#include "apr_reslist.h"
#define APR_WANT_STRFUNC
#include "apr_want.h"
+#include "util_mutex.h"
#include "apr_global_mutex.h"
+#include "apr_thread_mutex.h"
#include "httpd.h"
#include "http_config.h"
@@ -514,14 +516,14 @@ typedef __declspec(dllimport) const char *
/**
* Get the worker from proxy configuration
* @param p memory pool used for finding worker
- * @param conf current proxy server configuration
* @param balancer the balancer that the worker belongs to
+ * @param conf current proxy server configuration
* @param url url to find the worker from
* @return proxy_worker or NULL if not found
*/
PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
- proxy_server_conf *conf,
proxy_balancer *balancer,
+ proxy_server_conf *conf,
const char *url);
/**
* Define and Allocate space for the worker to proxy configuration
@@ -532,40 +534,22 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_get_worker(apr_pool_t *p,
* @param url url containing worker name
* @return error message or NULL if successful (*worker is new worker)
*/
-PROXY_DECLARE(const char *) ap_proxy_define_worker(apr_pool_t *p,
+PROXY_DECLARE(char *) ap_proxy_define_worker(apr_pool_t *p,
proxy_worker **worker,
proxy_balancer *balancer,
proxy_server_conf *conf,
const char *url);
/**
- * Create new worker
- * @param p memory pool to allocate worker from
- * @param id slotnumber id or -1 for auto allocation
- * @return new worker
+ * Share a defined proxy worker via shm
+ * @param worker worker to be shared
+ * @param shm location of shared info
+ * @param i index into shm
*/
-PROXY_DECLARE(proxy_worker *) ap_proxy_create_worker_wid(apr_pool_t *p, int id);
+PROXY_DECLARE(void) ap_proxy_share_worker(proxy_worker *worker, proxy_worker_shared *shm, int i);
/**
- * Create new worker
- * @param p memory pool to allocate worker from
- * @return new worker
- */
-PROXY_DECLARE(proxy_worker *) ap_proxy_create_worker(apr_pool_t *p);
-
-/**
- * Initialize the worker's shared data
- * @param conf current proxy server configuration
- * @param worker worker to initialize
- * @param s current server record
- * @param worker worker to initialize
- */
-PROXY_DECLARE(void) ap_proxy_initialize_worker_share(proxy_server_conf *conf,
- proxy_worker *worker,
- server_rec *s);
-
-/**
- * Initialize the worker
+ * Initialize the worker by setting up worker connection pool and mutex
* @param worker worker to initialize
* @param s current server record
* @param p memory pool used for mutex and connection pool
@@ -574,12 +558,13 @@ PROXY_DECLARE(void) ap_proxy_initialize_worker_share(proxy_server_conf *conf,
PROXY_DECLARE(apr_status_t) ap_proxy_initialize_worker(proxy_worker *worker,
server_rec *s,
apr_pool_t *p);
+
/**
* Verifies valid balancer name (eg: balancer://foo)
* @param name name to test
* @return ptr to start of name or NULL if not valid
*/
-PROXY_DECLARE(char *) ap_proxy_valid_balancer_name(const char *name);
+PROXY_DECLARE(char *) ap_proxy_valid_balancer_name(char *name);
/**
@@ -601,7 +586,7 @@ PROXY_DECLARE(proxy_balancer *) ap_proxy_get_balancer(apr_pool_t *p,
* @param url url containing balancer name
* @return error message or NULL if successfull
*/
-PROXY_DECLARE(const char *) ap_proxy_define_balancer(apr_pool_t *p,
+PROXY_DECLARE(char *) ap_proxy_define_balancer(apr_pool_t *p,
proxy_balancer **balancer,
proxy_server_conf *conf,
const char *url);
diff --git a/modules/proxy/mod_proxy_ajp.c b/modules/proxy/mod_proxy_ajp.c
index c5e00f6428..c154edbf4d 100644
--- a/modules/proxy/mod_proxy_ajp.c
+++ b/modules/proxy/mod_proxy_ajp.c
@@ -210,7 +210,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server,
"proxy: AJP: request failed to %pI (%s)",
conn->worker->cp->addr,
- conn->worker->hostname);
+ conn->worker->s->hostname);
if (status == AJP_EOVERFLOW)
return HTTP_BAD_REQUEST;
else {
@@ -293,7 +293,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server,
"proxy: send failed to %pI (%s)",
conn->worker->cp->addr,
- conn->worker->hostname);
+ conn->worker->s->hostname);
/*
* It is fatal when we failed to send a (part) of the request
* body.
@@ -333,7 +333,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server,
"proxy: read response failed from %pI (%s)",
conn->worker->cp->addr,
- conn->worker->hostname);
+ conn->worker->s->hostname);
/*
* This is only non fatal when we have not sent (parts) of a possible
* request body so far (we do not store it and thus cannot send it
@@ -456,10 +456,10 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
r->connection->bucket_alloc);
APR_BRIGADE_INSERT_TAIL(output_brigade, e);
- if ((conn->worker->flush_packets == flush_on) ||
- ((conn->worker->flush_packets == flush_auto) &&
+ if ((conn->worker->s->flush_packets == flush_on) ||
+ ((conn->worker->s->flush_packets == flush_auto) &&
((rv = apr_poll(conn_poll, 1, &conn_poll_fd,
- conn->worker->flush_wait))
+ conn->worker->s->flush_wait))
!= APR_SUCCESS) &&
APR_STATUS_IS_TIMEUP(rv))) {
e = apr_bucket_flush_create(r->connection->bucket_alloc);
@@ -568,7 +568,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: got response from %pI (%s)",
conn->worker->cp->addr,
- conn->worker->hostname);
+ conn->worker->s->hostname);
rv = OK;
}
@@ -576,7 +576,7 @@ static int ap_proxy_ajp_request(apr_pool_t *p, request_rec *r,
ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server,
"proxy: dialog to %pI (%s) failed",
conn->worker->cp->addr,
- conn->worker->hostname);
+ conn->worker->s->hostname);
/*
* If we already send data, signal a broken backend connection
* upwards in the chain.
@@ -699,9 +699,9 @@ static int proxy_ajp_handler(request_rec *r, proxy_worker *worker,
}
/* Handle CPING/CPONG */
- if (worker->ping_timeout_set) {
+ if (worker->s->ping_timeout_set) {
status = ajp_handle_cping_cpong(backend->sock, r,
- worker->ping_timeout);
+ worker->s->ping_timeout);
/*
* In case the CPING / CPONG failed for the first time we might be
* just out of luck and got a faulty backend connection, but the
@@ -713,7 +713,7 @@ static int proxy_ajp_handler(request_rec *r, proxy_worker *worker,
ap_log_error(APLOG_MARK, APLOG_ERR, status, r->server,
"proxy: AJP: cping/cpong failed to %pI (%s)",
worker->cp->addr,
- worker->hostname);
+ worker->s->hostname);
status = HTTP_SERVICE_UNAVAILABLE;
retry++;
continue;
diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c
index 33489faf9e..e78212e0ba 100644
--- a/modules/proxy/mod_proxy_balancer.c
+++ b/modules/proxy/mod_proxy_balancer.c
@@ -98,40 +98,21 @@ static int proxy_balancer_canon(request_rec *r, char *url)
return OK;
}
-static int init_balancer_members(proxy_server_conf *conf, server_rec *s,
+static void init_balancer_members(proxy_server_conf *conf, server_rec *s,
proxy_balancer *balancer)
{
int i;
- proxy_worker **workers;
+ proxy_worker *worker;
- workers = (proxy_worker **)balancer->workers->elts;
+ worker = (proxy_worker *)balancer->workers->elts;
for (i = 0; i < balancer->workers->nelts; i++) {
int worker_is_initialized;
- worker_is_initialized = PROXY_WORKER_IS_INITIALIZED(*workers);
+ worker_is_initialized = PROXY_WORKER_IS_INITIALIZED(worker);
if (!worker_is_initialized) {
- proxy_worker_shared *slot;
- /*
- * If the worker is not initialized check whether its scoreboard
- * slot is already initialized.
- */
- slot = (proxy_worker_shared *) XXXXXap_get_scoreboard_lb((*workers)->id);
- if (slot) {
- worker_is_initialized = slot->status & PROXY_WORKER_INITIALIZED;
- }
- else {
- worker_is_initialized = 0;
- }
+ ap_proxy_initialize_worker(worker, s, conf->pool);
}
- ap_proxy_initialize_worker_share(conf, *workers, s);
- ap_proxy_initialize_worker(*workers, s, conf->pool);
- if (!worker_is_initialized) {
- /* Set to the original configuration */
- (*workers)->s->lbstatus = (*workers)->s->lbfactor =
- ((*workers)->lbfactor ? (*workers)->lbfactor : 1);
- (*workers)->s->lbset = (*workers)->lbset;
- }
- ++workers;
+ ++worker;
}
/* Set default number of attempts to the number of
@@ -141,7 +122,6 @@ static int init_balancer_members(proxy_server_conf *conf, server_rec *s,
balancer->max_attempts = balancer->workers->nelts - 1;
balancer->max_attempts_set = 1;
}
- return 0;
}
/* Retrieve the parameter with the given name
@@ -413,7 +393,7 @@ static int rewrite_url(request_rec *r, proxy_worker *worker,
NULL));
}
- *url = apr_pstrcat(r->pool, worker->name, path, NULL);
+ *url = apr_pstrcat(r->pool, worker->s->name, path, NULL);
return OK;
}
@@ -448,7 +428,7 @@ static void force_recovery(proxy_balancer *balancer, server_rec *s)
(*worker)->s->status &= ~PROXY_WORKER_IN_ERROR;
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
"proxy: BALANCER: (%s). Forcing recovery for worker (%s)",
- balancer->name, (*worker)->hostname);
+ balancer->name, (*worker)->s->hostname);
}
}
}
@@ -592,7 +572,7 @@ static int proxy_balancer_pre_request(proxy_worker **worker,
apr_table_setn(r->subprocess_env,
"BALANCER_NAME", (*balancer)->name);
apr_table_setn(r->subprocess_env,
- "BALANCER_WORKER_NAME", (*worker)->name);
+ "BALANCER_WORKER_NAME", (*worker)->s->name);
apr_table_setn(r->subprocess_env,
"BALANCER_WORKER_ROUTE", (*worker)->s->route);
@@ -615,7 +595,7 @@ static int proxy_balancer_pre_request(proxy_worker **worker,
}
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: BALANCER (%s) worker (%s) rewritten to %s",
- (*balancer)->name, (*worker)->name, *url);
+ (*balancer)->name, (*worker)->s->name, *url);
return access_status;
}
@@ -642,7 +622,7 @@ static int proxy_balancer_post_request(proxy_worker *worker,
if (r->status == val) {
ap_log_error(APLOG_MARK, APLOG_ERR, rv, r->server,
"proxy: BALANCER: (%s). Forcing recovery for worker (%s), failonstatus %d",
- balancer->name, worker->name, val);
+ balancer->name, worker->s->name, val);
worker->s->status |= PROXY_WORKER_IN_ERROR;
worker->s->error_time = apr_time_now();
break;
@@ -731,32 +711,54 @@ static int balancer_post_config(apr_pool_t *pconf, apr_pool_t *plog,
*/
while (s) {
int i,j;
+ apr_status_t rv;
sconf = s->module_config;
conf = (proxy_server_conf *)ap_get_module_config(sconf, &proxy_module);
- proxy_worker *worker;
/* Initialize shared scoreboard data */
- balancer = (proxy_balancer *)conf->balancers->elts;
+ proxy_balancer *balancer = (proxy_balancer *)conf->balancers->elts;
for (i = 0; i < conf->balancers->nelts; i++, balancer++) {
+ apr_size_t size;
+ unsigned int num;
proxy_worker *worker;
+ ap_slotmem_instance_t *new = NULL;
balancer->max_workers = balancer->workers->nelts + balancer->growth;
- storage->create(&balancer->slot, balancer->name, sizeof(proxy_worker_shared),
+
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Doing create: %s, %d, %d",
+ balancer->name, (int)sizeof(proxy_worker_shared),
+ (int)balancer->max_workers);
+
+ rv = storage->create(&new, balancer->name, sizeof(proxy_worker_shared),
balancer->max_workers, AP_SLOTMEM_TYPE_PREGRAB, pconf);
- if (!balancer->slot) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, 0, s, "slotmem_create failed");
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "slotmem_create failed");
return !OK;
}
- proxy_worker *worker = balancer->workers->elts;
+ balancer->slot = new;
+#if 0
+ rv = storage->attach(&(balancer->slot), balancer->name, &size, &num, pconf);
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "slotmem_attach failed");
+ return !OK;
+ }
+#endif
+ worker = (proxy_worker *)balancer->workers->elts;
for (j = 0; j < balancer->workers->nelts; j++, worker++) {
proxy_worker_shared *shm;
unsigned int index;
- if ((storage->grab(balancer->slot, &index) != APR_SUCCESS) ||;
- (storage->dptr(balancer->slot, index, &shm) != APR_SUCESS)) {
- ap_log_error(APLOG_MARK, APLOG_NOERRNO|APLOG_EMERG, 0, s, "slotmem_grab/dptr failed");
+
+ if ((rv = storage->grab(balancer->slot, &index)) != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "slotmem_grab failed");
+ return !OK;
+
+ }
+ if ((rv = storage->dptr(balancer->slot, index, (void *)&shm)) != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, rv, s, "slotmem_dptr failed");
return !OK;
}
- ap_proxy_create_worker(worker, shm, index)
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Doing share: %pp %pp %d", worker->s, shm, (int)index);
+ ap_proxy_share_worker(worker, shm, index);
}
}
s = s->next;
@@ -827,20 +829,7 @@ static int balancer_handler(request_rec *r)
bsel = ap_proxy_get_balancer(r->pool, conf,
apr_pstrcat(r->pool, "balancer://", name, NULL));
if ((name = apr_table_get(params, "w"))) {
- proxy_worker *ws;
-
- ws = ap_proxy_get_worker(r->pool, conf, name);
- if (bsel && ws) {
- workers = (proxy_worker **)bsel->workers->elts;
- for (n = 0; n < bsel->workers->nelts; n++) {
- worker = *workers;
- if (strcasecmp(worker->name, ws->name) == 0) {
- wsel = worker;
- break;
- }
- ++workers;
- }
- }
+ wsel = ap_proxy_get_worker(r->pool, bsel, conf, name);
}
/* First set the params */
/*
@@ -858,13 +847,13 @@ static int balancer_handler(request_rec *r)
}
}
if ((val = apr_table_get(params, "wr"))) {
- if (strlen(val) && strlen(val) < PROXY_WORKER_MAX_ROUTE_SIZ)
+ if (strlen(val) && strlen(val) < sizeof(wsel->s->route))
strcpy(wsel->s->route, val);
else
*wsel->s->route = '\0';
}
if ((val = apr_table_get(params, "rr"))) {
- if (strlen(val) && strlen(val) < PROXY_WORKER_MAX_ROUTE_SIZ)
+ if (strlen(val) && strlen(val) < sizeof(wsel->s->redirect))
strcpy(wsel->s->redirect, val);
else
*wsel->s->redirect = '\0';
@@ -897,9 +886,9 @@ static int balancer_handler(request_rec *r)
for (n = 0; n < balancer->workers->nelts; n++) {
worker = *workers;
ap_rputs(" \n", r);
- ap_rvputs(r, " ", worker->scheme,
+ ap_rvputs(r, " ", worker->s->scheme,
"\n", NULL);
- ap_rvputs(r, " ", worker->hostname,
+ ap_rvputs(r, " ", worker->s->hostname,
"\n", NULL);
ap_rprintf(r, " %d\n",
worker->s->lbfactor);
@@ -962,10 +951,10 @@ static int balancer_handler(request_rec *r)
worker = *workers;
ap_rvputs(r, "\nuri, "?b=",
balancer->name + sizeof("balancer://") - 1, "&w=",
- ap_escape_uri(r->pool, worker->name),
+ ap_escape_uri(r->pool, worker->s->name),
"&nonce=", balancer_nonce,
"\">", NULL);
- ap_rvputs(r, worker->name, " | ", NULL);
+ ap_rvputs(r, worker->s->name, "", NULL);
ap_rvputs(r, "", ap_escape_html(r->pool, worker->s->route),
NULL);
ap_rvputs(r, " | ",
@@ -999,7 +988,7 @@ static int balancer_handler(request_rec *r)
ap_rputs(" \n", r);
if (wsel && bsel) {
ap_rputs("Edit worker settings for ", r);
- ap_rvputs(r, wsel->name, "\n", NULL);
+ ap_rvputs(r, wsel->s->name, "\n", NULL);
ap_rvputs(r, " | |