diff options
author | Willy Tarreau <w@1wt.eu> | 2021-10-20 14:07:31 +0200 |
---|---|---|
committer | Willy Tarreau <w@1wt.eu> | 2021-10-20 15:14:13 +0200 |
commit | 46968e1f69178950eb1a0862d9e5996f260a4fae (patch) | |
tree | 665855635e2704423be3a9a50c8149f03cf6267c | |
parent | d8b7353033e840688fa445c5c24e3f364bbbaf92 (diff) | |
download | haproxy-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.h | 4 | ||||
-rw-r--r-- | src/resolvers.c | 27 | ||||
-rw-r--r-- | src/server.c | 6 | ||||
-rw-r--r-- | src/stream.c | 2 |
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); |