aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_s2s.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_s2s.erl')
-rw-r--r--src/ejabberd_s2s.erl63
1 files changed, 33 insertions, 30 deletions
diff --git a/src/ejabberd_s2s.erl b/src/ejabberd_s2s.erl
index 3a2d19a58..fbe6092f0 100644
--- a/src/ejabberd_s2s.erl
+++ b/src/ejabberd_s2s.erl
@@ -106,18 +106,6 @@ have_connection(FromTo) ->
false
end.
-%get_key(FromTo) ->
-% F = fun() ->
-% [E] = mnesia:read({s2s, FromTo}),
-% E
-% end,
-% case mnesia:transaction(F) of
-% {atomic, E} ->
-% E#s2s.key;
-% _ ->
-% ""
-% end.
-
get_key(FromTo) ->
case catch mnesia:dirty_read(s2s, FromTo) of
[E] ->
@@ -159,24 +147,7 @@ do_route(From, To, Packet) ->
{User, Server, Resource} = To,
FromTo = {MyServer, Server},
Key = randoms:get_string(),
- F = fun() ->
- case mnesia:read({local_s2s, FromTo}) of
- [] ->
- case mnesia:read({s2s, FromTo}) of
- [Er] ->
- {remote, Er#s2s.node};
- [] ->
- % TODO
- mnesia:write(#s2s{fromto = FromTo,
- node = node(),
- key = Key}),
- new
- end;
- [El] ->
- {local, El#local_s2s.pid}
- end
- end,
- case mnesia:transaction(F) of
+ case find_connection(FromTo, Key) of
{atomic, {local, Pid}} ->
?DEBUG("sending to process ~p~n", [Pid]),
% TODO
@@ -211,6 +182,38 @@ do_route(From, To, Packet) ->
false
end.
+find_connection(FromTo, Key) ->
+ F = fun() ->
+ case mnesia:read({local_s2s, FromTo}) of
+ [] ->
+ case mnesia:read({s2s, FromTo}) of
+ [Er] ->
+ {remote, Er#s2s.node};
+ [] ->
+ mnesia:write(#s2s{fromto = FromTo,
+ node = node(),
+ key = Key}),
+ new
+ end;
+ [El] ->
+ {local, El#local_s2s.pid}
+ end
+ end,
+ case catch mnesia:dirty_read({local_s2s, FromTo}) of
+ {'EXIT', Reason} ->
+ {aborted, Reason};
+ [] ->
+ case catch mnesia:dirty_read({s2s, FromTo}) of
+ [Er] ->
+ {atomic, {remote, Er#s2s.node}};
+ [] ->
+ mnesia:transaction(F)
+ end;
+ [El] ->
+ {atomic, {local, El#local_s2s.pid}}
+ end.
+
+
send_element(Pid, El) ->
Pid ! {send_element, El}.