You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by GitBox <gi...@apache.org> on 2021/04/08 19:47:52 UTC

[GitHub] [apisix] diaosj opened a new issue #4010: request help: question about dns_resolver_valid and resolver_timeout

diaosj opened a new issue #4010:
URL: https://github.com/apache/apisix/issues/4010


   ### Issue description
   
   Two questions about `dns_resolver_valid` and `resolver_timeout`.
   
   1. What's the default unit?
   In my memory, the default unit is second rather than millisecond. And I found this comment in config.yaml: https://github.com/apache/apisix/blob/master/conf/config-default.yaml#L111
   I guess the description "The unit is second." is valid for both `dns_resolver_valid` and `resolver_timeout`?
   And I found Nginx doc that says: "A value without a suffix means seconds. It is recommended to always specify a suffix."
   http://nginx.org/en/docs/syntax.html
   But the Nginx code here: https://github.com/nginx/nginx/blob/eb52de83114e8d98722cd17ec8435c47956b6315/src/http/ngx_http_core_module.c#L731-L733
   `resolver_timeout` seems to be used with `ngx_conf_set_msec_slot`. "msec" here implies that unit is millisecond? I'm confused.
   And I tried to set this param like this: `resolver_timeout: 5s`. But APISIX said it can only be assigned with a number. Haha.
   
   2. In older versions, both `dns_resolver_valid` and `resolver_timeout` are enabled. Now only  `resolver_timeout` is enabled in config.yaml. Curious about this change. ^_^
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [apisix] diaosj commented on issue #4010: request help: question about dns_resolver_valid and resolver_timeout

Posted by GitBox <gi...@apache.org>.
diaosj commented on issue #4010:
URL: https://github.com/apache/apisix/issues/4010#issuecomment-816353113


   Many thanks.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [apisix] diaosj commented on issue #4010: request help: question about dns_resolver_valid and resolver_timeout

Posted by GitBox <gi...@apache.org>.
diaosj commented on issue #4010:
URL: https://github.com/apache/apisix/issues/4010#issuecomment-816426176


   OK. Thanks!


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [apisix] diaosj commented on issue #4010: request help: question about dns_resolver_valid and resolver_timeout

