Index: modules/proxy/mod_proxy_balancer.c =================================================================== --- modules/proxy/mod_proxy_balancer.c (revision 574186) +++ modules/proxy/mod_proxy_balancer.c (working copy) @@ -19,6 +19,7 @@ #define CORE_PRIVATE #include "mod_proxy.h" +#include "scoreboard.h" #include "ap_mpm.h" #include "apr_version.h" #include "apr_hooks.h" @@ -79,22 +80,37 @@ { int i; proxy_worker *workers; + int worker_is_initialized; + proxy_worker_stat *slot; workers = (proxy_worker *)balancer->workers->elts; for (i = 0; i < balancer->workers->nelts; i++) { + worker_is_initialized = PROXY_WORKER_IS_INITIALIZED(workers); + if (!worker_is_initialized) { + /* + * If the worker is not initialized check whether its scoreboard + * slot is already initialized. + */ + slot = (proxy_worker_stat *) ap_get_scoreboard_lb(workers->id); + if (slot) { + worker_is_initialized = slot->status & PROXY_WORKER_INITIALIZED; + } + else { + worker_is_initialized = 0; + } + } ap_proxy_initialize_worker_share(conf, workers, s); ap_proxy_initialize_worker(workers, s); + 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; } - workers = (proxy_worker *)balancer->workers->elts; - for (i = 0; i < balancer->workers->nelts; i++) { - /* Set to the original configuration */ - workers[i].s->lbstatus = workers[i].s->lbfactor = - (workers[i].lbfactor ? workers[i].lbfactor : 1); - workers[i].s->lbset = workers[i].lbset; - } /* Set default number of attempts to the number of * workers. */ Index: modules/proxy/mod_proxy.h =================================================================== --- modules/proxy/mod_proxy.h (revision 574186) +++ modules/proxy/mod_proxy.h (working copy) @@ -254,14 +254,16 @@ #define PROXY_WORKER_NOT_USABLE_BITMAP ( PROXY_WORKER_IN_SHUTDOWN | \ PROXY_WORKER_DISABLED | PROXY_WORKER_STOPPED | PROXY_WORKER_IN_ERROR ) -#define PROXY_WORKER_IS_INITIALIZED(f) ( (f)->s->status & \ - PROXY_WORKER_INITIALIZED ) +/* NOTE: these check the shared status */ +#define PROXY_WORKER_IS_INITIALIZED(f) ( (f)->s && \ + ( (f)->s->status & PROXY_WORKER_INITIALIZED ) ) -#define PROXY_WORKER_IS_STANDBY(f) ( (f)->s->status & \ - PROXY_WORKER_HOT_STANDBY ) +#define PROXY_WORKER_IS_STANDBY(f) ( (f)->s && \ + ( (f)->s->status & PROXY_WORKER_HOT_STANDBY ) ) -#define PROXY_WORKER_IS_USABLE(f) ( !((f)->s->status & \ - (PROXY_WORKER_NOT_USABLE_BITMAP)) && PROXY_WORKER_IS_INITIALIZED(f) ) +#define PROXY_WORKER_IS_USABLE(f) ( (f)->s && \ + ( !( (f)->s->status & PROXY_WORKER_NOT_USABLE_BITMAP) ) && \ + PROXY_WORKER_IS_INITIALIZED(f) ) /* default worker retry timeout in seconds */ #define PROXY_WORKER_DEFAULT_RETRY 60