aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-02-20 10:42:16 +0300
committerEvgeniy Khramtsov <ekhramtsov@process-one.net>2017-02-20 10:42:16 +0300
commit9426c673024fd0344c3c1f89754dbe8d90c8b452 (patch)
treec5315e5bec98958216d0c78672cb5c08aef7f835
parentMerge pull request #1555 from weiss/count-session-iq (diff)
Fix s2s_dns_timeout issues
-rw-r--r--src/ejabberd_s2s_out.erl2
-rw-r--r--src/xmpp_stream_out.erl15
2 files changed, 14 insertions, 3 deletions
diff --git a/src/ejabberd_s2s_out.erl b/src/ejabberd_s2s_out.erl
index 614da2325..909177266 100644
--- a/src/ejabberd_s2s_out.erl
+++ b/src/ejabberd_s2s_out.erl
@@ -404,7 +404,7 @@ transform_options({s2s_dns_options, S2SDNSOpts}, AllOpts) ->
transform_options({Opt, T}, Opts)
when Opt == outgoing_s2s_timeout; Opt == s2s_dns_timeout ->
maybe_report_huge_timeout(Opt, T),
- [{outgoing_s2s_timeout, T}|Opts];
+ [{Opt, T}|Opts];
transform_options(Opt, Opts) ->
[Opt|Opts].
diff --git a/src/xmpp_stream_out.erl b/src/xmpp_stream_out.erl
index 0843780f6..5efc940c2 100644
--- a/src/xmpp_stream_out.erl
+++ b/src/xmpp_stream_out.erl
@@ -886,9 +886,20 @@ a_lookup([], _State, Err) ->
a_lookup(_Host, _Port, _Family, _Timeout, Retries) when Retries < 1 ->
{error, timeout};
a_lookup(Host, Port, Family, Timeout, Retries) ->
+ Start = p1_time_compat:monotonic_time(milli_seconds),
case inet:gethostbyname(Host, Family, Timeout) of
- {error, timeout} ->
- a_lookup(Host, Port, Family, Timeout, Retries - 1);
+ {error, nxdomain} = Err ->
+ %% inet:gethostbyname/3 doesn't return {error, timeout},
+ %% so we should check if 'nxdomain' is in fact a result
+ %% of a timeout.
+ %% We also cannot use inet_res:gethostbyname/3 because
+ %% it ignores DNS configuration settings (/etc/hosts, etc)
+ End = p1_time_compat:monotonic_time(milli_seconds),
+ if (End - Start) >= Timeout ->
+ a_lookup(Host, Port, Family, Timeout, Retries - 1);
+ true ->
+ Err
+ end;
{error, _} = Err ->
Err;
{ok, HostEntry} ->