# HG changeset patch # User Ruslan Ermilov <r...@nginx.com> # Date 1645589387 -10800 # Wed Feb 23 07:09:47 2022 +0300 # Node ID e80adbf788f6796c6bdf415938abb19b7aa43e3e # Parent 04e314eb6b4d20a48c5d7bab0609e1b03b51b406 The "sort=" parameter of the "resolver" directive.
diff -r 04e314eb6b4d -r e80adbf788f6 src/core/ngx_resolver.c --- a/src/core/ngx_resolver.c Wed Feb 23 07:08:37 2022 +0300 +++ b/src/core/ngx_resolver.c Wed Feb 23 07:09:47 2022 +0300 @@ -227,6 +227,7 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_ } #if (NGX_HAVE_INET6) + if (ngx_strncmp(names[i].data, "ipv4=", 5) == 0) { if (ngx_strcmp(&names[i].data[5], "on") == 0) { @@ -260,6 +261,24 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_ continue; } + + if (ngx_strncmp(names[i].data, "prefer=", 7) == 0) { + + if (ngx_strcmp(&names[i].data[7], "ipv4") == 0) { + r->prefer = NGX_RESOLVE_PREFER_A; + + } else if (ngx_strcmp(&names[i].data[7], "ipv6") == 0) { + r->prefer = NGX_RESOLVE_PREFER_AAAA; + + } else { + ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, + "invalid parameter: %V", &names[i]); + return NULL; + } + + continue; + } + #endif ngx_memzero(&u, sizeof(ngx_url_t)); @@ -4250,7 +4269,27 @@ ngx_resolver_export(ngx_resolver_t *r, n } i = 0; - d = rotate ? ngx_random() % n : 0; + + switch (r->prefer) { + +#if (NGX_HAVE_INET6) + case NGX_RESOLVE_PREFER_A: + d = 0; + break; + + case NGX_RESOLVE_PREFER_AAAA: + d = rn->naddrs6; + + if (d == n) { + d = 0; + } + + break; +#endif + + default: + d = rotate ? ngx_random() % n : 0; + } if (rn->naddrs) { j = rotate ? ngx_random() % rn->naddrs : 0; diff -r 04e314eb6b4d -r e80adbf788f6 src/core/ngx_resolver.h --- a/src/core/ngx_resolver.h Wed Feb 23 07:08:37 2022 +0300 +++ b/src/core/ngx_resolver.h Wed Feb 23 07:09:47 2022 +0300 @@ -36,6 +36,9 @@ #define NGX_RESOLVER_MAX_RECURSION 50 +#define NGX_RESOLVE_PREFER_A 1 +#define NGX_RESOLVE_PREFER_AAAA 2 + typedef struct ngx_resolver_s ngx_resolver_t; @@ -175,6 +178,8 @@ struct ngx_resolver_s { ngx_queue_t srv_expire_queue; ngx_queue_t addr_expire_queue; + unsigned prefer:2; + unsigned ipv4:1; #if (NGX_HAVE_INET6) _______________________________________________ nginx-devel mailing list -- nginx-devel@nginx.org To unsubscribe send an email to nginx-devel-le...@nginx.org