Browse Source

Use remote gen_server functions instead of rpc.

Roberto Ostinelli 5 years ago
parent
commit
85df753fd3
2 changed files with 35 additions and 21 deletions
  1. 16 10
      src/syn_groups.erl
  2. 19 11
      src/syn_registry.erl

+ 16 - 10
src/syn_groups.erl

@@ -39,7 +39,7 @@
 -export([multi_call/2, multi_call/3, multi_call_reply/2]).
 -export([multi_call/2, multi_call/3, multi_call_reply/2]).
 
 
 %% sync API
 %% sync API
--export([sync_join/3, sync_leave/2]).
+-export([sync_join/4, sync_leave/3]).
 -export([sync_get_local_group_tuples/1]).
 -export([sync_get_local_group_tuples/1]).
 
 
 %% gen_server callbacks
 %% gen_server callbacks
@@ -178,13 +178,13 @@ multi_call(GroupName, Message, Timeout) ->
 multi_call_reply(CallerPid, Reply) ->
 multi_call_reply(CallerPid, Reply) ->
     CallerPid ! {syn_multi_call_reply, self(), Reply}.
     CallerPid ! {syn_multi_call_reply, self(), Reply}.
 
 
--spec sync_join(GroupName :: any(), Pid :: pid(), Meta :: any()) -> ok.
-sync_join(GroupName, Pid, Meta) ->
-    gen_server:cast(?MODULE, {sync_join, GroupName, Pid, Meta}).
+-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(GroupName :: any(), Pid :: pid()) -> ok.
-sync_leave(GroupName, Pid) ->
-    gen_server:cast(?MODULE, {sync_leave, GroupName, Pid}).
+-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()).
 -spec sync_get_local_group_tuples(FromNode :: node()) -> list(syn_group_tuple()).
 sync_get_local_group_tuples(FromNode) ->
 sync_get_local_group_tuples(FromNode) ->
@@ -237,7 +237,9 @@ handle_call({join_on_node, GroupName, Pid, Meta}, _From, State) ->
         true ->
         true ->
             join_on_node(GroupName, Pid, Meta),
             join_on_node(GroupName, Pid, Meta),
             %% multicast
             %% multicast
-            rpc:eval_everywhere(nodes(), ?MODULE, sync_join, [GroupName, Pid, Meta]),
+            lists:foreach(fun(RemoteNode) ->
+                sync_join(RemoteNode, GroupName, Pid, Meta)
+            end, nodes()),
             %% return
             %% return
             {reply, ok, State};
             {reply, ok, State};
         _ ->
         _ ->
@@ -248,7 +250,9 @@ handle_call({leave_on_node, GroupName, Pid}, _From, State) ->
     case leave_on_node(GroupName, Pid) of
     case leave_on_node(GroupName, Pid) of
         ok ->
         ok ->
             %% multicast
             %% multicast
-            rpc:eval_everywhere(nodes(), ?MODULE, sync_leave, [GroupName, Pid]),
+            lists:foreach(fun(RemoteNode) ->
+                sync_leave(RemoteNode, GroupName, Pid)
+            end, nodes()),
             %% return
             %% return
             {reply, ok, State};
             {reply, ok, State};
         {error, Reason} ->
         {error, Reason} ->
@@ -307,7 +311,9 @@ handle_info({'DOWN', _MonitorRef, process, Pid, Reason}, State) ->
                 %% remove from table
                 %% remove from table
                 remove_from_local_table(Entry),
                 remove_from_local_table(Entry),
                 %% multicast
                 %% multicast
-                rpc:eval_everywhere(nodes(), ?MODULE, sync_leave, [GroupName, Pid])
+                lists:foreach(fun(RemoteNode) ->
+                    sync_leave(RemoteNode, GroupName, Pid)
+                end, nodes())
             end, Entries)
             end, Entries)
     end,
     end,
     %% return
     %% return

+ 19 - 11
src/syn_registry.erl

