<div dir="ltr">Do you happen to know if there remains any gap in obvious capability provided by a module like jdomain compared to this?<br><div><br></div><div>Perhaps it would be worth checking to ensure nothing obvious is not implemented?</div><div><br></div><div>The one that I see is the ability to control if a resolution is IPv4, IPv6 or mixed. Is this something that would be useful for this feature?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, 12 Jul 2024 at 02:40, Aleksei Bavshin <<a href="mailto:a.bavshin@nginx.com">a.bavshin@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">On 7/9/2024 9:22 AM, Roman Arutyunyan wrote:<br>
> Hi,<br>
> <br>
> On Mon, Jul 08, 2024 at 06:20:58PM +0400, Roman Arutyunyan wrote:<br>
>> Hi,<br>
>><br>
>> On Thu, Jun 13, 2024 at 03:28:56PM -0700, Aleksei Bavshin wrote:<br>
>>> # HG changeset patch<br>
>>> # User Ruslan Ermilov <<a href="mailto:ru@nginx.com" target="_blank">ru@nginx.com</a>><br>
>>> # Date 1392462754 -14400<br>
>>> #      Sat Feb 15 15:12:34 2014 +0400<br>
>>> # Node ID 56aeae9355df8a2ee07e21b65b6869747dd9ee45<br>
>>> # Parent  02e9411009b987f408214ab4a8b6b6093f843bcd<br>
>>> Upstream: re-resolvable servers.<br>
>>><br>
>>> Specifying the upstream server by a hostname together with the<br>
>>> "resolve" parameter will make the hostname to be periodically<br>
>>> resolved, and upstream servers added/removed as necessary.<br>
>>><br>
>>> This requires a "resolver" at the "http" configuration block.<br>
>>><br>
>>> The "resolver_timeout" parameter also affects when the failed<br>
>>> DNS requests will be attempted again.  Responses with NXDOMAIN<br>
>>> will be attempted again in 10 seconds.<br>
>>><br>
>>> Upstream has a configuration generation number that is incremented each<br>
>>> time servers are added/removed to the primary/backup list.  This number<br>
>>> is remembered by the peer.init method, and if peer.get detects a change<br>
>>> in configuration, it returns NGX_BUSY.<br>
>>><br>
>>> Each server has a reference counter.  It is incremented by peer.get and<br>
>>> decremented by peer.free.  When a server is removed, it is removed from<br>
>>> the list of servers and is marked as "zombie".  The memory allocated by<br>
>>> a zombie peer is freed only when its reference count becomes zero.<br>
>>><br>
>>> Re-resolvable servers utilize timers that also hold a reference.  A<br>
>>> reference is also held while upstream keepalive caches an idle<br>
>>> connection.<br>
>>><br>
>>> Co-authored-by: Roman Arutyunyan <<a href="mailto:arut@nginx.com" target="_blank">arut@nginx.com</a>><br>
>>> Co-authored-by: Sergey Kandaurov <<a href="mailto:pluknet@nginx.com" target="_blank">pluknet@nginx.com</a>><br>
>>> Co-authored-by: Vladimir Homutov <<a href="mailto:vl@nginx.com" target="_blank">vl@nginx.com</a>><br>
> <br>
> [..]<br>
> <br>
>>> diff --git a/src/http/ngx_http_upstream_round_robin.h b/src/http/ngx_http_upstream_round_robin.h<br>
>>> --- a/src/http/ngx_http_upstream_round_robin.h<br>
>>> +++ b/src/http/ngx_http_upstream_round_robin.h<br>
>>> @@ -14,8 +14,23 @@<br>
>>>   #include <ngx_http.h><br>
>>>   <br>
>>>   <br>
>>> +typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;<br>
>>>   typedef struct ngx_http_upstream_rr_peer_s   ngx_http_upstream_rr_peer_t;<br>
>>>   <br>
>>> +<br>
>>> +#if (NGX_HTTP_UPSTREAM_ZONE)<br>
>>> +<br>
>>> +typedef struct {<br>
>>> +    ngx_event_t                     event;         /* must be first */<br>
>>> +    ngx_uint_t                      worker;<br>
> <br>
> Missed this last time.  This field should be removed since all resolving is in<br>
> worker #0.<br>
<br>
Unfortunately, that would break the ABI compatibility between OSS and <br>
Plus. Replacing the field with yet another NGX_COMPAT_BEGIN isn't any <br>
better than leaving it in the opensource code.<br>
<br>
> <br>
>>> +    ngx_str_t                       name;<br>
>>> +    ngx_http_upstream_rr_peers_t   *peers;<br>
>>> +    ngx_http_upstream_rr_peer_t    *peer;<br>
>>> +} ngx_http_upstream_host_t;<br>
>>> +<br>
>>> +#endif<br>
>>> +<br>
>>> +<br>
>>>   struct ngx_http_upstream_rr_peer_s {<br>
>>>       struct sockaddr                *sockaddr;<br>
>>>       socklen_t                       socklen;<br>
>>> @@ -46,7 +61,12 @@ struct ngx_http_upstream_rr_peer_s {<br>
>>>   #endif<br>
>>>   <br>
>>>   #if (NGX_HTTP_UPSTREAM_ZONE)<br>
>>> +    unsigned                        zombie:1;<br>
>><br>
>> I suggest declaring this as in other similar places:<br>
>><br>
>>         ngx_uint_t                      zombie; /* unsigned  zombie:1; */<br>
>><br>
>>> +<br>
>>>       ngx_atomic_t                    lock;<br>
>>> +    ngx_uint_t                      id;<br>
>><br>
>> This field is not used in open source nginx and should not be added or assigned.<br>
>><br>
>>> +    ngx_uint_t                      refs;<br>
>>> +    ngx_http_upstream_host_t       *host;<br>
>>>   #endif<br>
>>>   <br>
>>>       ngx_http_upstream_rr_peer_t    *next;<br>
> <br>
> [..]<br>
> <br>
> --<br>
> Roman Arutyunyan<br>
> _______________________________________________<br>
> nginx-devel mailing list<br>
> <a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
> <a href="https://mailman.nginx.org/mailman/listinfo/nginx-devel" rel="noreferrer" target="_blank">https://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
_______________________________________________<br>
nginx-devel mailing list<br>
<a href="mailto:nginx-devel@nginx.org" target="_blank">nginx-devel@nginx.org</a><br>
<a href="https://mailman.nginx.org/mailman/listinfo/nginx-devel" rel="noreferrer" target="_blank">https://mailman.nginx.org/mailman/listinfo/nginx-devel</a><br>
</blockquote></div>