]> granicus.if.org Git - ejabberd/commitdiff
EJAB-994: Implements DNS timeouts and retries.
authorGeoff Cant <geoff.cant@process-one.net>
Thu, 30 Jul 2009 12:34:59 +0000 (12:34 +0000)
committerGeoff Cant <geoff.cant@process-one.net>
Thu, 30 Jul 2009 12:34:59 +0000 (12:34 +0000)
SVN Revision: 2404

src/ejabberd_config.erl
src/ejabberd_s2s_out.erl

index 70d7b5dc7d8b377e4808bce5cee31f06507644b1..d673818c1bb9271dc6240ce31573171472905363 100644 (file)
@@ -343,6 +343,8 @@ process_term(Term, State) ->
            add_option(outgoing_s2s_port, Port, State);
        {outgoing_s2s_options, Methods, Timeout} ->
            add_option(outgoing_s2s_options, {Methods, Timeout}, State);
+        {s2s_dns_options, PropList} ->
+            add_option(s2s_dns_options, PropList, State);
        {s2s_use_starttls, Port} ->
            add_option(s2s_use_starttls, Port, State);
        {s2s_certfile, CertFile} ->
index 338bc9669de41afa74bf19de91695ff87c2025a3..4bd92dc095c62ca1af92c77fcdd5dc872e54a4b0 100644 (file)
@@ -995,11 +995,7 @@ is_verify_res(_) ->
 -include_lib("kernel/include/inet.hrl").
 
 get_addr_port(Server) ->
-    Res = case inet_res:getbyname("_xmpp-server._tcp." ++ Server, srv) of
-             {error, _Reason1} ->
-                 inet_res:getbyname("_jabber._tcp." ++ Server, srv);
-             {ok, _HEnt} = R -> R
-         end,
+    Res = srv_lookup(Server),
     case Res of
        {error, Reason} ->
            ?DEBUG("srv lookup of '~s' failed: ~p~n", [Server, Reason]),
@@ -1036,6 +1032,34 @@ get_addr_port(Server) ->
            end
     end.
 
+srv_lookup(Server) ->
+    Options = case ejabberd_config:get_local_option(s2s_dns_options) of
+                  L when is_list(L) -> L;
+                  _ -> []
+              end,
+    Timeout = proplists:get_value(timeout, Options, timer:seconds(10)),
+    Retries = proplists:get_value(retries, Options, 2),
+    srv_lookup(Server, Timeout, Retries).
+
+%% XXX - this behaviour is suboptimal in the case that the domain
+%% has a "_xmpp-server._tcp." but not a "_jabber._tcp." record and
+%% we don't get a DNS reply for the "_xmpp-server._tcp." lookup. In this
+%% case we'll give up when we get the "_jabber._tcp." nxdomain reply.
+srv_lookup(_Server, _Timeout, Retries) when Retries < 1 ->
+    {error, timeout};
+srv_lookup(Server, Timeout, Retries) ->
+    case inet_res:getbyname("_xmpp-server._tcp." ++ Server, srv, Timeout) of
+        {error, _Reason} ->
+            case inet_res:getbyname("_jabber._tcp." ++ Server, srv, Timeout) of
+                {error, timeout} ->
+                    ?ERROR_MSG("Couldn't resolve SRV records for ~p via nameservers ~p.",
+                               [Server, inet_db:res_option(nameserver)]),
+                    srv_lookup(Server, Timeout, Retries - 1);
+                R -> R
+            end;
+        {ok, _HEnt} = R -> R
+    end.
+
 test_get_addr_port(Server) ->
     lists:foldl(
       fun(_, Acc) ->