Browse Source

Cast instead of rpc:eval in registry multicasts.

Roberto Ostinelli 5 years ago
parent
commit
a6bbe47ec8
1 changed files with 14 additions and 2 deletions
  1. 14 2
      src/syn_registry.erl

+ 14 - 2
src/syn_registry.erl

@@ -35,7 +35,7 @@
 
 %% sync API
 -export([sync_get_local_registry_tuples/1]).
--export([add_remote_to_local_table/4]).
+-export([add_remote_to_local_table/4, remove_remote_from_local_table/2]).
 -export([add_to_local_table/4, remove_from_local_table/1]).
 
 %% gen_server callbacks
@@ -104,6 +104,10 @@ count(Node) ->
 add_remote_to_local_table(RemoteNode, Name, RemotePid, RemoteMeta) ->
     gen_server:cast({?MODULE, RemoteNode}, {add_remote_to_local_table, Name, RemotePid, RemoteMeta}).
 
+-spec remove_remote_from_local_table(RemoteNode :: node(), Name :: any()) -> ok.
+remove_remote_from_local_table(RemoteNode, Name) ->
+    gen_server:cast({?MODULE, RemoteNode}, {remove_remote_from_local_table, Name}).
+
 -spec sync_get_local_registry_tuples(FromNode :: node()) -> [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", [node(), FromNode]),
@@ -235,6 +239,12 @@ handle_cast({add_remote_to_local_table, Name, RemotePid, RemoteMeta}, State) ->
     %% return
     {noreply, State};
 
+handle_cast({remove_remote_from_local_table, Name}, State) ->
+    %% remove
+    remove_from_local_table(Name),
+    %% return
+    {noreply, State};
+
 handle_cast(Msg, State) ->
     error_logger:warning_msg("Syn(~p): Received an unknown cast message: ~p", [node(), Msg]),
     {noreply, State}.
@@ -365,7 +375,9 @@ multicast_register(Name, Pid, Meta) ->
 -spec multicast_unregister(Name :: any()) -> pid().
 multicast_unregister(Name) ->
     spawn_link(fun() ->
-        rpc:eval_everywhere(nodes(), ?MODULE, remove_from_local_table, [Name])
+        lists:foreach(fun(RemoteNode) ->
+            remove_remote_from_local_table(RemoteNode, Name)
+        end, nodes())
     end).
 
 -spec register_on_node(Name :: any(), Pid :: pid(), Meta :: any()) -> ok.