Browse Source

Move sync calls outside of main processes.

This slows down overall, but makes it more even when cluster becomes bigger.
Roberto Ostinelli 5 years ago
parent
commit
22ccb8c6b5
3 changed files with 9 additions and 57 deletions
  1. 2 2
      src/syn_backbone.erl
  2. 4 27
      src/syn_groups.erl
  3. 3 28
      src/syn_registry.erl

+ 2 - 2
src/syn_backbone.erl

@@ -75,7 +75,7 @@ create_registry_table() ->
         {type, set},
         {attributes, record_info(fields, syn_registry_table)},
         {index, [#syn_registry_table.pid]},
-        {storage_properties, [{ets, [{read_concurrency, true}]}]}
+        {storage_properties, [{ets, [{read_concurrency, true}, {write_concurrency, true}]}]}
     ]).
 
 -spec create_groups_table() -> {atomic, ok} | {aborted, Reason :: any()}.
@@ -84,5 +84,5 @@ create_groups_table() ->
         {type, bag},
         {attributes, record_info(fields, syn_groups_table)},
         {index, [#syn_groups_table.pid, #syn_groups_table.node]},
-        {storage_properties, [{ets, [{read_concurrency, true}]}]}
+        {storage_properties, [{ets, [{read_concurrency, true}, {write_concurrency, true}]}]}
     ]).

+ 4 - 27
src/syn_groups.erl

@@ -39,8 +39,9 @@
 -export([multi_call/2, multi_call/3, multi_call_reply/2]).
 
 %% sync API
--export([sync_join/4, sync_leave/3]).
 -export([sync_get_local_group_tuples/1]).
+-export([add_to_local_table/4]).
+-export([remove_from_local_table/2]).
 
 %% gen_server callbacks
 -export([init/1, handle_call/3, handle_cast/2, handle_info/2, terminate/2, code_change/3]).
@@ -180,14 +181,6 @@ multi_call(GroupName, Message, Timeout) ->
 multi_call_reply(CallerPid, Reply) ->
     CallerPid ! {syn_multi_call_reply, self(), Reply}.
 
--spec sync_join(RemoteNode :: node(), GroupName :: any(), Pid :: pid(), Meta :: any()) -> ok.
-sync_join(RemoteNode, GroupName, Pid, Meta) ->
-    gen_server:cast({?MODULE, RemoteNode}, {sync_join, GroupName, Pid, Meta}).
-
--spec sync_leave(RemoteNode :: node(), GroupName :: any(), Pid :: pid()) -> ok.
-sync_leave(RemoteNode, GroupName, Pid) ->
-    gen_server:cast({?MODULE, RemoteNode}, {sync_leave, GroupName, Pid}).
-
 -spec sync_get_local_group_tuples(FromNode :: node()) -> list(syn_group_tuple()).
 sync_get_local_group_tuples(FromNode) ->
     error_logger:info_msg("Syn(~p): Received request of local group tuples from remote node: ~p~n", [node(), FromNode]),