Posted by GitBox <gi...@apache.org>.
diaosj commented on issue #4010:
URL: https://github.com/apache/apisix/issues/4010#issuecomment-816365499


   > > What's the default unit?
   > 
   > `ngx_conf_set_msec_slot` calls `ngx_parse_time`, in such a case, when the time doesn't contain the unit, nginx treats it a duration in seconds.
   > 
   Sorry, I reopen this issue.
   Just to make sure.
   I see `ngx_parse_time` is called in `ngx_conf_set_msec_slot` (https://github.com/nginx/nginx/blob/eb52de83114e8d98722cd17ec8435c47956b6315/src/core/ngx_conf_file.c#L1276):
   ```c
   *msp = ngx_parse_time(&value[1], 0);
   ```
   
   I jumped to the definition of `ngx_parse_time` (https://github.com/nginx/nginx/blob/eb52de83114e8d98722cd17ec8435c47956b6315/src/core/ngx_parse.c#L112):
   ```c
   ngx_int_t
   ngx_parse_time(ngx_str_t *line, ngx_uint_t is_sec)Ruslan Ermilov, 10 years ago: • Improved ngx_parse_time() code readability.
   {
       u_char      *p, *last;
       ngx_int_t    value, total, scale;
       ngx_int_t    max, cutoff, cutlim;
       ngx_uint_t   valid;
       enum {
           st_start = 0,
           st_year,
           st_month,
           st_week,
           st_day,
           st_hour,
           st_min,
           st_sec,
           st_msec,
           st_last
       } step;
   
       valid = 0;
       value = 0;
       total = 0;
       cutoff = NGX_MAX_INT_T_VALUE / 10;
       cutlim = NGX_MAX_INT_T_VALUE % 10;
       step = is_sec ? st_start : st_month;
   
       p = line->data;
       last = p + line->len;
   
       while (p < last) {
   
           if (*p >= '0' && *p <= '9') {
               if (value >= cutoff && (value > cutoff || *p - '0' > cutlim)) {
                   return NGX_ERROR;
               }
   
               value = value * 10 + (*p++ - '0');
               valid = 1;
               continue;
           }
   
           switch (*p++) {
   
           case 'y':
               if (step > st_start) {
                   return NGX_ERROR;
               }
               step = st_year;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 365);
               scale = 60 * 60 * 24 * 365;
               break;
   
           case 'M':
               if (step >= st_month) {
                   return NGX_ERROR;
               }
               step = st_month;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 30);
               scale = 60 * 60 * 24 * 30;
               break;
   
           case 'w':
               if (step >= st_week) {
                   return NGX_ERROR;
               }
               step = st_week;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24 * 7);
               scale = 60 * 60 * 24 * 7;
               break;
   
           case 'd':
               if (step >= st_day) {
                   return NGX_ERROR;
               }
               step = st_day;
               max = NGX_MAX_INT_T_VALUE / (60 * 60 * 24);
               scale = 60 * 60 * 24;
               break;
   
           case 'h':
               if (step >= st_hour) {
                   return NGX_ERROR;
               }
               step = st_hour;
               max = NGX_MAX_INT_T_VALUE / (60 * 60);
               scale = 60 * 60;
               break;
   
           case 'm':
               if (p < last && *p == 's') {
                   if (is_sec || step >= st_msec) {
                       return NGX_ERROR;
                   }
                   p++;
                   step = st_msec;
                   max = NGX_MAX_INT_T_VALUE;
                   scale = 1;
                   break;
               }
   
               if (step >= st_min) {
                   return NGX_ERROR;
               }
               step = st_min;
               max = NGX_MAX_INT_T_VALUE / 60;
               scale = 60;
               break;
   
           case 's':
               if (step >= st_sec) {
                   return NGX_ERROR;
               }
               step = st_sec;
               max = NGX_MAX_INT_T_VALUE;
               scale = 1;
               break;
   
           case ' ':
               if (step >= st_sec) {
                   return NGX_ERROR;
               }
               step = st_last;
               max = NGX_MAX_INT_T_VALUE;
               scale = 1;
               break;
   
           default:
               return NGX_ERROR;
           }
   
           if (step != st_msec && !is_sec) {
               scale *= 1000;
               max /= 1000;
           }
   
           if (value > max) {
               return NGX_ERROR;
           }
   
           value *= scale;
   
           if (total > NGX_MAX_INT_T_VALUE - value) {
               return NGX_ERROR;
           }
   
           total += value;
   
           value = 0;
   
           while (p < last && *p == ' ') {
               p++;
           }
       }
   
       if (!valid) {
           return NGX_ERROR;
       }
   
       if (!is_sec) {
           if (value > NGX_MAX_INT_T_VALUE / 1000) {
               return NGX_ERROR;
           }
   
           value *= 1000;
       }
   
       if (total > NGX_MAX_INT_T_VALUE - value) {
           return NGX_ERROR;
       }
   
       return total + value;
   }
   ```
   
   The input param `is_sec` is 0. So the variable `step` in L136 is assigned to `st_month`. 
   ```c
   step = is_sec ? st_start : st_month;
   ```
   
   Seems like to go to `case ' ':` branch. Then the variable `step` in L233 is assigned to `st_last`. 
   ```c
   step = st_last;
   ```
   
   Then the `if (step != st_msec && !is_sec)` branch in L242 makes `scale` to 1000 timed. 
   ```c
   scale *= 1000;
   ```
   
   Is this what you said, "nginx treats it a duration in seconds"?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [apisix] diaosj closed issue #4010: request help: question about dns_resolver_valid and resolver_timeout

Posted by GitBox <gi...@apache.org>.
diaosj closed issue #4010:
URL: https://github.com/apache/apisix/issues/4010


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [apisix] tokers commented on issue #4010: request help: question about dns_resolver_valid and resolver_timeout

Posted by GitBox <gi...@apache.org>.
tokers commented on issue #4010:
URL: https://github.com/apache/apisix/issues/4010#issuecomment-816338481


   > What's the default unit?
   
   `ngx_conf_set_msec_slot` calls `ngx_parse_time`, in such a case, when the time doesn't contain the unit, nginx treats it a duration in seconds.
   
   > In older versions, both dns_resolver_valid and resolver_timeout are enabled. Now only resolver_timeout is enabled in config.yaml. Curious about this change. ^_^
   
   Now by default we use the ttl field in the DNS response as the cache ttl.
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [apisix] tokers commented on issue #4010: request help: question about dns_resolver_valid and resolver_timeout

Posted by GitBox <gi...@apache.org>.
tokers commented on issue #4010:
URL: https://github.com/apache/apisix/issues/4010#issuecomment-816412900


   Variable `step` doesn't have a chance to be used since all chars in `line` is digital.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [apisix] diaosj closed issue #4010: request help: question about dns_resolver_valid and resolver_timeout

Posted by GitBox <gi...@apache.org>.
diaosj closed issue #4010:
URL: https://github.com/apache/apisix/issues/4010


   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org