Browse Source

Ignore sync message coming from unknown nodes.

Roberto Ostinelli 3 years ago
parent
commit
66995076ee
4 changed files with 62 additions and 4 deletions
  1. 9 2
      src/syn_pg.erl
  2. 9 2
      src/syn_registry.erl
  3. 22 0
      test/syn_pg_SUITE.erl
  4. 22 0
      test/syn_registry_SUITE.erl

+ 9 - 2
src/syn_pg.erl

@@ -311,8 +311,15 @@ handle_call(Request, From, #state{scope = Scope} = State) ->
     {noreply, #state{}} |
     {noreply, #state{}} |
     {noreply, #state{}, timeout() | hibernate | {continue, term()}} |
     {noreply, #state{}, timeout() | hibernate | {continue, term()}} |
     {stop, Reason :: term(), #state{}}.
     {stop, Reason :: term(), #state{}}.
-handle_info({'3.0', sync_join, GroupName, Pid, Meta, Time, Reason}, State) ->
-    handle_groups_sync(GroupName, Pid, Meta, Time, Reason, State),
+handle_info({'3.0', sync_join, GroupName, Pid, Meta, Time, Reason}, #state{nodes_map = NodesMap} = State) ->
+    case maps:is_key(node(Pid), NodesMap) of
+        true ->
+            handle_groups_sync(GroupName, Pid, Meta, Time, Reason, State);
+
+        false ->
+            %% ignore, race condition
+            ok
+    end,
     {noreply, State};
     {noreply, State};
 
 
 handle_info({'3.0', sync_leave, GroupName, Pid, Meta, Reason}, #state{
 handle_info({'3.0', sync_leave, GroupName, Pid, Meta, Reason}, #state{

+ 9 - 2
src/syn_registry.erl

@@ -236,8 +236,15 @@ handle_call(Request, From, #state{scope = Scope} = State) ->
     {noreply, #state{}} |
     {noreply, #state{}} |
     {noreply, #state{}, timeout() | hibernate | {continue, term()}} |
     {noreply, #state{}, timeout() | hibernate | {continue, term()}} |
     {stop, Reason :: term(), #state{}}.
     {stop, Reason :: term(), #state{}}.
-handle_info({'3.0', sync_register, Name, Pid, Meta, Time, Reason}, State) ->
-    handle_registry_sync(Name, Pid, Meta, Time, Reason, State),
+handle_info({'3.0', sync_register, Name, Pid, Meta, Time, Reason}, #state{nodes_map = NodesMap} = State) ->
+    case maps:is_key(node(Pid), NodesMap) of
+        true ->
+            handle_registry_sync(Name, Pid, Meta, Time, Reason, State);
+
+        false ->
+            %% ignore, race condition
+            ok
+    end,
     {noreply, State};
     {noreply, State};
 
 
 handle_info({'3.0', sync_unregister, Name, Pid, Meta, Reason}, #state{
 handle_info({'3.0', sync_unregister, Name, Pid, Meta, Reason}, #state{

+ 22 - 0
test/syn_pg_SUITE.erl

@@ -35,6 +35,7 @@
 -export([
 -export([
     three_nodes_discover/1,
     three_nodes_discover/1,
     three_nodes_join_leave_and_monitor/1,
     three_nodes_join_leave_and_monitor/1,
+    three_nodes_join_filter_unknown_node/1,
     three_nodes_cluster_changes/1,
     three_nodes_cluster_changes/1,
     three_nodes_custom_event_handler_joined_left/1,
     three_nodes_custom_event_handler_joined_left/1,
     three_nodes_publish/1,
     three_nodes_publish/1,
@@ -85,6 +86,7 @@ groups() ->
         {three_nodes_groups, [shuffle], [
         {three_nodes_groups, [shuffle], [
             three_nodes_discover,
             three_nodes_discover,
             three_nodes_join_leave_and_monitor,
             three_nodes_join_leave_and_monitor,
+            three_nodes_join_filter_unknown_node,
             three_nodes_cluster_changes,
             three_nodes_cluster_changes,
             three_nodes_custom_event_handler_joined_left,
             three_nodes_custom_event_handler_joined_left,
             three_nodes_publish,
             three_nodes_publish,
@@ -689,6 +691,26 @@ three_nodes_join_leave_and_monitor(Config) ->
     %% errors
     %% errors
     {error, not_in_group} = syn:leave(scope_ab, {group, "one"}, PidWithMeta).
     {error, not_in_group} = syn:leave(scope_ab, {group, "one"}, PidWithMeta).
 
 
+three_nodes_join_filter_unknown_node(Config) ->
+    %% get slaves
+    SlaveNode1 = proplists:get_value(slave_node_1, Config),
+    SlaveNode2 = proplists:get_value(slave_node_2, Config),
+
+    %% start syn on 1 and 2
+    ok = rpc:call(SlaveNode1, syn, start, []),
+    ok = rpc:call(SlaveNode2, syn, start, []),
+
+    %% add scopes
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc]]),
+
+    %% send sync message from out of scope node
+    InvalidPid = syn_test_suite_helper:start_process(),
+    {syn_pg_scope_bc, SlaveNode1} ! {'3.0', sync_join, <<"group-name">>, InvalidPid, undefined, os:system_time(millisecond), normal},
+
+    %% check
+    false = rpc:call(SlaveNode1, syn, is_member, [scope_bc, <<"group-name">>, InvalidPid]).
+
 three_nodes_cluster_changes(Config) ->
 three_nodes_cluster_changes(Config) ->
     %% get slaves
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode1 = proplists:get_value(slave_node_1, Config),

+ 22 - 0
test/syn_registry_SUITE.erl

@@ -38,6 +38,7 @@
 -export([
 -export([
     three_nodes_discover/1,
     three_nodes_discover/1,
     three_nodes_register_unregister_and_monitor/1,
     three_nodes_register_unregister_and_monitor/1,
+    three_nodes_register_filter_unknown_node/1,
     three_nodes_cluster_changes/1,
     three_nodes_cluster_changes/1,
     three_nodes_cluster_conflicts/1,
     three_nodes_cluster_conflicts/1,
     three_nodes_custom_event_handler_reg_unreg/1,
     three_nodes_custom_event_handler_reg_unreg/1,
@@ -85,6 +86,7 @@ groups() ->
         {three_nodes_process_registration, [shuffle], [
         {three_nodes_process_registration, [shuffle], [
             three_nodes_discover,
             three_nodes_discover,
             three_nodes_register_unregister_and_monitor,
             three_nodes_register_unregister_and_monitor,
+            three_nodes_register_filter_unknown_node,
             three_nodes_cluster_changes,
             three_nodes_cluster_changes,
             three_nodes_cluster_conflicts,
             three_nodes_cluster_conflicts,
             three_nodes_custom_event_handler_reg_unreg,
             three_nodes_custom_event_handler_reg_unreg,
@@ -510,6 +512,26 @@ three_nodes_register_unregister_and_monitor(Config) ->
     add_to_local_table(scope_ab, <<"my proc">>, Pid2, undefined, 0, undefined),
     add_to_local_table(scope_ab, <<"my proc">>, Pid2, undefined, 0, undefined),
     {error, race_condition} = rpc:call(SlaveNode1, syn, unregister, [scope_ab, <<"my proc">>]).
     {error, race_condition} = rpc:call(SlaveNode1, syn, unregister, [scope_ab, <<"my proc">>]).
 
 
+three_nodes_register_filter_unknown_node(Config) ->
+    %% get slaves
+    SlaveNode1 = proplists:get_value(slave_node_1, Config),
+    SlaveNode2 = proplists:get_value(slave_node_2, Config),
+
+    %% start syn on 1 and 2
+    ok = rpc:call(SlaveNode1, syn, start, []),
+    ok = rpc:call(SlaveNode2, syn, start, []),
+
+    %% add scopes
+    ok = rpc:call(SlaveNode1, syn, add_node_to_scopes, [[scope_bc]]),
+    ok = rpc:call(SlaveNode2, syn, add_node_to_scopes, [[scope_bc]]),
+
+    %% send sync message from out of scope node
+    InvalidPid = syn_test_suite_helper:start_process(),
+    {syn_registry_scope_bc, SlaveNode1} ! {'3.0', sync_register, <<"proc-name">>, InvalidPid, undefined, os:system_time(millisecond), normal},
+
+    %% check
+    undefined = rpc:call(SlaveNode1, syn, lookup, [scope_bc, <<"proc-name">>]).
+
 three_nodes_cluster_changes(Config) ->
 three_nodes_cluster_changes(Config) ->
     %% get slaves
     %% get slaves
     SlaveNode1 = proplists:get_value(slave_node_1, Config),
     SlaveNode1 = proplists:get_value(slave_node_1, Config),