Skip to content

Commit

Permalink
* If we fail to connect to all looked up IP's from the worker lookup …
Browse files Browse the repository at this point in the history
…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.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1909451 13f79535-47bb-0310-9956-ffa450edef68
(cherry picked from commit 9a8eb4a)
  • Loading branch information
rpluem committed Oct 30, 2023
1 parent efd7239 commit 5badef7
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions modules/proxy/proxy_util.c
Original file line number Diff line number Diff line change
Expand Up @@ -3223,6 +3223,7 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
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);

Expand Down Expand Up @@ -3362,6 +3363,23 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
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;
}

Expand Down Expand Up @@ -3455,6 +3473,19 @@ PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
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;
}

Expand Down

0 comments on commit 5badef7

Please sign in to comment.