Skip to content

Commit a96db75

Browse files
committed
Add unit tests to stream SAC coordinator
Node disconnection/reconnection.
1 parent a435248 commit a96db75

File tree

3 files changed

+412
-176
lines changed

3 files changed

+412
-176
lines changed

deps/rabbit/src/rabbit_stream_coordinator.erl

+3-2
Original file line numberDiff line numberDiff line change
@@ -720,10 +720,11 @@ apply(#{machine_version := MachineVersion} = Meta,
720720
{Ss#{Id => S}, E}
721721
end, {Streams0, Effects0}, Streams0),
722722

723-
{Sac1, Effects2} = case MachineVersion > 5 of
723+
{Sac1, Effects2} = case MachineVersion > 4 of
724724
true ->
725725
SacMod = sac_module(Meta),
726-
SacMod:handle_node_reconnected(Sac0, Effects1);
726+
SacMod:handle_node_reconnected(Node,
727+
Sac0, Effects1);
727728
false ->
728729
{Sac0, Effects1}
729730
end,

deps/rabbit/src/rabbit_stream_sac_coordinator.erl

+32-21
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
ensure_monitors/4,
4343
handle_connection_down/2,
4444
handle_connection_node_disconnected/2,
45-
handle_node_reconnected/2,
45+
handle_node_reconnected/3,
4646
forget_connection/2,
4747
consumer_groups/3,
4848
group_consumers/5,
@@ -300,17 +300,7 @@ apply(#command_purge_nodes{nodes = Nodes}, State0) ->
300300
{State1, ok, Eff}.
301301

302302
purge_node(Node, #?MODULE{groups = Groups0} = State0) ->
303-
PidsGroups =
304-
maps:fold(fun(K, #group{consumers = Consumers}, Acc) ->
305-
lists:foldl(fun(#consumer{pid = Pid}, AccIn)
306-
when node(Pid) =:= Node ->
307-
PG0 = maps:get(Pid, AccIn, #{}),
308-
PG1 = PG0#{K => true},
309-
AccIn#{Pid => PG1};
310-
(_, AccIn) ->
311-
AccIn
312-
end, Acc, Consumers)
313-
end, #{}, Groups0),
303+
PidsGroups = compute_node_pid_group_dependencies(Node, Groups0),
314304
maps:fold(fun(Pid, Groups, {S0, Eff0}) ->
315305
{S1, Eff1} = handle_connection_down0(Pid, S0, Groups),
316306
{S1, Eff1 ++ Eff0}
@@ -580,8 +570,15 @@ ensure_monitors(#command_connection_reconnected{pid = Pid},
580570
{State#?MODULE{pids_groups = AllPidsGroups},
581571
Monitors#{Pid => sac},
582572
[{monitor, process, Pid}, {monitor, node, node(Pid)} | Effects]};
573+
ensure_monitors(#command_purge_nodes{},
574+
#?MODULE{groups = Groups} = State,
575+
Monitors,
576+
Effects) ->
577+
AllPidsGroups = compute_pid_group_dependencies(Groups),
578+
{State#?MODULE{pids_groups = AllPidsGroups},
579+
Monitors,
580+
Effects};
583581
ensure_monitors(_, #?MODULE{} = State0, Monitors, Effects) ->
584-
%% TODO sac: ensure the pid-group mapping after purge_nodes?
585582
{State0, Monitors, Effects}.
586583

587584
-spec handle_connection_down(connection_pid(), state()) ->
@@ -621,21 +618,21 @@ handle_connection_node_disconnected(ConnPid,
621618
#{connection_pid => ConnPid}}, T}]}
622619
end.
623620

624-
-spec handle_node_reconnected(state(), ra_machine:effects()) ->
621+
-spec handle_node_reconnected(node(), state(), ra_machine:effects()) ->
625622
{state(), ra_machine:effects()}.
626-
handle_node_reconnected(#?MODULE{pids_groups = PidsGroups0,
623+
handle_node_reconnected(Node,
624+
#?MODULE{pids_groups = PidsGroups0,
627625
groups = Groups0} = State0,
628626
Effects0) ->
629-
AllPidsGroups = compute_pid_group_dependencies(Groups0),
630-
NotMonitored = maps:keys(AllPidsGroups) -- maps:keys(PidsGroups0),
627+
NodePidsGroups = compute_node_pid_group_dependencies(Node, Groups0),
628+
PidsGroups1 = maps:merge(PidsGroups0, NodePidsGroups),
631629
Effects1 =
632630
lists:foldr(fun(P, Acc) ->
633631
[notify_connection_effect(P),
634-
{monitor, process, P},
635-
{monitor, node, node(P)} | Acc]
636-
end, Effects0, NotMonitored),
632+
{monitor, process, P} | Acc]
633+
end, Effects0, maps:keys(NodePidsGroups)),
637634

638-
{State0#?MODULE{pids_groups = AllPidsGroups}, Effects1}.
635+
{State0#?MODULE{pids_groups = PidsGroups1}, Effects1}.
639636

640637
-spec forget_connection(connection_pid(), state()) ->
641638
{state(), ra_machine:effects()}.
@@ -1122,3 +1119,17 @@ compute_pid_group_dependencies(Groups) ->
11221119
AccIn#{Pid => PG1}
11231120
end, Acc, Cs)
11241121
end, #{}, Groups).
1122+
1123+
-spec compute_node_pid_group_dependencies(node(), groups()) -> pids_groups().
1124+
compute_node_pid_group_dependencies(Node, Groups) ->
1125+
maps:fold(fun(K, #group{consumers = Consumers}, Acc) ->
1126+
lists:foldl(fun(#consumer{pid = Pid}, AccIn)
1127+
when node(Pid) =:= Node ->
1128+
PG0 = maps:get(Pid, AccIn, #{}),
1129+
PG1 = PG0#{K => true},
1130+
AccIn#{Pid => PG1};
1131+
(_, AccIn) ->
1132+
AccIn
1133+
end, Acc, Consumers)
1134+
end, #{}, Groups).
1135+

0 commit comments

Comments
 (0)