You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rp...@apache.org on 2023/04/27 08:15:21 UTC

svn commit: r1909451 - /httpd/httpd/trunk/modules/proxy/proxy_util.c

Author: rpluem
Date: Thu Apr 27 08:15:20 2023
New Revision: 1909451

URL: http://svn.apache.org/viewvc?rev=1909451&view=rev
Log:
* If we fail to connect to all looked up IP's from the worker lookup cache it
  might be caused by a change on DNS side. Try another DNS lookup in this case
  and in case this causes a successful connection trigger a refresh of the
  worker lookup cache.

Modified:
    httpd/httpd/trunk/modules/proxy/proxy_util.c

Modified: httpd/httpd/trunk/modules/proxy/proxy_util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/modules/proxy/proxy_util.c?rev=1909451&r1=1909450&r2=1909451&view=diff
==============================================================================
--- httpd/httpd/trunk/modules/proxy/proxy_util.c (original)
+++ httpd/httpd/trunk/modules/proxy/proxy_util.c Thu Apr 27 08:15:20 2023
@@ -3206,6 +3206,7 @@ PROXY_DECLARE(int) ap_proxy_connect_back
     apr_sockaddr_t *local_addr;
     apr_socket_t *newsock;
     void *sconf = s->module_config;
+    int did_dns_lookup = 0;
     proxy_server_conf *conf =
         (proxy_server_conf *) ap_get_module_config(sconf, &proxy_module);
 
@@ -3345,6 +3346,23 @@ PROXY_DECLARE(int) ap_proxy_connect_back
                              worker->s->hostname_ex,
                              (int)worker->s->port);
                 backend_addr = backend_addr->next;
+                /*
+                 * If we run out of resolved IP's when connecting and if
+                 * we cache the resolution in the worker the resolution
+                 * might have changed. Hence try a DNS lookup to see if this
+                 * helps.
+                 */
+                if (!backend_addr && !did_dns_lookup && worker->cp->addr) {
+                    /*
+                     * In case of an error backend_addr will be NULL which
+                     * is enough to leave the loop.
+                     */
+                    apr_sockaddr_info_get(&backend_addr,
+                                          conn->hostname, APR_UNSPEC,
+                                          conn->port, 0,
+                                          conn->pool);
+                    did_dns_lookup = 1;
+                }
                 continue;
             }
 
@@ -3438,6 +3456,19 @@ PROXY_DECLARE(int) ap_proxy_connect_back
         rv = APR_EINVAL;
     }
 
+    if ((rv == APR_SUCCESS) && did_dns_lookup) {
+        /*
+         * A local DNS lookup caused a successful connect. Trigger to update
+         * the worker cache next time.
+         * We don't care handling any locking errors. If something fails we
+         * just continue with the existing cache value.
+         */
+        if (PROXY_THREAD_LOCK(worker) == APR_SUCCESS) {
+            worker->cp->addr = NULL;
+            PROXY_THREAD_UNLOCK(worker);
+        }
+    }
+
     return rv == APR_SUCCESS ? OK : DECLINED;
 }