Browse Source

Ensure that processes added in grouop resolve are alive.

Roberto Ostinelli 5 years ago
parent
commit
2d4f85a76f
1 changed files with 19 additions and 5 deletions
  1. 19 5
      src/syn_groups.erl

+ 19 - 5
src/syn_groups.erl

@@ -452,13 +452,18 @@ write_group_tuples_for_node(GroupTuples, RemoteNode) ->
     %% ensure that groups doesn't have any joining node's entries
     %% ensure that groups doesn't have any joining node's entries
     raw_purge_group_entries_for_node(RemoteNode),
     raw_purge_group_entries_for_node(RemoteNode),
     %% add
     %% add
-    lists:foreach(fun({Name, RemotePid, RemoteMeta}) ->
-        join_on_node(Name, RemotePid, RemoteMeta)
+    lists:foreach(fun({GroupName, RemotePid, RemoteMeta}) ->
+        case rpc:call(node(RemotePid), erlang, is_process_alive, [RemotePid]) of
+            true ->
+                add_to_local_table(GroupName, RemotePid, RemoteMeta, undefined);
+            _ ->
+                ok = rpc:call(RemoteNode, syn_registry, remove_from_local_table, [GroupName, RemotePid])
+        end
     end, GroupTuples).
     end, GroupTuples).
 
 
 -spec raw_purge_group_entries_for_node(Node :: atom()) -> ok.
 -spec raw_purge_group_entries_for_node(Node :: atom()) -> ok.
 raw_purge_group_entries_for_node(Node) ->
 raw_purge_group_entries_for_node(Node) ->
-    %% NB: no demonitoring is done, hence why this needs to run for a remote node
+    %% NB: no demonitoring is done, this is why it's raw
     %% build match specs
     %% build match specs
     Pattern = #syn_groups_table{node = Node, _ = '_'},
     Pattern = #syn_groups_table{node = Node, _ = '_'},
     ObjectsToDelete = mnesia:dirty_match_object(syn_groups_table, Pattern),
     ObjectsToDelete = mnesia:dirty_match_object(syn_groups_table, Pattern),
@@ -505,5 +510,14 @@ collect_replies(MemberPids, Replies, BadPids) ->
 -spec rebuild_monitors() -> ok.
 -spec rebuild_monitors() -> ok.
 rebuild_monitors() ->
 rebuild_monitors() ->
     GroupTuples = get_group_tuples_for_node(node()),
     GroupTuples = get_group_tuples_for_node(node()),
-    %% remove all
-    write_group_tuples_for_node(GroupTuples, node()).
+    %% ensure that groups doesn't have any joining node's entries
+    raw_purge_group_entries_for_node(node()),
+    %% add
+    lists:foreach(fun({GroupName, Pid, Meta}) ->
+        case erlang:is_process_alive(Pid) of
+            true ->
+                join_on_node(GroupName, Pid, Meta);
+            _ ->
+                multicast_leave(GroupName, Pid)
+        end
+    end, GroupTuples).