24
1
mirror of https://github.com/processone/ejabberd.git synced 2024-07-14 23:44:18 +02:00

Do not hash s2s connections

This commit is contained in:
Evgeniy Khramtsov 2011-04-13 21:05:52 +10:00
parent ae24f7d787
commit 5b10b58c9f
2 changed files with 29 additions and 65 deletions

View File

@ -41,8 +41,7 @@
dirty_get_connections/0,
allow_host/2,
incoming_s2s_number/0,
outgoing_s2s_number/0,
migrate/1
outgoing_s2s_number/0
]).
%% gen_server callbacks
@ -96,29 +95,18 @@ remove_connection(FromTo, Pid, Key) ->
end.
have_connection(FromTo) ->
case ejabberd_cluster:get_node(FromTo) of
Node when Node == node() ->
case mnesia:dirty_read(s2s, FromTo) of
[_] ->
true;
_ ->
false
end;
Node ->
case catch rpc:call(Node, mnesia, dirty_read,
[s2s, FromTo], 5000) of
[_] ->
true;
_ ->
false
end
end.
has_key(FromTo, Key) ->
Query = [{#s2s{fromto = FromTo, key = Key, _ = '_'},
[],
['$_']}],
case ejabberd_cluster:get_node(FromTo) of
case get_node_by_key(Key) of
Node when Node == node() ->
case mnesia:dirty_select(s2s, Query) of
[] ->
@ -137,26 +125,15 @@ has_key(FromTo, Key) ->
end.
get_connections_pids(FromTo) ->
case ejabberd_cluster:get_node(FromTo) of
Node when Node == node() ->
case catch mnesia:dirty_read(s2s, FromTo) of
L when is_list(L) ->
[Connection#s2s.pid || Connection <- L];
_ ->
[]
end;
Node ->
case catch rpc:call(Node, mnesia, dirty_read,
[s2s, FromTo], 5000) of
L when is_list(L) ->
[Connection#s2s.pid || Connection <- L];
_ ->
[]
end
end.
try_register(FromTo) ->
Key = randoms:get_string(),
Key = new_key(),
MaxS2SConnectionsNumber = max_s2s_connections_number(FromTo),
MaxS2SConnectionsNumberPerNode =
max_s2s_connections_number_per_node(FromTo),
@ -195,22 +172,6 @@ dirty_get_connections() ->
end
end, ejabberd_cluster:get_nodes()).
migrate(After) ->
Ss = mnesia:dirty_select(
s2s,
[{#s2s{fromto = '$1', pid = '$2', _ = '_'},
[],
['$$']}]),
lists:foreach(
fun([FromTo, Pid]) ->
case ejabberd_cluster:get_node(FromTo) of
Node when Node /= node() ->
ejabberd_s2s_out:stop_connection(Pid, After);
_ ->
ok
end
end, Ss).
%%====================================================================
%% gen_server callbacks
%%====================================================================
@ -228,7 +189,6 @@ init([]) ->
{type, bag}, {local_content, true},
{attributes, record_info(fields, s2s)}]),
mnesia:add_table_copy(s2s, node(), ram_copies),
ejabberd_hooks:add(node_hash_update, ?MODULE, migrate, 100),
ejabberd_commands:register_commands(commands()),
{ok, #state{}}.
@ -280,7 +240,6 @@ handle_info(_Info, State) ->
%% The return value is ignored.
%%--------------------------------------------------------------------
terminate(_Reason, _State) ->
ejabberd_hooks:delete(node_hash_update, ?MODULE, migrate, 100),
ejabberd_commands:unregister_commands(commands()),
ok.
@ -297,15 +256,6 @@ code_change(_OldVsn, State, _Extra) ->
do_route(From, To, Packet) ->
?DEBUG("s2s manager~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
[From, To, Packet, 8]),
FromTo = {From#jid.lserver, To#jid.lserver},
case ejabberd_cluster:get_node(FromTo) of
Node when Node == node() ->
do_route1(From, To, Packet);
Node ->
{?MODULE, Node} ! {route, From, To, Packet}
end.
do_route1(From, To, Packet) ->
case find_connection(From, To) of
{atomic, Pid} when is_pid(Pid) ->
?DEBUG("sending to process ~p~n", [Pid]),
@ -408,7 +358,7 @@ open_several_connections(N, MyServer, Server, From, FromTo,
new_connection(MyServer, Server, From, FromTo,
MaxS2SConnectionsNumber, MaxS2SConnectionsNumberPerNode) ->
Key = randoms:get_string(),
Key = new_key(),
{ok, Pid} = ejabberd_s2s_out:start(
MyServer, Server, {new, Key}),
F = fun() ->
@ -456,6 +406,20 @@ needed_connections_number(Ls, MaxS2SConnectionsNumber,
lists:min([MaxS2SConnectionsNumber - length(Ls),
MaxS2SConnectionsNumberPerNode - length(LocalLs)]).
%%%-------------------------------------------------------------------
%%% Dialback keys stuff
%%%-------------------------------------------------------------------
new_key() ->
randoms:get_string() ++ "-" ++ ejabberd_cluster:node_id().
get_node_by_key(Key) ->
case string:tokens(Key, "-") of
[_, NodeID] ->
ejabberd_cluster:get_node_by_id(NodeID);
_ ->
node()
end.
%%--------------------------------------------------------------------
%% Function: is_service(From, To) -> true | false
%% Description: Return true if the destination must be considered as a

View File

@ -131,7 +131,7 @@
%%% API
%%%----------------------------------------------------------------------
start(From, Host, Type) ->
Node = ejabberd_cluster:get_node({From, Host}),
Node = node(),
?SUPERVISOR_START.
start_link(From, Host, Type) ->