<div dir="ltr">Hello,<div><br></div><div>Maybe the description/title of the patch should reflect latest code changes: "sort=" => "prefer=".</div><div><br></div><div>A. </div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jun 28, 2022 at 6:25 PM Sergey Kandaurov <<a href="mailto:pluknet@nginx.com">pluknet@nginx.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"># HG changeset patch<br>
# User Ruslan Ermilov <<a href="mailto:ru@nginx.com" target="_blank">ru@nginx.com</a>><br>
# Date 1645589387 -10800<br>
#      Wed Feb 23 07:09:47 2022 +0300<br>
# Node ID e80adbf788f6796c6bdf415938abb19b7aa43e3e<br>
# Parent  04e314eb6b4d20a48c5d7bab0609e1b03b51b406<br>
The "sort=" parameter of the "resolver" directive.<br>
<br>
diff -r 04e314eb6b4d -r e80adbf788f6 src/core/ngx_resolver.c<br>
--- a/src/core/ngx_resolver.c   Wed Feb 23 07:08:37 2022 +0300<br>
+++ b/src/core/ngx_resolver.c   Wed Feb 23 07:09:47 2022 +0300<br>
@@ -227,6 +227,7 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_<br>
         }<br>
<br>
 #if (NGX_HAVE_INET6)<br>
+<br>
         if (ngx_strncmp(names[i].data, "ipv4=", 5) == 0) {<br>
<br>
             if (ngx_strcmp(&names[i].data[5], "on") == 0) {<br>
@@ -260,6 +261,24 @@ ngx_resolver_create(ngx_conf_t *cf, ngx_<br>
<br>
             continue;<br>
         }<br>
+<br>
+        if (ngx_strncmp(names[i].data, "prefer=", 7) == 0) {<br>
+<br>
+            if (ngx_strcmp(&names[i].data[7], "ipv4") == 0) {<br>
+                r->prefer = NGX_RESOLVE_PREFER_A;<br>
+<br>
+            } else if (ngx_strcmp(&names[i].data[7], "ipv6") == 0) {<br>
+                r->prefer = NGX_RESOLVE_PREFER_AAAA;<br>
+<br>
+            } else {<br>
+                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,<br>
+                                   "invalid parameter: %V", &names[i]);<br>
+                return NULL;<br>
+            }<br>
+<br>
+            continue;<br>
+        }<br>
+<br>
 #endif<br>
<br>
         ngx_memzero(&u, sizeof(ngx_url_t));<br>
@@ -4250,7 +4269,27 @@ ngx_resolver_export(ngx_resolver_t *r, n<br>
     }<br>
<br>
     i = 0;<br>
-    d = rotate ? ngx_random() % n : 0;<br>
+<br>
+    switch (r->prefer) {<br>
+<br>
+#if (NGX_HAVE_INET6)<br>
+    case NGX_RESOLVE_PREFER_A:<br>
+        d = 0;<br>
+        break;<br>
+<br>
+    case NGX_RESOLVE_PREFER_AAAA:<br>
+        d = rn->naddrs6;<br>
+<br>
+        if (d == n) {<br>
+            d = 0;<br>
+        }<br>
+<br>
+        break;<br>
+#endif<br>
+<br>
+    default:<br>
+        d = rotate ? ngx_random() % n : 0;<br>
+    }<br>
<br>
     if (rn->naddrs) {<br>
         j = rotate ? ngx_random() % rn->naddrs : 0;<br>
diff -r 04e314eb6b4d -r e80adbf788f6 src/core/ngx_resolver.h<br>
--- a/src/core/ngx_resolver.h   Wed Feb 23 07:08:37 2022 +0300<br>
+++ b/src/core/ngx_resolver.h   Wed Feb 23 07:09:47 2022 +0300<br>
@@ -36,6 +36,9 @@<br>
<br>
 #define NGX_RESOLVER_MAX_RECURSION    50<br>
<br>
+#define NGX_RESOLVE_PREFER_A          1<br>
+#define NGX_RESOLVE_PREFER_AAAA       2<br>
+<br>
<br>
 typedef struct ngx_resolver_s  ngx_resolver_t;<br>
<br>
@@ -175,6 +178,8 @@ struct ngx_resolver_s {<br>
     ngx_queue_t               srv_expire_queue;<br>
     ngx_queue_t               addr_expire_queue;<br>
<br>
+    unsigned                  prefer:2;<br>
+<br>
     unsigned                  ipv4:1;<br>
<br>
 #if (NGX_HAVE_INET6)<br>
<br>
_______________________________________________<br>
nginx-devel mailing list -- <a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
To unsubscribe send an email to <a href="mailto:nginx-devel-leave@nginx.org" target="_blank">nginx-devel-leave@nginx.org</a><br>
</blockquote></div>