8888-define (REPLICA_FRESHNESS_LIMIT_MS , 10 * 1000 ). % % 10s
8989-define (V2_OR_MORE (Vsn ), (Vsn >= 2 )).
9090-define (V5_OR_MORE (Vsn ), (Vsn >= 5 )).
91+ -define (V7_OR_MORE (Vsn ), (Vsn >= 7 )). % % SAC monitors no longer in monitors map
9192-define (SAC_V4 , rabbit_stream_sac_coordinator_v4 ).
9293-define (SAC_CURRENT , rabbit_stream_sac_coordinator ).
9394
@@ -543,7 +544,7 @@ reachable_coord_members() ->
543544 Nodes = rabbit_nodes :list_reachable (),
544545 [{? MODULE , Node } || Node <- Nodes ].
545546
546- version () -> 6 .
547+ version () -> 7 .
547548
548549which_module (_ ) ->
549550 ? MODULE .
@@ -588,14 +589,21 @@ apply(#{index := _Idx, machine_version := MachineVersion} = Meta0,
588589 {reply , Reply } ->
589590 return (Meta , State0 , Reply , [])
590591 end ;
591- apply (Meta , {sac , SacCommand }, #? MODULE {single_active_consumer = SacState0 ,
592- monitors = Monitors0 } = State0 ) ->
592+ apply (#{machine_version := Vsn } = Meta , {sac , SacCommand },
593+ #? MODULE {single_active_consumer = SacState0 ,
594+ monitors = Monitors0 } = State0 ) ->
593595 Mod = sac_module (Meta ),
594596 {SacState1 , Reply , Effects0 } = Mod :apply (SacCommand , SacState0 ),
595597 {SacState2 , Monitors1 , Effects1 } =
596598 Mod :ensure_monitors (SacCommand , SacState1 , Monitors0 , Effects0 ),
599+ Monitors2 = case ? V7_OR_MORE (Vsn ) of
600+ true ->
601+ Monitors0 ;
602+ false ->
603+ Monitors1
604+ end ,
597605 return (Meta , State0 #? MODULE {single_active_consumer = SacState2 ,
598- monitors = Monitors1 }, Reply , Effects1 );
606+ monitors = Monitors2 }, Reply , Effects1 );
599607apply (#{machine_version := Vsn } = Meta , {down , Pid , Reason } = Cmd ,
600608 #? MODULE {streams = Streams0 ,
601609 monitors = Monitors0 ,
@@ -607,6 +615,18 @@ apply(#{machine_version := Vsn} = Meta, {down, Pid, Reason} = Cmd,
607615 _ ->
608616 []
609617 end ,
618+ {SacState1 , SacEffects } =
619+ case Vsn >= 7 of
620+ true ->
621+ % % all down PIDs are submitted to SAC
622+ % % it filters out if not interested
623+ sac_handle_connection_down (Meta , SacState0 ,
624+ Pid , Reason , Vsn );
625+ false ->
626+ {SacState0 , []}
627+ end ,
628+ Effects1 = Effects0 ++ SacEffects ,
629+ State1 = State #? MODULE {single_active_consumer = SacState1 },
610630 case maps :take (Pid , Monitors0 ) of
611631 {{StreamId , listener }, Monitors } when Vsn < 2 ->
612632 Listeners = case maps :take (StreamId , StateListeners0 ) of
@@ -620,8 +640,8 @@ apply(#{machine_version := Vsn} = Meta, {down, Pid, Reason} = Cmd,
620640 Listeners1 #{StreamId => Pids }
621641 end
622642 end ,
623- return (Meta , State #? MODULE {listeners = Listeners ,
624- monitors = Monitors }, ok , Effects0 );
643+ return (Meta , State1 #? MODULE {listeners = Listeners ,
644+ monitors = Monitors }, ok , Effects1 );
625645 {{PidStreams , listener }, Monitors } when ? V2_OR_MORE (Vsn ) ->
626646 Streams = maps :fold (
627647 fun (StreamId , _ , Acc ) ->
@@ -638,31 +658,34 @@ apply(#{machine_version := Vsn} = Meta, {down, Pid, Reason} = Cmd,
638658 Acc
639659 end
640660 end , Streams0 , PidStreams ),
641- return (Meta , State #? MODULE {streams = Streams ,
642- monitors = Monitors }, ok , Effects0 );
661+ return (Meta , State1 #? MODULE {streams = Streams ,
662+ monitors = Monitors }, ok , Effects1 );
643663 {{StreamId , member }, Monitors1 } ->
644664 case Streams0 of
645665 #{StreamId := Stream0 } ->
646666 Stream1 = update_stream (Meta , Cmd , Stream0 ),
647- {Stream , Effects } = evaluate_stream (Meta , Stream1 , Effects0 ),
667+ {Stream , Effects } = evaluate_stream (Meta , Stream1 , Effects1 ),
648668 Streams = Streams0 #{StreamId => Stream },
649- return (Meta , State #? MODULE {streams = Streams ,
650- monitors = Monitors1 }, ok ,
669+ return (Meta , State1 #? MODULE {streams = Streams ,
670+ monitors = Monitors1 }, ok ,
651671 Effects );
652672 _ ->
653673 % % stream not found, can happen if "late" downs are
654674 % % received
655- return (Meta , State #? MODULE {streams = Streams0 ,
656- monitors = Monitors1 }, ok , Effects0 )
675+ return (Meta , State1 #? MODULE {streams = Streams0 ,
676+ monitors = Monitors1 }, ok , Effects1 )
657677 end ;
658- {sac , Monitors1 } ->
659- {SacState1 , SacEffects } = sac_handle_connection_down (Meta , SacState0 ,
660- Pid , Reason , Vsn ),
661- return (Meta , State #? MODULE {single_active_consumer = SacState1 ,
678+ {sac , Monitors1 } when Vsn < 7 ->
679+ #? MODULE {single_active_consumer = SacSt0 } = State1 ,
680+ {SacSt1 , SacEfts } = sac_handle_connection_down (Meta , SacSt0 ,
681+ Pid , Reason , Vsn ),
682+ return (Meta , State #? MODULE {single_active_consumer = SacSt1 ,
662683 monitors = Monitors1 },
663- ok , [Effects0 ++ SacEffects ]);
684+ ok , [Effects1 ++ SacEfts ]);
664685 error ->
665- return (Meta , State , ok , Effects0 )
686+ return (Meta , State1 , ok , Effects1 );
687+ _ ->
688+ return (Meta , State1 , ok , Effects1 )
666689 end ;
667690apply (#{machine_version := MachineVersion } = Meta ,
668691 {register_listener , #{pid := Pid ,
@@ -2304,6 +2327,9 @@ machine_version(4 = From, 5, #?MODULE{single_active_consumer = Sac0} = State) ->
23042327 SacExport = rabbit_stream_sac_coordinator_v4 :state_to_map (Sac0 ),
23052328 Sac1 = rabbit_stream_sac_coordinator :import_state (From , SacExport ),
23062329 {State #? MODULE {single_active_consumer = Sac1 }, []};
2330+ machine_version (6 , 7 , #? MODULE {monitors = Monitors0 } = State ) ->
2331+ Monitors = maps :filter (fun (_Key , Value ) -> Value =/= sac end , Monitors0 ),
2332+ {State #? MODULE {monitors = Monitors }, []};
23072333machine_version (From , To , State ) ->
23082334 ? LOG_INFO (" Stream coordinator machine version changes from ~tp to ~tp , no state changes required." ,
23092335 [From , To ]),
0 commit comments