]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
Merge r1836381, r1836382, r1836383, r1836386, r1836603 from trunk:
authorJim Jagielski <jim@apache.org>
Tue, 11 Sep 2018 11:57:19 +0000 (11:57 +0000)
committerJim Jagielski <jim@apache.org>
Tue, 11 Sep 2018 11:57:19 +0000 (11:57 +0000)
* 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

CHANGES
STATUS
include/ap_mmn.h
modules/proxy/balancers/mod_lbmethod_bybusyness.c
modules/proxy/balancers/mod_lbmethod_byrequests.c
modules/proxy/balancers/mod_lbmethod_bytraffic.c
modules/proxy/balancers/mod_lbmethod_heartbeat.c
modules/proxy/mod_proxy.h
modules/proxy/mod_proxy_balancer.c
modules/proxy/mod_proxy_http.c
modules/proxy/proxy_util.c

diff --git a/CHANGES b/CHANGES
index 040296d511d564b63275f3f6bc0a2457dcd719fb..073907c87d59d7e18fb475610c206579b0cb535f 100644 (file)
--- 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 <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]
 
diff --git a/STATUS b/STATUS
index 642d5c505599900095b786ca6898336a7b68337a..f017c5d62380314649aa9a32805bbfb87d0d3ba2 100644 (file)
--- 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:
index e2bd6ac81e39f01485fcfd667fcfef3393f84171..17be28e787620bc5536655b60835cce205faa0c2 100644 (file)
  *                          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
index 709512bb5ee76906de0fcad7c50f68f4ce1ef9e4..80d538cdaaaaf0e1d0ee9b195c7eb27b27861a9f 100644 (file)
@@ -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) = {
index 0483a70fecb712de392783f91e46e3ee3cd129d9..b6cd8d8b8bdeb24f5d8b5b27f94f69c3fc0c54ab 100644 (file)
@@ -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) = {
index 343c59ac32a510dab1e5bd9ccc905182007fd110..6cfab94c0573626fe39d0c12cbf7a4ed57a68eeb 100644 (file)
@@ -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) = {
index d7462608a4f4269c5719dd683bada20c9bb3faa9..7aeaf71248549f24de03247fa769a9627df777a2 100644 (file)
@@ -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);
index 91e9b58cb05b55fbfaa0fc4a6515f3a832023d54..aabd09f404418ec2cbf13bf6a8af483178172f2f 100644 (file)
@@ -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
index c3c5d83960f3262f301c500ebfe09fa987f54855..c59f5e973fc7ca825f9e7cdd340dc07ae1f507af 100644 (file)
@@ -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;
     }
 
     /*
index 01dc509010a6688f692b70593e83a496daf012c6..e80a24c66f194d604ff93ba6987c03665d02b67b 100644 (file)
@@ -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;
index 2bd0edbfbc731a22001e6cd8ab481c13c8218ea4..6501c680649d50b1eedfcdd0b21f21ad97afffbc 100644 (file)
@@ -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);
 }