diff --git a/src/resolvers.c b/src/resolvers.c index e02c8a561..ab9541467 100644 --- a/src/resolvers.c +++ b/src/resolvers.c @@ -659,14 +659,17 @@ static void leave_resolver_code() */ static void resolv_srvrq_cleanup_srv(struct server *srv) { + struct server_inetaddr srv_addr; + _resolv_unlink_resolution(srv->resolv_requester); HA_SPIN_LOCK(SERVER_LOCK, &srv->lock); srvrq_set_srv_down(srv); ha_free(&srv->hostname); ha_free(&srv->hostname_dn); srv->hostname_dn_len = 0; - memset(&srv->addr, 0, sizeof(srv->addr)); - srv->svc_port = 0; + memset(&srv_addr, 0, sizeof(srv_addr)); + /* unset server's addr */ + server_set_inetaddr(srv, &srv_addr, SERVER_INETADDR_UPDATER_NONE, NULL); srv->flags |= SRV_F_NO_RESOLUTION; ebpt_delete(&srv->host_dn); diff --git a/src/server.c b/src/server.c index c3ddcb2a6..8718adc91 100644 --- a/src/server.c +++ b/src/server.c @@ -4448,8 +4448,13 @@ int snr_resolution_cb(struct resolv_requester *requester, struct dns_counters *c srv_update_addr(s, firstip, firstip_sin_family, SERVER_INETADDR_UPDATER_DNS_CACHE); update_status: - if (!snr_set_srv_down(s, has_no_ip) && has_no_ip) - memset(&s->addr, 0, sizeof(s->addr)); + if (!snr_set_srv_down(s, has_no_ip) && has_no_ip) { + struct server_inetaddr s_addr; + + memset(&s_addr, 0, sizeof(s_addr)); + /* unset server's addr */ + server_set_inetaddr(s, &s_addr, SERVER_INETADDR_UPDATER_NONE, NULL); + } return 1; invalid: @@ -4457,8 +4462,13 @@ int snr_resolution_cb(struct resolv_requester *requester, struct dns_counters *c counters->app.resolver.invalid++; goto update_status; } - if (!snr_set_srv_down(s, has_no_ip) && has_no_ip) - memset(&s->addr, 0, sizeof(s->addr)); + if (!snr_set_srv_down(s, has_no_ip) && has_no_ip) { + struct server_inetaddr s_addr; + + memset(&s_addr, 0, sizeof(s_addr)); + /* unset server's addr */ + server_set_inetaddr(s, &s_addr, SERVER_INETADDR_UPDATER_NONE, NULL); + } return 0; } @@ -4539,7 +4549,11 @@ int snr_resolution_error_cb(struct resolv_requester *requester, int error_code) HA_SPIN_LOCK(SERVER_LOCK, &s->lock); if (!snr_set_srv_down(s, 1)) { - memset(&s->addr, 0, sizeof(s->addr)); + struct server_inetaddr s_addr; + + memset(&s_addr, 0, sizeof(s_addr)); + /* unset server's addr */ + server_set_inetaddr(s, &s_addr, SERVER_INETADDR_UPDATER_NONE, NULL); HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock); resolv_detach_from_resolution_answer_items(requester->resolution, requester); return 0;