@@ -274,18 +267,6 @@ handle_call(Request, From, State) ->
     {noreply, #state{}, Timeout :: non_neg_integer()} |
     {stop, Reason :: any(), #state{}}.
 
-handle_cast({sync_join, GroupName, Pid, Meta}, State) ->
-    %% add to table
-    add_to_local_table(GroupName, Pid, Meta, undefined),
-    %% return
-    {noreply, State};
-
-handle_cast({sync_leave, GroupName, Pid}, State) ->
-    %% remove entry
-    remove_from_local_table(GroupName, Pid),
-    %% return
-    {noreply, State};
-
 handle_cast(Msg, State) ->
     error_logger:warning_msg("Syn(~p): Received an unknown cast message: ~p~n", [node(), Msg]),
     {noreply, State}.
@@ -369,17 +350,13 @@ code_change(_OldVsn, State, _Extra) ->
 -spec multicast_join(GroupName :: any(), Pid :: pid(), Meta :: any()) -> pid().
 multicast_join(GroupName, Pid, Meta) ->
     spawn_link(fun() ->
-        lists:foreach(fun(RemoteNode) ->
-            sync_join(RemoteNode, GroupName, Pid, Meta)
-        end, nodes())
+        rpc:eval_everywhere(nodes(), ?MODULE, add_to_local_table, [GroupName, Pid, Meta, undefined])
     end).
 
 -spec multicast_leave(GroupName :: any(), Pid :: pid()) -> pid().
 multicast_leave(GroupName, Pid) ->
     spawn_link(fun() ->
-        lists:foreach(fun(RemoteNode) ->
-            sync_leave(RemoteNode, GroupName, Pid)
-        end, nodes())
+        rpc:eval_everywhere(nodes(), ?MODULE, remove_from_local_table, [GroupName, Pid])
     end).
 
 -spec join_on_node(GroupName :: any(), Pid :: pid(), Meta :: any()) -> ok.

+ 3 - 28
src/syn_registry.erl

@@ -34,8 +34,8 @@
 -export([count/0, count/1]).
 
 %% sync API
--export([sync_register/4, sync_unregister/2]).
 -export([sync_get_local_registry_tuples/1]).
+-export([add_to_local_table/4]).
 -export([remove_from_local_table/1]).
 
 %% gen_server callbacks
@@ -105,14 +105,6 @@ count(Node) ->
     Processes = mnesia:dirty_select(syn_registry_table, [{MatchHead, [Guard], [Result]}]),
     length(Processes).
 
--spec sync_register(RemoteNode :: node(), Name :: any(), Pid :: pid(), Meta :: any()) -> ok.
-sync_register(RemoteNode, Name, Pid, Meta) ->
-    gen_server:cast({?MODULE, RemoteNode}, {sync_register, Name, Pid, Meta}).
-
--spec sync_unregister(RemoteNode :: node(), Name :: any()) -> ok.
-sync_unregister(RemoteNode, Name) ->
-    gen_server:cast({?MODULE, RemoteNode}, {sync_unregister, Name}).
-
 -spec sync_get_local_registry_tuples(FromNode :: node()) -> list(syn_registry_tuple()).
 sync_get_local_registry_tuples(FromNode) ->
     error_logger:info_msg("Syn(~p): Received request of local registry tuples from remote node: ~p~n", [node(), FromNode]),
@@ -212,18 +204,6 @@ handle_call(Request, From, State) ->
     {noreply, #state{}, Timeout :: non_neg_integer()} |
     {stop, Reason :: any(), #state{}}.
 
-handle_cast({sync_register, Name, Pid, Meta}, State) ->
-    %% add to table
-    add_to_local_table(Name, Pid, Meta, undefined),
-    %% return
-    {noreply, State};
-
-handle_cast({sync_unregister, Name}, State) ->
-    %% remove from table
-    remove_from_local_table(Name),
-    %% return
-    {noreply, State};
-
 handle_cast(Msg, State) ->
     error_logger:warning_msg("Syn(~p): Received an unknown cast message: ~p~n", [node(), Msg]),
     {noreply, State}.
@@ -308,17 +288,13 @@ code_change(_OldVsn, State, _Extra) ->
 -spec multicast_register(Name :: any(), Pid :: pid(), Meta :: any()) -> pid().
 multicast_register(Name, Pid, Meta) ->
     spawn_link(fun() ->
-        lists:foreach(fun(RemoteNode) ->
-            sync_register(RemoteNode, Name, Pid, Meta)
-        end, nodes())
+        rpc:eval_everywhere(nodes(), ?MODULE, add_to_local_table, [Name, Pid, Meta, undefined])
     end).
 
 -spec multicast_unregister(Name :: any()) -> pid().
 multicast_unregister(Name) ->
     spawn_link(fun() ->
-        lists:foreach(fun(RemoteNode) ->
-            sync_unregister(RemoteNode, Name)
-        end, nodes())
+        rpc:eval_everywhere(nodes(), ?MODULE, remove_from_local_table, [Name])
     end).
 
 -spec register_on_node(Name :: any(), Pid :: pid(), Meta :: any()) -> ok.
@@ -331,7 +307,6 @@ register_on_node(Name, Pid, Meta) ->
             Entry#syn_registry_table.monitor_ref
     end,
     %% add to table
-
     add_to_local_table(Name, Pid, Meta, MonitorRef).
 
 -spec unregister_on_node(Name :: any()) -> ok | {error, Reason :: any()}.