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;
}