Hi Baptiste,
thanks for the fix, but before taking it, are you really sure it's
the version you wanted to send ? There are a couple of debugging
printf() left so I could remove them by hand but maybe you intended
to send a different patch, thus I'd rather let you double-check.
thanks,
Willy
On Tue, Nov 05, 2019 at 10:04:30AM +0100, Baptiste wrote:
> diff --git a/src/action.c b/src/action.c
> index 7684202..36eedc8 100644
> --- a/src/action.c
> +++ b/src/action.c
> @@ -73,6 +73,7 @@ int check_trk_action(struct act_rule *rule, struct proxy
> *px, char **err)
> int act_resolution_cb(struct dns_requester *requester, struct dns_nameserver
> *nameserver)
> {
> struct stream *stream;
> +printf("%s %d\n", __FUNCTION__, __LINE__);
>
> if (requester->resolution == NULL)
> return 0;
> @@ -89,6 +90,7 @@ int act_resolution_cb(struct dns_requester *requester,
> struct dns_nameserver *na
> int act_resolution_error_cb(struct dns_requester *requester, int error_code)
> {
> struct stream *stream;
> +printf("%s %d\n", __FUNCTION__, __LINE__);
>
> if (requester->resolution == NULL)
> return 0;
> diff --git a/src/dns.c b/src/dns.c
> index 15d40a1..d5bf449 100644
> --- a/src/dns.c
> +++ b/src/dns.c
> @@ -363,8 +363,9 @@ void dns_trigger_resolution(struct dns_requester *req)
> * valid */
> exp = tick_add(res->last_resolution, resolvers->hold.valid);
> if (resolvers->t && (res->status != RSLV_STATUS_VALID ||
> - !tick_isset(res->last_resolution) || tick_is_expired(exp, now_ms)))
> + !tick_isset(res->last_resolution) || tick_is_expired(exp, now_ms)))
> {
> task_wakeup(resolvers->t, TASK_WOKEN_OTHER);
> + }
> }
>
>
> @@ -2150,8 +2151,13 @@ enum act_return dns_action_do_resolve(struct act_rule
> *rule, struct proxy *px,
> struct dns_resolution *resolution;
> struct sample *smp;
> char *fqdn;
> + struct dns_requester *req;
> + struct dns_resolvers *resolvers;
> + struct dns_resolution *res;
> + int exp;
>
> /* we have a response to our DNS resolution */
> + use_cache:
> if (s->dns_ctx.dns_requester && s->dns_ctx.dns_requester->resolution !=
> NULL) {
> resolution = s->dns_ctx.dns_requester->resolution;
> if (resolution->step == RSLV_STEP_RUNNING) {
> @@ -2211,6 +2217,22 @@ enum act_return dns_action_do_resolve(struct act_rule
> *rule, struct proxy *px,
>
> s->dns_ctx.parent = rule;
> dns_link_resolution(s, OBJ_TYPE_STREAM, 0);
> +
> + /* Check if there is a fresh enough response in the cache of our
> associated resolution */
> + req = s->dns_ctx.dns_requester;
> + if (!req || !req->resolution) {
> + dns_trigger_resolution(s->dns_ctx.dns_requester);
> + return ACT_RET_YIELD;
> + }
> + res = req->resolution;
> + resolvers = res->resolvers;
> +
> + exp = tick_add(res->last_resolution, resolvers->hold.valid);
> + if (resolvers->t && res->status == RSLV_STATUS_VALID &&
> tick_isset(res->last_resolution)
> + && !tick_is_expired(exp, now_ms)) {
> + goto use_cache;
> + }
> +
> dns_trigger_resolution(s->dns_ctx.dns_requester);
> return ACT_RET_YIELD;
> }
> --
> 2.7.4
>