summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilly Tarreau <w@1wt.eu>2021-10-20 14:07:31 +0200
committerWilly Tarreau <w@1wt.eu>2021-10-20 15:14:13 +0200
commit46968e1f69178950eb1a0862d9e5996f260a4fae (patch)
tree665855635e2704423be3a9a50c8149f03cf6267c
parentd8b7353033e840688fa445c5c24e3f364bbbaf92 (diff)
downloadhaproxy-20211020-res-fix-6.tar.gz
MEDIUM: resolvers: remove the last occurrences of the "safe" argument20211020-res-fix-6
This one was used to indicate whether the callee had to follow particularly safe code path when removing resolutions. Since the code now uses a kill list, this is not needed anymore.
-rw-r--r--include/haproxy/resolvers.h4
-rw-r--r--src/resolvers.c27
-rw-r--r--src/server.c6
-rw-r--r--src/stream.c2
4 files changed, 15 insertions, 24 deletions
diff --git a/include/haproxy/resolvers.h b/include/haproxy/resolvers.h
index 6030bb662..4058f9f5f 100644
--- a/include/haproxy/resolvers.h
+++ b/include/haproxy/resolvers.h
@@ -49,8 +49,8 @@ int resolv_get_ip_from_response(struct resolv_response *r_res,
struct server *owner);
int resolv_link_resolution(void *requester, int requester_type, int requester_locked);
-void resolv_unlink_resolution(struct resolv_requester *requester, int safe);
-void resolv_detach_from_resolution_answer_items(struct resolv_resolution *res, struct resolv_requester *req, int safe);
+void resolv_unlink_resolution(struct resolv_requester *requester);
+void resolv_detach_from_resolution_answer_items(struct resolv_resolution *res, struct resolv_requester *req);
void resolv_trigger_resolution(struct resolv_requester *requester);
enum act_parse_ret resolv_parse_do_resolve(const char **args, int *orig_arg, struct proxy *px, struct act_rule *rule, char **err);
int check_action_do_resolve(struct act_rule *rule, struct proxy *px, char **err);
diff --git a/src/resolvers.c b/src/resolvers.c
index 4fa8b2bc2..7f9ea7d7f 100644
--- a/src/resolvers.c
+++ b/src/resolvers.c
@@ -64,7 +64,7 @@ static unsigned int resolution_uuid = 1;
unsigned int resolv_failed_resolutions = 0;
static struct task *process_resolvers(struct task *t, void *context, unsigned int state);
static void resolv_free_resolution(struct resolv_resolution *resolution);
-static void _resolv_unlink_resolution(struct resolv_requester *requester, int safe);
+static void _resolv_unlink_resolution(struct resolv_requester *requester);
enum {
DNS_STAT_ID,
@@ -606,7 +606,7 @@ static void free_aborted_resolutions()
*/
static void resolv_srvrq_cleanup_srv(struct server *srv)
{
- _resolv_unlink_resolution(srv->resolv_requester, 0);
+ _resolv_unlink_resolution(srv->resolv_requester);
HA_SPIN_LOCK(SERVER_LOCK, &srv->lock);
srvrq_update_srv_status(srv, 1);
ha_free(&srv->hostname);
@@ -803,7 +803,7 @@ srv_found:
/* Unlink A/AAAA resolution for this server if there is an AR item.
* It is usless to perform an extra resolution
*/
- _resolv_unlink_resolution(srv->resolv_requester, 0);
+ _resolv_unlink_resolution(srv->resolv_requester);
}
if (!srv->hostname_dn) {
@@ -2005,7 +2005,7 @@ int resolv_link_resolution(void *requester, int requester_type, int requester_lo
* is called using safe == 1 to make it usable into callbacks. Must be called
* with the death_row already initialized via init_aborted_resolutions().
*/
-void resolv_detach_from_resolution_answer_items(struct resolv_resolution *res, struct resolv_requester *req, int safe)
+void resolv_detach_from_resolution_answer_items(struct resolv_resolution *res, struct resolv_requester *req)
{
struct resolv_answer_item *item, *itemback;
struct server *srv, *srvback;
@@ -2031,7 +2031,7 @@ void resolv_detach_from_resolution_answer_items(struct resolv_resolution *res,
* if <safe> is set to 1, the corresponding resolution is not released. Must be
* called with the death_row already initialized via init_aborted_resolutions().
*/
-static void _resolv_unlink_resolution(struct resolv_requester *requester, int safe)
+static void _resolv_unlink_resolution(struct resolv_requester *requester)
{
struct resolv_resolution *res;
struct resolv_requester *req;
@@ -2042,7 +2042,7 @@ static void _resolv_unlink_resolution(struct resolv_requester *requester, int sa
res = requester->resolution;
/* remove ref from the resolution answer item list to the requester */
- resolv_detach_from_resolution_answer_items(res, requester, safe);
+ resolv_detach_from_resolution_answer_items(res, requester);
/* Clean up the requester */
LIST_DEL_INIT(&requester->list);
@@ -2052,15 +2052,6 @@ static void _resolv_unlink_resolution(struct resolv_requester *requester, int sa
if (!LIST_ISEMPTY(&res->requesters))
req = LIST_NEXT(&res->requesters, struct resolv_requester *, list);
else {
- if (safe) {
- /* Don't release it yet. */
- resolv_reset_resolution(res);
- res->hostname_dn = NULL;
- res->hostname_dn_len = 0;
- resolv_purge_resolution_answer_records(res);
- return;
- }
-
abort_resolution(res);
return;
}
@@ -2087,10 +2078,10 @@ static void _resolv_unlink_resolution(struct resolv_requester *requester, int sa
}
/* The public version of the function above that deals with the death row. */
-void resolv_unlink_resolution(struct resolv_requester *requester, int safe)
+void resolv_unlink_resolution(struct resolv_requester *requester)
{
init_aborted_resolutions();
- _resolv_unlink_resolution(requester, safe);
+ _resolv_unlink_resolution(requester);
free_aborted_resolutions();
}
@@ -2963,7 +2954,7 @@ enum act_return resolv_action_do_resolve(struct act_rule *rule, struct proxy *px
ha_free(&s->resolv_ctx.hostname_dn);
s->resolv_ctx.hostname_dn_len = 0;
if (s->resolv_ctx.requester) {
- _resolv_unlink_resolution(s->resolv_ctx.requester, 0);
+ _resolv_unlink_resolution(s->resolv_ctx.requester);
pool_free(resolv_requester_pool, s->resolv_ctx.requester);
s->resolv_ctx.requester = NULL;
}
diff --git a/src/server.c b/src/server.c
index 15c4d0536..f74bb5cb7 100644
--- a/src/server.c
+++ b/src/server.c
@@ -3574,7 +3574,7 @@ int srvrq_resolution_error_cb(struct resolv_requester *requester, int error_code
}
/* Remove any associated server ref */
- resolv_detach_from_resolution_answer_items(res, requester, 1);
+ resolv_detach_from_resolution_answer_items(res, requester);
return 0;
}
@@ -3599,7 +3599,7 @@ int snr_resolution_error_cb(struct resolv_requester *requester, int error_code)
if (!snr_update_srv_status(s, 1)) {
memset(&s->addr, 0, sizeof(s->addr));
HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
- resolv_detach_from_resolution_answer_items(requester->resolution, requester, 1);
+ resolv_detach_from_resolution_answer_items(requester->resolution, requester);
return 0;
}
HA_SPIN_UNLOCK(SERVER_LOCK, &s->lock);
@@ -3722,7 +3722,7 @@ int srv_set_fqdn(struct server *srv, const char *hostname, int resolv_locked)
strcasecmp(resolution->hostname_dn, hostname_dn) == 0)
goto end;
- resolv_unlink_resolution(srv->resolv_requester, 0);
+ resolv_unlink_resolution(srv->resolv_requester);
free(srv->hostname);
free(srv->hostname_dn);
diff --git a/src/stream.c b/src/stream.c
index c2e3ff9ff..d720f83e4 100644
--- a/src/stream.c
+++ b/src/stream.c
@@ -680,7 +680,7 @@ static void stream_free(struct stream *s)
HA_SPIN_LOCK(DNS_LOCK, &resolvers->lock);
ha_free(&s->resolv_ctx.hostname_dn);
s->resolv_ctx.hostname_dn_len = 0;
- resolv_unlink_resolution(s->resolv_ctx.requester, 0);
+ resolv_unlink_resolution(s->resolv_ctx.requester);
HA_SPIN_UNLOCK(DNS_LOCK, &resolvers->lock);
pool_free(resolv_requester_pool, s->resolv_ctx.requester);