aboutsummaryrefslogtreecommitdiff
path: root/src/ejabberd_sm.erl
diff options
context:
space:
mode:
Diffstat (limited to 'src/ejabberd_sm.erl')
-rw-r--r--src/ejabberd_sm.erl37
1 files changed, 35 insertions, 2 deletions
diff --git a/src/ejabberd_sm.erl b/src/ejabberd_sm.erl
index a16f4b4f3..977f6979d 100644
--- a/src/ejabberd_sm.erl
+++ b/src/ejabberd_sm.erl
@@ -62,8 +62,9 @@ loop() ->
end,
loop();
{open_session, User, Resource, From} ->
- replace_and_register_my_connection(User, Resource, From),
- replace_alien_connection(User, Resource),
+ register_connection(User, Resource, From),
+ %replace_and_register_my_connection(User, Resource, From),
+ %replace_alien_connection(User, Resource),
loop();
{close_session, User, Resource} ->
remove_connection(User, Resource),
@@ -101,6 +102,38 @@ open_session(User, Resource) ->
close_session(User, Resource) ->
ejabberd_sm ! {close_session, User, Resource}.
+
+register_connection(User, Resource, Pid) ->
+ LUser = jlib:tolower(User),
+ UR = {LUser, Resource},
+ F = fun() ->
+ Ss = mnesia:wread({session, UR}),
+ Ls = mnesia:wread({local_session, UR}),
+ mnesia:write(#session{ur = UR, user = LUser, node = node()}),
+ mnesia:write(#local_session{ur = UR, pid = Pid}),
+ {Ss, Ls}
+ end,
+ case mnesia:transaction(F) of
+ {atomic, {Ss, Ls}} ->
+ lists:foreach(
+ fun(R) ->
+ if R#session.node /= node() ->
+ {ejabberd_sm, R#session.node} !
+ {replace, User, Resource};
+ true ->
+ ok
+ end
+ end, Ss),
+ lists:foreach(
+ fun(R) ->
+ R#local_session.pid ! replaced
+ end, Ls);
+ _ ->
+ false
+ end.
+
+
+
replace_alien_connection(User, Resource) ->
LUser = jlib:tolower(User),
F = fun() ->