On 07/19/2018 08:24 PM, William A Rowe Jr wrote:
> On Thu, May 31, 2018 at 8:24 AM, <j...@apache.org <mailto:j...@apache.org>> 
> wrote:
> 
>     Author: jim
>     Date: Thu May 31 13:24:04 2018
>     New Revision: 1832609
> 
>     URL: http://svn.apache.org/viewvc?rev=1832609&view=rev 
> <http://svn.apache.org/viewvc?rev=1832609&view=rev>
>     Log:
>     Merge r1828890, r1832500 from trunk:
> 
> [...] 
> 
>     URL:
>     
> http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/proxy/balancers/mod_lbmethod_byrequests.c?rev=1832609&r1=1832608&r2=1832609&view=diff
>     
> <http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/modules/proxy/balancers/mod_lbmethod_byrequests.c?rev=1832609&r1=1832608&r2=1832609&view=diff>
>     
> ==============================================================================
>     --- 
> httpd/httpd/branches/2.4.x/modules/proxy/balancers/mod_lbmethod_byrequests.c 
> (original)
>     +++ 
> httpd/httpd/branches/2.4.x/modules/proxy/balancers/mod_lbmethod_byrequests.c 
> Thu May 31 13:24:04 2018
> 
> [...] 
> 
>     @@ -70,82 +77,17 @@ static int (*ap_proxy_retry_worker_fn)(c
>       *   b a d c d a c d b d ...
>       *
>       */
>     -
>      static proxy_worker *find_best_byrequests(proxy_balancer *balancer,
>                                      request_rec *r)
>      {
>     -    int i;
>          int total_factor = 0;
> 
> [...] 
> 
>     +    proxy_worker *worker = ap_proxy_balancer_get_best_worker(balancer, 
> r, is_best_byrequests, &total_factor);
> 
> 
> This introduced a new hard runtime config ordering problem on 
> mod_lbmethod_byrequest.so, which must now be loaded AFTER
> mod_proxy.so.
> 
> This was not previously true, as illustrated by mod_lbmethod_heartbeat, using 
> the ap_proxy_retry_worker using an
> optional function.
> 
> lbmethod sorts before proxy, fwiw.
> 

Something like the attached? The mod_lbmethod_byrequests.c part needs to be 
done for lb modules though.

Regards

RĂ¼diger



Index: modules/proxy/proxy_util.c
===================================================================
--- modules/proxy/proxy_util.c	(revision 1836329)
+++ modules/proxy/proxy_util.c	(working copy)
@@ -4079,4 +4079,5 @@
 {
     APR_REGISTER_OPTIONAL_FN(ap_proxy_retry_worker);
     APR_REGISTER_OPTIONAL_FN(ap_proxy_clear_connection);
+    APR_REGISTER_OPTIONAL_FN(ap_proxy_balancer_get_best_worker);
 }
Index: modules/proxy/balancers/mod_lbmethod_byrequests.c
===================================================================
--- modules/proxy/balancers/mod_lbmethod_byrequests.c	(revision 1836329)
+++ modules/proxy/balancers/mod_lbmethod_byrequests.c	(working copy)
@@ -22,6 +22,9 @@
 
 module AP_MODULE_DECLARE_DATA lbmethod_byrequests_module;
 
+static APR_OPTIONAL_FN_TYPE(ap_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 @@
                                 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,6 +126,30 @@
     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;
+    }
+
+    if (!ap_proxy_balancer_get_best_worker_fn) {
+        ap_proxy_balancer_get_best_worker_fn =
+                APR_RETRIEVE_OPTIONAL_FN(ap_proxy_balancer_get_best_worker);
+        if (!ap_proxy_balancer_get_best_worker_fn) {
+            ap_log_error(APLOG_MARK, APLOG_EMERG, 0, s, APLOGNO()
+                         "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.
@@ -130,6 +157,7 @@
      * 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: modules/proxy/mod_proxy.h
===================================================================
--- modules/proxy/mod_proxy.h	(revision 1836329)
+++ modules/proxy/mod_proxy.h	(working copy)
@@ -880,6 +880,14 @@
                                                                 request_rec *r,
                                                                 proxy_is_best_callback_fn_t *is_best,
                                                                 void *baton);
+/*
+ * Needed by the lb modules.
+ */
+APR_DECLARE_OPTIONAL_FN(proxy_worker *, ap_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: include/ap_mmn.h
===================================================================
--- include/ap_mmn.h	(revision 1836329)
+++ include/ap_mmn.h	(working copy)
@@ -585,6 +585,8 @@
  * 20180716.2 (2.5.1-dev)  Add read_buf_size member to core_dir_config,
  *                         flush_max_threshold and flush_max_pipelined to
  *                         core_server_config, and ap_get_read_buf_size().
+ * 20180716.3 (2.5.1-dev)  Add optional function declaration for
+ *                         ap_proxy_balancer_get_best_worker to mod_proxy.h.
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
@@ -592,7 +594,7 @@
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
 #define MODULE_MAGIC_NUMBER_MAJOR 20180716
 #endif
-#define MODULE_MAGIC_NUMBER_MINOR 2                 /* 0...n */
+#define MODULE_MAGIC_NUMBER_MINOR 3                 /* 0...n */
 
 /**
  * Determine if the server's current MODULE_MAGIC_NUMBER is at least a

Reply via email to