@@ -52,6 +52,8 @@ defmodule DNSCluster do
5252 The value `:ignore` can be used to ignore starting the DNSCluster.
5353 * `:resource_types` - the resource record types that are used for node discovery.
5454 Defaults to `[:a, :aaaa]` and also supports the `:srv` type.
55+ * `:address_type` - whether there is an ip address or a hostname in the node names.
56+ Defaults to `:ip`.
5557 * `:interval` - the millisec interval between DNS queries. Defaults to `5000`.
5658 * `:connect_timeout` - the millisec timeout to allow discovered nodes to connect.
5759 Defaults to `10_000`.
@@ -69,6 +71,7 @@ defmodule DNSCluster do
6971 end
7072
7173 @ valid_resource_types [ :a , :aaaa , :srv ]
74+ @ valid_address_types [ :ip , :hostname ]
7275
7376 @ impl true
7477 def init ( opts ) do
@@ -82,6 +85,9 @@ defmodule DNSCluster do
8285 resource_types = Keyword . get ( opts , :resource_types , [ :a , :aaaa ] )
8386 validate_resource_types! ( resource_types )
8487
88+ address_type = Keyword . get ( opts , :address_type , :ip )
89+ validate_address_type! ( address_type )
90+
8591 warn_on_invalid_dist ( )
8692
8793 resolver = Keyword . get ( opts , :resolver , Resolver )
@@ -91,6 +97,7 @@ defmodule DNSCluster do
9197 basename: resolver . basename ( node ( ) ) ,
9298 query: List . wrap ( query ) ,
9399 resource_types: resource_types ,
100+ address_type: address_type ,
94101 log: Keyword . get ( opts , :log , false ) ,
95102 poll_timer: nil ,
96103 connect_timeout: Keyword . get ( opts , :connect_timeout , 10_000 ) ,
@@ -131,9 +138,9 @@ defmodule DNSCluster do
131138 |> Enum . filter ( fn node_name -> ! Enum . member? ( node_names , node_name ) end )
132139 |> Task . async_stream (
133140 fn new_name ->
134- if resolver . connect_node ( :"#{ new_name } " ) do
135- log ( state , "#{ node ( ) } connected to #{ new_name } " )
136- end
141+ # if resolver.connect_node(:"#{new_name}") do
142+ log ( state , "#{ node ( ) } connected to #{ new_name } " )
143+ # end
137144 end ,
138145 max_concurrency: max ( 1 , length ( addresses ) ) ,
139146 timeout: timeout
@@ -152,16 +159,31 @@ defmodule DNSCluster do
152159 end
153160
154161 defp discover_addresses (
155- % { resolver: resolver , query: queries , resource_types: resource_types } = state
162+ % {
163+ resolver: resolver ,
164+ query: queries ,
165+ resource_types: resource_types ,
166+ address_type: address_type
167+ } = state
156168 ) do
169+ lookup =
170+ cond do
171+ function_exported? ( resolver , :lookup , 3 ) -> & resolver . lookup / 3
172+ address_type == :hostname -> & resolver . lookup / 3
173+ true -> fn q , rt , _at -> resolver . lookup ( q , rt ) end
174+ end
175+
157176 for resource_type <- resource_types ,
158177 query <- queries ,
159178 basename = basename_from_query_or_state ( query , state ) ,
160- addr <- resolver . lookup ( query , resource_type ) do
179+ addr <- lookup . ( query , resource_type , address_type ) do
161180 { basename , addr }
162181 end
163182 |> Enum . uniq ( )
164- |> Enum . map ( fn { basename , addr } -> { basename , to_string ( :inet . ntoa ( addr ) ) } end )
183+ |> Enum . map ( fn
184+ { basename , ip } when is_tuple ( ip ) -> { basename , to_string ( :inet . ntoa ( ip ) ) }
185+ { basename , hostname } -> { basename , hostname }
186+ end )
165187 end
166188
167189 defp basename_from_query_or_state ( { basename , _query } , _state ) , do: basename
@@ -190,6 +212,13 @@ defmodule DNSCluster do
190212 end
191213 end
192214
215+ defp validate_address_type! ( address_type ) do
216+ if address_type not in @ valid_address_types do
217+ raise ArgumentError ,
218+ "expected :address_type to be one of [:ip, :hostname], got: #{ inspect ( address_type ) } "
219+ end
220+ end
221+
193222 defp warn_on_invalid_dist do
194223 release? = is_binary ( System . get_env ( "RELEASE_NAME" ) )
195224 net_state = if function_exported? ( :net_kernel , :get_state , 0 ) , do: :net_kernel . get_state ( )
0 commit comments