Browse Source

Add groups full netsplit support.

Roberto Ostinelli 5 years ago
parent
commit
4bab2c4439
1 changed files with 158 additions and 3 deletions
  1. 158 3
      test/syn_groups_SUITE.erl

+ 158 - 3
test/syn_groups_SUITE.erl

@@ -42,7 +42,8 @@
     two_nodes_local_members/1
 ]).
 -export([
-    three_nodes_partial_netsplit_consistency/1
+    three_nodes_partial_netsplit_consistency/1,
+    three_nodes_full_netsplit_consistency/1
 ]).
 
 %% include
@@ -91,7 +92,8 @@ groups() ->
             two_nodes_local_members
         ]},
         {three_nodes_groups, [shuffle], [
-            three_nodes_partial_netsplit_consistency
+            three_nodes_partial_netsplit_consistency,
+            three_nodes_full_netsplit_consistency
         ]}
     ].
 %% -------------------------------------------------------------------
@@ -535,7 +537,7 @@ three_nodes_partial_netsplit_consistency(Config) ->
     %% disconnect slave 1
     syn_test_suite_helper:disconnect_node(SlaveNode1),
     timer:sleep(500),
-    %% unregister 0Changed
+    %% leave 0Changed
     ok = syn:leave(GroupName, Pid0Changed),
     %% retrieve local
     true = lists:sort([Pid0]) =:= lists:sort(syn:get_members(GroupName)),
@@ -594,3 +596,156 @@ three_nodes_partial_netsplit_consistency(Config) ->
     syn_test_suite_helper:kill_process(Pid0Changed),
     syn_test_suite_helper:kill_process(Pid1),
     syn_test_suite_helper:kill_process(Pid2).