@@ -34,7 +34,7 @@
 -export([count/0, count/1]).
 -export([count/0, count/1]).
 
 
 %% sync API
 %% sync API
--export([sync_register/3, sync_unregister/1]).
+-export([sync_register/4, sync_unregister/2]).
 -export([sync_get_local_registry_tuples/1]).
 -export([sync_get_local_registry_tuples/1]).
 -export([unregister_on_node/1]).
 -export([unregister_on_node/1]).
 
 
@@ -103,13 +103,13 @@ count(Node) ->
     Processes = mnesia:dirty_select(syn_registry_table, [{MatchHead, [Guard], [Result]}]),
     Processes = mnesia:dirty_select(syn_registry_table, [{MatchHead, [Guard], [Result]}]),
     length(Processes).
     length(Processes).
 
 
--spec sync_register(Name :: any(), Pid :: pid(), Meta :: any()) -> ok.
-sync_register(Name, Pid, Meta) ->
-    gen_server:cast(?MODULE, {sync_register, Name, Pid, Meta}).
+-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(Name :: any()) -> ok.
-sync_unregister(Name) ->
-    gen_server:cast(?MODULE, {sync_unregister, Name}).
+-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()).
 -spec sync_get_local_registry_tuples(FromNode :: node()) -> list(syn_registry_tuple()).
 sync_get_local_registry_tuples(FromNode) ->
 sync_get_local_registry_tuples(FromNode) ->
@@ -165,14 +165,18 @@ handle_call({register_on_node, Name, Pid, Meta}, _From, State) ->
                 undefined ->
                 undefined ->
                     register_on_node(Name, Pid, Meta),
                     register_on_node(Name, Pid, Meta),
                     %% multicast
                     %% multicast
-                    rpc:eval_everywhere(nodes(), ?MODULE, sync_register, [Name, Pid, Meta]),
+                    lists:foreach(fun(RemoteNode) ->
+                        sync_register(RemoteNode, Name, Pid, Meta)
+                    end, nodes()),
                     %% return
                     %% return
                     {reply, ok, State};
                     {reply, ok, State};
 
 
                 Entry when Entry#syn_registry_table.pid == Pid ->
                 Entry when Entry#syn_registry_table.pid == Pid ->
                     register_on_node(Name, Pid, Meta),
                     register_on_node(Name, Pid, Meta),
                     %% multicast
                     %% multicast
-                    rpc:eval_everywhere(nodes(), ?MODULE, sync_register, [Name, Pid, Meta]),
+                    lists:foreach(fun(RemoteNode) ->
+                        sync_register(RemoteNode, Name, Pid, Meta)
+                    end, nodes()),
                     %% return
                     %% return
                     {reply, ok, State};
                     {reply, ok, State};
 
 
@@ -187,7 +191,9 @@ handle_call({unregister_on_node, Name}, _From, State) ->
     case unregister_on_node(Name) of
     case unregister_on_node(Name) of
         ok ->
         ok ->
             %% multicast
             %% multicast
-            rpc:eval_everywhere(nodes(), ?MODULE, sync_unregister, [Name]),
+            lists:foreach(fun(RemoteNode) ->
+                sync_unregister(RemoteNode, Name)
+            end, nodes()),
             %% return
             %% return
             {reply, ok, State};
             {reply, ok, State};
         {error, Reason} ->
         {error, Reason} ->
@@ -246,7 +252,9 @@ handle_info({'DOWN', _MonitorRef, process, Pid, Reason}, State) ->
                 %% remove from table
                 %% remove from table
                 remove_from_local_table(Name),
                 remove_from_local_table(Name),
                 %% multicast
                 %% multicast
-                rpc:eval_everywhere(nodes(), ?MODULE, sync_unregister, [Name])
+                lists:foreach(fun(RemoteNode) ->
+                    sync_unregister(RemoteNode, Name)
+                end, nodes())
             end, Entries)
             end, Entries)
     end,
     end,
     %% return
     %% return