mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-21 22:01:31 +02:00
BUG/MEDIUM: resolvers: Skip DNS resolution at startup if SRV resolution is set
At startup, if a SRV resolution is set for a server, no DNS resolution is created. We must wait the first SRV resolution to know if it must be triggered. It is important to do so for two reasons. First, during a "classical" startup, a server based on a SRV resolution has no hostname. Thus the created DNS resolution is useless. Best waiting the first SRV resolution. It is not really a bug at this stage, it is just useless. Second, in the same situation, if the server state is loaded from a file, its hosname will be set a bit later. Thus, if there is no additionnal record for this server, because there is already a DNS resolution, it inhibits any new DNS resolution. But there is no hostname attached to the existing DNS resolution. So no resolution is performed at all for this server. To avoid any problem, it is fairly easier to handle this special case during startup. But this means we must be prepared to have no "resolv_requester" field for a server at runtime. This patch must be backported as far as 2.2.
This commit is contained in:
parent
0efc0993ec
commit
d83a6df5cd
@ -2299,7 +2299,7 @@ static int resolvers_finalize_config(void)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (resolv_link_resolution(srv, OBJ_TYPE_SERVER, 0) == -1) {
|
||||
if (!srv->srvrq && resolv_link_resolution(srv, OBJ_TYPE_SERVER, 0) == -1) {
|
||||
ha_alert("config : %s '%s', unable to set DNS resolution for server '%s'.\n",
|
||||
proxy_type_str(px), px->id, srv->id);
|
||||
err_code |= (ERR_ALERT|ERR_ABORT);
|
||||
|
10
src/server.c
10
src/server.c
@ -3027,7 +3027,7 @@ int srvrq_update_srv_status(struct server *s, int has_no_ip)
|
||||
int snr_update_srv_status(struct server *s, int has_no_ip)
|
||||
{
|
||||
struct resolvers *resolvers = s->resolvers;
|
||||
struct resolv_resolution *resolution = s->resolv_requester->resolution;
|
||||
struct resolv_resolution *resolution = (s->resolv_requester ? s->resolv_requester->resolution : NULL);
|
||||
int exp;
|
||||
|
||||
/* If resolution is NULL we're dealing with SRV records Additional records */
|
||||
@ -3156,7 +3156,7 @@ int snr_resolution_cb(struct resolv_requester *requester, struct dns_counters *c
|
||||
return 1;
|
||||
}
|
||||
|
||||
resolution = s->resolv_requester->resolution;
|
||||
resolution = (s->resolv_requester ? s->resolv_requester->resolution : NULL);
|
||||
if (!resolution)
|
||||
return 1;
|
||||
|
||||
@ -3428,10 +3428,10 @@ int srv_set_fqdn(struct server *srv, const char *hostname, int resolv_locked)
|
||||
|
||||
if (!resolv_locked)
|
||||
HA_SPIN_LOCK(DNS_LOCK, &srv->resolvers->lock);
|
||||
/* run time DNS resolution was not active for this server
|
||||
/* run time DNS/SRV resolution was not active for this server
|
||||
* and we can't enable it at run time for now.
|
||||
*/
|
||||
if (!srv->resolv_requester)
|
||||
if (!srv->resolv_requester && !srv->srvrq)
|
||||
goto err;
|
||||
|
||||
chunk_reset(&trash);
|
||||
@ -3442,7 +3442,7 @@ int srv_set_fqdn(struct server *srv, const char *hostname, int resolv_locked)
|
||||
if (hostname_dn_len == -1)
|
||||
goto err;
|
||||
|
||||
resolution = srv->resolv_requester->resolution;
|
||||
resolution = (srv->resolv_requester ? srv->resolv_requester->resolution : NULL);
|
||||
if (resolution &&
|
||||
resolution->hostname_dn &&
|
||||
strcmp(resolution->hostname_dn, hostname_dn) == 0)
|
||||
|
Loading…
x
Reference in New Issue
Block a user