+
+three_nodes_full_netsplit_consistency(Config) ->
+    GroupName = "my group",
+    %% get slaves
+    SlaveNode1 = proplists:get_value(slave_node_1, Config),
+    SlaveNode2 = proplists:get_value(slave_node_2, Config),
+    %% start syn on nodes
+    ok = syn:start(),
+    ok = rpc:call(SlaveNode1, syn, start, []),
+    ok = rpc:call(SlaveNode2, syn, start, []),
+    timer:sleep(100),
+    %% start processes
+    Pid0 = syn_test_suite_helper:start_process(),
+    Pid0Changed = syn_test_suite_helper:start_process(),
+    Pid1 = syn_test_suite_helper:start_process(SlaveNode1),
+    Pid2 = syn_test_suite_helper:start_process(SlaveNode2),
+    OtherPid = syn_test_suite_helper:start_process(),
+    timer:sleep(100),
+    %% retrieve local
+    [] = syn:get_members("group-1"),
+    [] = syn:get_members(GroupName),
+    [] = syn:get_members(GroupName, with_meta),
+    false = syn:member(Pid0, GroupName),
+    false = syn:member(Pid0Changed, GroupName),
+    false = syn:member(Pid1, GroupName),
+    false = syn:member(Pid2, GroupName),
+    %% retrieve slave 1
+    [] = rpc:call(SlaveNode1, syn, get_members, [GroupName]),
+    [] = rpc:call(SlaveNode1, syn, get_members, [GroupName, with_meta]),
+    false = rpc:call(SlaveNode1, syn, member, [Pid0, GroupName]),
+    false = rpc:call(SlaveNode1, syn, member, [Pid0Changed, GroupName]),
+    false = rpc:call(SlaveNode1, syn, member, [Pid1, GroupName]),
+    false = rpc:call(SlaveNode1, syn, member, [Pid2, GroupName]),
+    %% retrieve slave 2
+    [] = rpc:call(SlaveNode2, syn, get_members, [GroupName]),
+    [] = rpc:call(SlaveNode2, syn, get_members, [GroupName, with_meta]),
+    false = rpc:call(SlaveNode2, syn, member, [Pid0, GroupName]),
+    false = rpc:call(SlaveNode2, syn, member, [Pid0Changed, GroupName]),
+    false = rpc:call(SlaveNode2, syn, member, [Pid1, GroupName]),
+    false = rpc:call(SlaveNode2, syn, member, [Pid2, GroupName]),
+    %% join
+    ok = syn:join(GroupName, Pid0),
+    ok = syn:join(GroupName, Pid0Changed, {meta, changed}),
+    ok = rpc:call(SlaveNode1, syn, join, [GroupName, Pid1]),
+    ok = rpc:call(SlaveNode2, syn, join, [GroupName, Pid2, {meta, 2}]),
+    ok = syn:join("other-group", OtherPid),
+    timer:sleep(200),
+    %% retrieve local
+    true = lists:sort([Pid0, Pid0Changed, Pid1, Pid2]) =:= lists:sort(syn:get_members(GroupName)),
+    true = lists:sort([
+        {Pid0, undefined},
+        {Pid0Changed, {meta, changed}},
+        {Pid1, undefined},
+        {Pid2, {meta, 2}}
+    ]) =:= lists:sort(syn:get_members(GroupName, with_meta)),
+    true = syn:member(Pid0, GroupName),
+    true = syn:member(Pid0Changed, GroupName),
+    true = syn:member(Pid1, GroupName),
+    true = syn:member(Pid2, GroupName),
+    false = syn:member(OtherPid, GroupName),
+    %% retrieve slave 1
+    true = lists:sort([Pid0, Pid0Changed, Pid1, Pid2])
+        =:= lists:sort(rpc:call(SlaveNode1, syn, get_members, [GroupName])),
+    true = lists:sort([
+        {Pid0, undefined},
+        {Pid0Changed, {meta, changed}},
+        {Pid1, undefined},
+        {Pid2, {meta, 2}}
+    ]) =:= lists:sort(rpc:call(SlaveNode1, syn, get_members, [GroupName, with_meta])),
+    true = rpc:call(SlaveNode1, syn, member, [Pid0, GroupName]),
+    true = rpc:call(SlaveNode1, syn, member, [Pid0Changed, GroupName]),
+    true = rpc:call(SlaveNode1, syn, member, [Pid1, GroupName]),
+    true = rpc:call(SlaveNode1, syn, member, [Pid2, GroupName]),
+    false = rpc:call(SlaveNode1, syn, member, [OtherPid, GroupName]),
+    %% retrieve slave 2
+    true = lists:sort([Pid0, Pid0Changed, Pid1, Pid2])
+        =:= lists:sort(rpc:call(SlaveNode2, syn, get_members, [GroupName])),
+    true = lists:sort([
+        {Pid0, undefined},
+        {Pid0Changed, {meta, changed}},
+        {Pid1, undefined},
+        {Pid2, {meta, 2}}
+    ]) =:= lists:sort(rpc:call(SlaveNode2, syn, get_members, [GroupName, with_meta])),
+    true = rpc:call(SlaveNode2, syn, member, [Pid0, GroupName]),
+    true = rpc:call(SlaveNode2, syn, member, [Pid0Changed, GroupName]),
+    true = rpc:call(SlaveNode2, syn, member, [Pid1, GroupName]),
+    true = rpc:call(SlaveNode2, syn, member, [Pid2, GroupName]),
+    false = rpc:call(SlaveNode2, syn, member, [OtherPid, GroupName]),
+    %% disconnect everyone
+    rpc:call(SlaveNode1, syn_test_suite_helper, disconnect_node, [SlaveNode2]),
+    syn_test_suite_helper:disconnect_node(SlaveNode1),
+    syn_test_suite_helper:disconnect_node(SlaveNode2),
+    timer:sleep(1000),
+    %% leave 0Changed
+    ok = syn:leave(GroupName, Pid0Changed),
+    %% retrieve local
+    true = lists:sort([Pid0]) =:= lists:sort(syn:get_members(GroupName)),
+    true = lists:sort([
+        {Pid0, undefined}
+    ]) =:= lists:sort(syn:get_members(GroupName, with_meta)),
+    true = syn:member(Pid0, GroupName),
+    false = syn:member(Pid0Changed, GroupName),
+    false = syn:member(Pid1, GroupName),
+    false = syn:member(Pid2, GroupName),
+    false = syn:member(OtherPid, GroupName),
+    %% reconnect all
+    syn_test_suite_helper:connect_node(SlaveNode1),
+    syn_test_suite_helper:connect_node(SlaveNode2),
+    rpc:call(SlaveNode1, syn_test_suite_helper, connect_node, [SlaveNode2]),
+    timer:sleep(1500),
+    %% retrieve local
+    true = lists:sort([Pid0,  Pid1, Pid2]) =:= lists:sort(syn:get_members(GroupName)),
+    true = lists:sort([
+        {Pid0, undefined},
+        {Pid1, undefined},
+        {Pid2, {meta, 2}}
+    ]) =:= lists:sort(syn:get_members(GroupName, with_meta)),
+    true = syn:member(Pid0, GroupName),
+    false = syn:member(Pid0Changed, GroupName),
+    true = syn:member(Pid1, GroupName),
+    true = syn:member(Pid2, GroupName),
+    false = syn:member(OtherPid, GroupName),
+    %% retrieve slave 1
+    true = lists:sort([Pid0, Pid1, Pid2])
+        =:= lists:sort(rpc:call(SlaveNode1, syn, get_members, [GroupName])),
+    true = lists:sort([
+        {Pid0, undefined},
+        {Pid1, undefined},
+        {Pid2, {meta, 2}}
+    ]) =:= lists:sort(rpc:call(SlaveNode1, syn, get_members, [GroupName, with_meta])),
+    true = rpc:call(SlaveNode1, syn, member, [Pid0, GroupName]),
+    false = rpc:call(SlaveNode1, syn, member, [Pid0Changed, GroupName]),
+    true = rpc:call(SlaveNode1, syn, member, [Pid1, GroupName]),
+    true = rpc:call(SlaveNode1, syn, member, [Pid2, GroupName]),
+    false = rpc:call(SlaveNode1, syn, member, [OtherPid, GroupName]),
+    %% retrieve slave 2
+    true = lists:sort([Pid0, Pid1, Pid2])
+        =:= lists:sort(rpc:call(SlaveNode2, syn, get_members, [GroupName])),
+    true = lists:sort([
+        {Pid0, undefined},
+        {Pid1, undefined},
+        {Pid2, {meta, 2}}
+    ]) =:= lists:sort(rpc:call(SlaveNode2, syn, get_members, [GroupName, with_meta])),
+    true = rpc:call(SlaveNode2, syn, member, [Pid0, GroupName]),
+    false = rpc:call(SlaveNode2, syn, member, [Pid0Changed, GroupName]),
+    true = rpc:call(SlaveNode2, syn, member, [Pid1, GroupName]),
+    true = rpc:call(SlaveNode2, syn, member, [Pid2, GroupName]),
+    false = rpc:call(SlaveNode2, syn, member, [OtherPid, GroupName]),
+    %% kill processes
+    syn_test_suite_helper:kill_process(Pid0),
+    syn_test_suite_helper:kill_process(Pid0Changed),
+    syn_test_suite_helper:kill_process(Pid1),
+    syn_test_suite_helper:kill_process(Pid2).