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:
parent
ae24f7d787
commit
5b10b58c9f
|
@ -41,8 +41,7 @@
|
||||||
dirty_get_connections/0,
|
dirty_get_connections/0,
|
||||||
allow_host/2,
|
allow_host/2,
|
||||||
incoming_s2s_number/0,
|
incoming_s2s_number/0,
|
||||||
outgoing_s2s_number/0,
|
outgoing_s2s_number/0
|
||||||
migrate/1
|
|
||||||
]).
|
]).
|
||||||
|
|
||||||
%% gen_server callbacks
|
%% gen_server callbacks
|
||||||
|
@ -96,29 +95,18 @@ remove_connection(FromTo, Pid, Key) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
have_connection(FromTo) ->
|
have_connection(FromTo) ->
|
||||||
case ejabberd_cluster:get_node(FromTo) of
|
case mnesia:dirty_read(s2s, FromTo) of
|
||||||
Node when Node == node() ->
|
[_] ->
|
||||||
case mnesia:dirty_read(s2s, FromTo) of
|
true;
|
||||||
[_] ->
|
_ ->
|
||||||
true;
|
false
|
||||||
_ ->
|
|
||||||
false
|
|
||||||
end;
|
|
||||||
Node ->
|
|
||||||
case catch rpc:call(Node, mnesia, dirty_read,
|
|
||||||
[s2s, FromTo], 5000) of
|
|
||||||
[_] ->
|
|
||||||
true;
|
|
||||||
_ ->
|
|
||||||
false
|
|
||||||
end
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
has_key(FromTo, Key) ->
|
has_key(FromTo, Key) ->
|
||||||
Query = [{#s2s{fromto = FromTo, key = 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() ->
|
Node when Node == node() ->
|
||||||
case mnesia:dirty_select(s2s, Query) of
|
case mnesia:dirty_select(s2s, Query) of
|
||||||
[] ->
|
[] ->
|
||||||
|
@ -137,26 +125,15 @@ has_key(FromTo, Key) ->
|
||||||
end.
|
end.
|
||||||
|
|
||||||
get_connections_pids(FromTo) ->
|
get_connections_pids(FromTo) ->
|
||||||
case ejabberd_cluster:get_node(FromTo) of
|
case catch mnesia:dirty_read(s2s, FromTo) of
|
||||||
Node when Node == node() ->
|
L when is_list(L) ->
|
||||||
case catch mnesia:dirty_read(s2s, FromTo) of
|
[Connection#s2s.pid || Connection <- L];
|
||||||
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.
|
end.
|
||||||
|
|
||||||
try_register(FromTo) ->
|
try_register(FromTo) ->
|
||||||
Key = randoms:get_string(),
|
Key = new_key(),
|
||||||
MaxS2SConnectionsNumber = max_s2s_connections_number(FromTo),
|
MaxS2SConnectionsNumber = max_s2s_connections_number(FromTo),
|
||||||
MaxS2SConnectionsNumberPerNode =
|
MaxS2SConnectionsNumberPerNode =
|
||||||
max_s2s_connections_number_per_node(FromTo),
|
max_s2s_connections_number_per_node(FromTo),
|
||||||
|
@ -195,22 +172,6 @@ dirty_get_connections() ->
|
||||||
end
|
end
|
||||||
end, ejabberd_cluster:get_nodes()).
|
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
|
%% gen_server callbacks
|
||||||
%%====================================================================
|
%%====================================================================
|
||||||
|
@ -228,7 +189,6 @@ init([]) ->
|
||||||
{type, bag}, {local_content, true},
|
{type, bag}, {local_content, true},
|
||||||
{attributes, record_info(fields, s2s)}]),
|
{attributes, record_info(fields, s2s)}]),
|
||||||
mnesia:add_table_copy(s2s, node(), ram_copies),
|
mnesia:add_table_copy(s2s, node(), ram_copies),
|
||||||
ejabberd_hooks:add(node_hash_update, ?MODULE, migrate, 100),
|
|
||||||
ejabberd_commands:register_commands(commands()),
|
ejabberd_commands:register_commands(commands()),
|
||||||
{ok, #state{}}.
|
{ok, #state{}}.
|
||||||
|
|
||||||
|
@ -280,7 +240,6 @@ handle_info(_Info, State) ->
|
||||||
%% The return value is ignored.
|
%% The return value is ignored.
|
||||||
%%--------------------------------------------------------------------
|
%%--------------------------------------------------------------------
|
||||||
terminate(_Reason, _State) ->
|
terminate(_Reason, _State) ->
|
||||||
ejabberd_hooks:delete(node_hash_update, ?MODULE, migrate, 100),
|
|
||||||
ejabberd_commands:unregister_commands(commands()),
|
ejabberd_commands:unregister_commands(commands()),
|
||||||
ok.
|
ok.
|
||||||
|
|
||||||
|
@ -297,15 +256,6 @@ code_change(_OldVsn, State, _Extra) ->
|
||||||
do_route(From, To, Packet) ->
|
do_route(From, To, Packet) ->
|
||||||
?DEBUG("s2s manager~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
|
?DEBUG("s2s manager~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
|
||||||
[From, To, Packet, 8]),
|
[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
|
case find_connection(From, To) of
|
||||||
{atomic, Pid} when is_pid(Pid) ->
|
{atomic, Pid} when is_pid(Pid) ->
|
||||||
?DEBUG("sending to process ~p~n", [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,
|
new_connection(MyServer, Server, From, FromTo,
|
||||||
MaxS2SConnectionsNumber, MaxS2SConnectionsNumberPerNode) ->
|
MaxS2SConnectionsNumber, MaxS2SConnectionsNumberPerNode) ->
|
||||||
Key = randoms:get_string(),
|
Key = new_key(),
|
||||||
{ok, Pid} = ejabberd_s2s_out:start(
|
{ok, Pid} = ejabberd_s2s_out:start(
|
||||||
MyServer, Server, {new, Key}),
|
MyServer, Server, {new, Key}),
|
||||||
F = fun() ->
|
F = fun() ->
|
||||||
|
@ -456,6 +406,20 @@ needed_connections_number(Ls, MaxS2SConnectionsNumber,
|
||||||
lists:min([MaxS2SConnectionsNumber - length(Ls),
|
lists:min([MaxS2SConnectionsNumber - length(Ls),
|
||||||
MaxS2SConnectionsNumberPerNode - length(LocalLs)]).
|
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
|
%% Function: is_service(From, To) -> true | false
|
||||||
%% Description: Return true if the destination must be considered as a
|
%% Description: Return true if the destination must be considered as a
|
||||||
|
|
|
@ -131,7 +131,7 @@
|
||||||
%%% API
|
%%% API
|
||||||
%%%----------------------------------------------------------------------
|
%%%----------------------------------------------------------------------
|
||||||
start(From, Host, Type) ->
|
start(From, Host, Type) ->
|
||||||
Node = ejabberd_cluster:get_node({From, Host}),
|
Node = node(),
|
||||||
?SUPERVISOR_START.
|
?SUPERVISOR_START.
|
||||||
|
|
||||||
start_link(From, Host, Type) ->
|
start_link(From, Host, Type) ->
|
||||||
|
|
Loading…
Reference in New Issue
Block a user