*) mod_ratelimit: Don't interfere with "chunked" encoding, fixing regression
introduced in 2.4.34. PR 62568. [Yann Ylavic]
- *) Allow the argument to <IfFile>, <IfDefine>, <IfSection>, <IfDirective>,
+ *) mod_proxy: Remove load order and link dependency between mod_lbmethod_*
+ modules and mod_proxy. PR 62557. [Ruediger Pluem]
+
+ *) Allow the argument to <IfFile>, <IfDefine>, <IfSection>, <IfDirective>,
and <IfModule> to be quoted. This is primarily for the benefit of
<IfFile>. [Eric Covener]
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
[ start all new proposals below, under PATCHES PROPOSED. ]
- *) mod_proxy: fix load order dep between mod_proxy and lbmethod providers
- trunk patch: http://svn.apache.org/r1836381
- http://svn.apache.org/r1836382
- http://svn.apache.org/r1836383
- http://svn.apache.org/r1836386
- http://svn.apache.org/r1836603
- 2.4.x patch: http://people.apache.org/~covener/2.4.x-proxy-opt-fn.diff
- +1: covener, jim, ylavic
PATCHES PROPOSED TO BACKPORT FROM TRUNK:
* scoreboard.h.
* 20120211.81 (2.4.35-dev) Add new duration field to worker_score struct in
* scoreboard.h
+ * 20120211.82 (2.4.35-dev) Add optional function declaration for
+ * ap_proxy_balancer_get_best_worker to mod_proxy.h.
*
*/
#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20120211
#endif
-#define MODULE_MAGIC_NUMBER_MINOR 81 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 82 /* 0...n */
/**
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
module AP_MODULE_DECLARE_DATA lbmethod_bybusyness_module;
+static APR_OPTIONAL_FN_TYPE(proxy_balancer_get_best_worker)
+ *ap_proxy_balancer_get_best_worker_fn = NULL;
+
static int is_best_bybusyness(proxy_worker *current, proxy_worker *prev_best, void *baton)
{
int *total_factor = (int *)baton;
{
int total_factor = 0;
proxy_worker *worker =
- ap_proxy_balancer_get_best_worker(balancer, r, is_best_bybusyness,
+ ap_proxy_balancer_get_best_worker_fn(balancer, r, is_best_bybusyness,
&total_factor);
if (worker) {
NULL
};
+/* post_config hook: */
+static int lbmethod_bybusyness_post_config(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s)
+{
+
+ /* lbmethod_bybusyness_post_config() will be called twice during startup. So, don't
+ * set up the static data the 1st time through. */
+ if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG) {
+ return OK;
+ }
+
+ ap_proxy_balancer_get_best_worker_fn =
+ APR_RETRIEVE_OPTIONAL_FN(proxy_balancer_get_best_worker);
+ if (!ap_proxy_balancer_get_best_worker_fn) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(10151)
+ "mod_proxy must be loaded for mod_lbmethod_bybusyness");
+ return !OK;
+ }
+
+ return OK;
+}
+
static void register_hook(apr_pool_t *p)
{
ap_register_provider(p, PROXY_LBMETHOD, "bybusyness", "0", &bybusyness);
+ ap_hook_post_config(lbmethod_bybusyness_post_config, NULL, NULL, APR_HOOK_MIDDLE);
}
AP_DECLARE_MODULE(lbmethod_bybusyness) = {
module AP_MODULE_DECLARE_DATA lbmethod_byrequests_module;
+static APR_OPTIONAL_FN_TYPE(proxy_balancer_get_best_worker)
+ *ap_proxy_balancer_get_best_worker_fn = NULL;
+
static int is_best_byrequests(proxy_worker *current, proxy_worker *prev_best, void *baton)
{
int *total_factor = (int *)baton;
request_rec *r)
{
int total_factor = 0;
- proxy_worker *worker = ap_proxy_balancer_get_best_worker(balancer, r, is_best_byrequests, &total_factor);
+ proxy_worker *worker = ap_proxy_balancer_get_best_worker_fn(balancer, r, is_best_byrequests, &total_factor);
if (worker) {
worker->s->lbstatus -= total_factor;
NULL
};
+/* post_config hook: */
+static int lbmethod_byrequests_post_config(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s)
+{
+
+ /* lbmethod_byrequests_post_config() will be called twice during startup. So, don't
+ * set up the static data the 1st time through. */
+ if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG) {
+ return OK;
+ }
+
+ ap_proxy_balancer_get_best_worker_fn =
+ APR_RETRIEVE_OPTIONAL_FN(proxy_balancer_get_best_worker);
+ if (!ap_proxy_balancer_get_best_worker_fn) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(10152)
+ "mod_proxy must be loaded for mod_lbmethod_byrequests");
+ return !OK;
+ }
+
+ return OK;
+}
+
static void register_hook(apr_pool_t *p)
{
- /* Only the mpm_winnt has child init hook handler.
- * make sure that we are called after the mpm
- * initializes and after the mod_proxy
- */
ap_register_provider(p, PROXY_LBMETHOD, "byrequests", "0", &byrequests);
+ ap_hook_post_config(lbmethod_byrequests_post_config, NULL, NULL, APR_HOOK_MIDDLE);
}
AP_DECLARE_MODULE(lbmethod_byrequests) = {
module AP_MODULE_DECLARE_DATA lbmethod_bytraffic_module;
+static APR_OPTIONAL_FN_TYPE(proxy_balancer_get_best_worker)
+ *ap_proxy_balancer_get_best_worker_fn = NULL;
+
static int is_best_bytraffic(proxy_worker *current, proxy_worker *prev_best, void *baton)
{
apr_off_t *min_traffic = (apr_off_t *)baton;
{
apr_off_t min_traffic = 0;
- return ap_proxy_balancer_get_best_worker(balancer, r, is_best_bytraffic,
+ return ap_proxy_balancer_get_best_worker_fn(balancer, r, is_best_bytraffic,
&min_traffic);
}
NULL
};
+/* post_config hook: */
+static int lbmethod_bytraffic_post_config(apr_pool_t *pconf, apr_pool_t *plog,
+ apr_pool_t *ptemp, server_rec *s)
+{
+
+ /* lbmethod_bytraffic_post_config() will be called twice during startup. So, don't
+ * set up the static data the 1st time through. */
+ if (ap_state_query(AP_SQ_MAIN_STATE) == AP_SQ_MS_CREATE_PRE_CONFIG) {
+ return OK;
+ }
+
+ ap_proxy_balancer_get_best_worker_fn =
+ APR_RETRIEVE_OPTIONAL_FN(proxy_balancer_get_best_worker);
+ if (!ap_proxy_balancer_get_best_worker_fn) {
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(10150)
+ "mod_proxy must be loaded for mod_lbmethod_bytraffic");
+ return !OK;
+ }
+
+ return OK;
+}
+
static void register_hook(apr_pool_t *p)
{
- /* Only the mpm_winnt has child init hook handler.
- * make sure that we are called after the mpm
- * initializes and after the mod_proxy
- */
ap_register_provider(p, PROXY_LBMETHOD, "bytraffic", "0", &bytraffic);
+ ap_hook_post_config(lbmethod_bytraffic_post_config, NULL, NULL, APR_HOOK_MIDDLE);
}
AP_DECLARE_MODULE(lbmethod_bytraffic) = {
ap_get_module_config(r->server->module_config,
&lbmethod_heartbeat_module);
+ ap_proxy_retry_worker_fn =
+ APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
if (!ap_proxy_retry_worker_fn) {
- ap_proxy_retry_worker_fn =
- APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
- if (!ap_proxy_retry_worker_fn) {
- /* can only happen if mod_proxy isn't loaded */
- return NULL;
- }
+ /* can only happen if mod_proxy isn't loaded */
+ return NULL;
}
apr_pool_create(&tpool, r->pool);
request_rec *r,
proxy_is_best_callback_fn_t *is_best,
void *baton);
+/*
+ * Needed by the lb modules.
+ */
+APR_DECLARE_OPTIONAL_FN(proxy_worker *, proxy_balancer_get_best_worker,
+ (proxy_balancer *balancer,
+ request_rec *r,
+ proxy_is_best_callback_fn_t *is_best,
+ void *baton));
/**
* Find the shm of the worker as needed
return OK;
}
+ ap_proxy_retry_worker_fn =
+ APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
if (!ap_proxy_retry_worker_fn) {
- ap_proxy_retry_worker_fn =
- APR_RETRIEVE_OPTIONAL_FN(ap_proxy_retry_worker);
- if (!ap_proxy_retry_worker_fn) {
- ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02230)
- "mod_proxy must be loaded for mod_proxy_balancer");
- return !OK;
- }
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02230)
+ "mod_proxy must be loaded for mod_proxy_balancer");
+ return !OK;
}
/*
return OK;
}
+ ap_proxy_clear_connection_fn =
+ APR_RETRIEVE_OPTIONAL_FN(ap_proxy_clear_connection);
if (!ap_proxy_clear_connection_fn) {
- ap_proxy_clear_connection_fn =
- APR_RETRIEVE_OPTIONAL_FN(ap_proxy_clear_connection);
- if (!ap_proxy_clear_connection_fn) {
- ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02477)
- "mod_proxy must be loaded for mod_proxy_http");
- return !OK;
- }
+ ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO(02477)
+ "mod_proxy must be loaded for mod_proxy_http");
+ return !OK;
}
return OK;
static int proxy_match_hostname(struct dirconn_entry *This, request_rec *r);
static int proxy_match_word(struct dirconn_entry *This, request_rec *r);
static int ap_proxy_retry_worker(const char *proxy_function, proxy_worker *worker, server_rec *s);
+static proxy_worker *proxy_balancer_get_best_worker(proxy_balancer *balancer,
+ request_rec *r,
+ proxy_is_best_callback_fn_t *is_best,
+ void *baton);
APR_IMPLEMENT_OPTIONAL_HOOK_RUN_ALL(proxy, PROXY, int, create_req,
(request_rec *r, request_rec *pr), (r, pr),
return APR_SUCCESS;
}
-PROXY_DECLARE(proxy_worker *) ap_proxy_balancer_get_best_worker(proxy_balancer *balancer,
- request_rec *r,
- proxy_is_best_callback_fn_t *is_best,
- void *baton)
+static proxy_worker *proxy_balancer_get_best_worker(proxy_balancer *balancer,
+ request_rec *r,
+ proxy_is_best_callback_fn_t *is_best,
+ void *baton)
{
int i = 0;
int cur_lbset = 0;
return best_worker;
}
+PROXY_DECLARE(proxy_worker *) ap_proxy_balancer_get_best_worker(proxy_balancer *balancer,
+ request_rec *r,
+ proxy_is_best_callback_fn_t *is_best,
+ void *baton)
+{
+ return proxy_balancer_get_best_worker(balancer, r, is_best, baton);
+}
+
/*
* CONNECTION related...
*/
{
APR_REGISTER_OPTIONAL_FN(ap_proxy_retry_worker);
APR_REGISTER_OPTIONAL_FN(ap_proxy_clear_connection);
+ APR_REGISTER_OPTIONAL_FN(proxy_balancer_get_best_worker);
}