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
> 


Reply via email to