diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-02-20 10:42:16 +0300 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2017-02-20 10:42:16 +0300 |
commit | 9426c673024fd0344c3c1f89754dbe8d90c8b452 (patch) | |
tree | c5315e5bec98958216d0c78672cb5c08aef7f835 | |
parent | Merge pull request #1555 from weiss/count-session-iq (diff) |
Fix s2s_dns_timeout issues
-rw-r--r-- | src/ejabberd_s2s_out.erl | 2 | ||||
-rw-r--r-- | src/xmpp_stream_out.erl | 15 |
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} -> |