From: Jim Jagielski Date: Tue, 11 Sep 2018 11:57:19 +0000 (+0000) Subject: Merge r1836381, r1836382, r1836383, r1836386, r1836603 from trunk: X-Git-Tag: 2.4.35~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f98102a1a659f527632c196c5e7dabb7f6d1870e;p=thirdparty%2Fapache%2Fhttpd.git Merge r1836381, r1836382, r1836383, r1836386, r1836603 from trunk: * mod_proxy: Remove load order and link dependency between mod_lbmethod_* modules and mod_proxy by providing mod_proxy's ap_proxy_balancer_get_best_worker as an optional function. PR: 62557 * Remove invalid copy and paste comments * Always retrieve conditional function. static variable might contain garbage if module was reloaded in a static build. * Add missing log numbers * ap_proxy_balancer_get_best_worker cannot be exported and used as an optional function at the same time. So rename ap_proxy_balancer_get_best_worker to proxy_balancer_get_best_worker and make it static which is then used as an optional function and recreate ap_proxy_balancer_get_best_worker as an exported thin wrapper of proxy_balancer_get_best_worker. Submitted by: rpluem Reviewed by: covener, jim, ylavic git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1840548 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 040296d511d..073907c87d5 100644 --- a/CHANGES +++ b/CHANGES @@ -20,7 +20,10 @@ Changes with Apache 2.4.35 *) mod_ratelimit: Don't interfere with "chunked" encoding, fixing regression introduced in 2.4.34. PR 62568. [Yann Ylavic] - *) Allow the argument to , , , , + *) mod_proxy: Remove load order and link dependency between mod_lbmethod_* + modules and mod_proxy. PR 62557. [Ruediger Pluem] + + *) Allow the argument to , , , , and to be quoted. This is primarily for the benefit of . [Eric Covener] diff --git a/STATUS b/STATUS index 642d5c50559..f017c5d6238 100644 --- a/STATUS +++ b/STATUS @@ -124,14 +124,6 @@ RELEASE SHOWSTOPPERS: 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: diff --git a/include/ap_mmn.h b/include/ap_mmn.h index e2bd6ac81e3..17be28e7876 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -520,6 +520,8 @@ * 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. * */ @@ -528,7 +530,7 @@ #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 diff --git a/modules/proxy/balancers/mod_lbmethod_bybusyness.c b/modules/proxy/balancers/mod_lbmethod_bybusyness.c index 709512bb5ee..80d538cdaaa 100644 --- a/modules/proxy/balancers/mod_lbmethod_bybusyness.c +++ b/modules/proxy/balancers/mod_lbmethod_bybusyness.c @@ -22,6 +22,9 @@ 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; @@ -44,7 +47,7 @@ static proxy_worker *find_best_bybusyness(proxy_balancer *balancer, { 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) { @@ -82,9 +85,32 @@ static const proxy_balancer_method bybusyness = 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) = { diff --git a/modules/proxy/balancers/mod_lbmethod_byrequests.c b/modules/proxy/balancers/mod_lbmethod_byrequests.c index 0483a70fecb..b6cd8d8b8bd 100644 --- a/modules/proxy/balancers/mod_lbmethod_byrequests.c +++ b/modules/proxy/balancers/mod_lbmethod_byrequests.c @@ -22,6 +22,9 @@ 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; @@ -81,7 +84,7 @@ static proxy_worker *find_best_byrequests(proxy_balancer *balancer, 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; @@ -123,13 +126,32 @@ static const proxy_balancer_method byrequests = 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) = { diff --git a/modules/proxy/balancers/mod_lbmethod_bytraffic.c b/modules/proxy/balancers/mod_lbmethod_bytraffic.c index 343c59ac32a..6cfab94c057 100644 --- a/modules/proxy/balancers/mod_lbmethod_bytraffic.c +++ b/modules/proxy/balancers/mod_lbmethod_bytraffic.c @@ -22,6 +22,9 @@ 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; @@ -59,7 +62,7 @@ static proxy_worker *find_best_bytraffic(proxy_balancer *balancer, { 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); } @@ -93,13 +96,32 @@ static const proxy_balancer_method bytraffic = 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) = { diff --git a/modules/proxy/balancers/mod_lbmethod_heartbeat.c b/modules/proxy/balancers/mod_lbmethod_heartbeat.c index d7462608a4f..7aeaf712485 100644 --- a/modules/proxy/balancers/mod_lbmethod_heartbeat.c +++ b/modules/proxy/balancers/mod_lbmethod_heartbeat.c @@ -273,13 +273,11 @@ static proxy_worker *find_best_hb(proxy_balancer *balancer, 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); diff --git a/modules/proxy/mod_proxy.h b/modules/proxy/mod_proxy.h index 91e9b58cb05..aabd09f4044 100644 --- a/modules/proxy/mod_proxy.h +++ b/modules/proxy/mod_proxy.h @@ -846,6 +846,14 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_balancer_get_best_worker(proxy_balancer * 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 diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index c3c5d83960f..c59f5e973fc 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -859,14 +859,12 @@ static int balancer_post_config(apr_pool_t *pconf, apr_pool_t *plog, 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; } /* diff --git a/modules/proxy/mod_proxy_http.c b/modules/proxy/mod_proxy_http.c index 01dc509010a..e80a24c66f1 100644 --- a/modules/proxy/mod_proxy_http.c +++ b/modules/proxy/mod_proxy_http.c @@ -2037,14 +2037,12 @@ static int proxy_http_post_config(apr_pool_t *pconf, apr_pool_t *plog, 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; diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 2bd0edbfbc7..6501c680649 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -69,6 +69,10 @@ static int proxy_match_domainname(struct dirconn_entry *This, request_rec *r); 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), @@ -1307,10 +1311,10 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_balancer(proxy_balancer *balance 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; @@ -1422,6 +1426,14 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_balancer_get_best_worker(proxy_balancer * 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... */ @@ -4029,4 +4041,5 @@ void proxy_util_register_hooks(apr_pool_t *p) { 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); }