3939 handle_connection_down /2 ,
4040 consumer_groups /3 ,
4141 group_consumers /5 ,
42- overview /1 ]).
42+ overview /1 ,
43+ import_state /2 ]).
4344
4445-import (rabbit_stream_coordinator , [ra_local_query /1 ]).
4546
47+ -define (ACTIVE , active ).
48+ -define (WAITING , waiting ).
49+ -define (DEACTIVATING , deactivating ).
50+
4651% % Single Active Consumer API
4752-spec register_consumer (binary (),
4853 binary (),
@@ -233,7 +238,7 @@ apply(#command_unregister_consumer{vhost = VirtualHost,
233238 G1 = remove_from_group (Consumer , Group0 ),
234239 handle_consumer_removal (
235240 G1 , Stream , ConsumerName ,
236- is_active (Consumer # consumer .active ));
241+ is_active (Consumer # consumer .status ));
237242 false ->
238243 {Group0 , []}
239244 end ,
@@ -257,10 +262,10 @@ apply(#command_activate_consumer{vhost = VirtualHost,
257262 [{VirtualHost , Stream , ConsumerName }]),
258263 {undefined , []};
259264 Group0 ->
260- Group1 = update_consumers (Group0 , waiting ),
265+ Group1 = update_consumers (Group0 , ? WAITING ),
261266 # consumer {pid = Pid , subscription_id = SubId } =
262267 evaluate_active_consumer (Group1 ),
263- Group2 = update_consumer_state_in_group (Group1 , Pid , SubId , active ),
268+ Group2 = update_consumer_state_in_group (Group1 , Pid , SubId , ? ACTIVE ),
264269 {Group2 , [notify_consumer_effect (Pid , SubId , Stream , ConsumerName , true )]}
265270 end ,
266271 StreamGroups1 =
@@ -316,7 +321,7 @@ group_consumers(VirtualHost,
316321 #{GroupId := # group {consumers = Consumers }} ->
317322 Cs = lists :foldr (fun (# consumer {subscription_id = SubId ,
318323 owner = Owner ,
319- active = Active },
324+ status = Status },
320325 Acc ) ->
321326 Record =
322327 lists :foldr (fun (subscription_id , RecAcc ) ->
@@ -328,7 +333,7 @@ group_consumers(VirtualHost,
328333 Owner }
329334 | RecAcc ];
330335 (state , RecAcc ) ->
331- [{state , Active }
336+ [{state , cli_consumer_status_label ( Status ) }
332337 | RecAcc ];
333338 (Unknown , RecAcc ) ->
334339 [{Unknown ,
@@ -344,6 +349,11 @@ group_consumers(VirtualHost,
344349 {error , not_found }
345350 end .
346351
352+ cli_consumer_status_label (? ACTIVE ) ->
353+ active ;
354+ cli_consumer_status_label (_ ) ->
355+ inactive .
356+
347357-spec ensure_monitors (command (),
348358 state (),
349359 map (),
@@ -434,7 +444,7 @@ handle_group_after_connection_down(Pid,
434444 % % keep flags to know what happened
435445 {Consumers1 , ActiveRemoved , AnyRemoved } =
436446 lists :foldl (
437- fun (# consumer {pid = P , active = S }, {L , ActiveFlag , _ })
447+ fun (# consumer {pid = P , status = S }, {L , ActiveFlag , _ })
438448 when P == Pid ->
439449 {L , is_active (S ) or ActiveFlag , true };
440450 (C , {L , ActiveFlag , AnyFlag }) ->
@@ -456,6 +466,42 @@ handle_group_after_connection_down(Pid,
456466 end
457467 end .
458468
469+ -spec import_state (ra_machine :version (), map ()) -> state ().
470+ import_state (4 , #{<<" groups" >> := Groups , <<" pids_groups" >> := PidsGroups }) ->
471+ #? MODULE {groups = map_to_groups (Groups ),
472+ pids_groups = map_to_pids_groups (PidsGroups )}.
473+
474+ map_to_groups (Groups ) when is_map (Groups ) ->
475+ maps :fold (fun (K , V , Acc ) ->
476+ Acc #{K => map_to_group (V )}
477+ end , #{}, Groups );
478+ map_to_groups (_ ) ->
479+ #{}.
480+
481+ map_to_pids_groups (PidsGroups ) when is_map (PidsGroups ) ->
482+ PidsGroups ;
483+ map_to_pids_groups (_ ) ->
484+ #{}.
485+
486+ map_to_group (#{<<" consumers" >> := Consumers , <<" partition_index" >> := Index }) ->
487+ C = lists :foldl (fun (V , Acc ) ->
488+ Acc ++ [map_to_consumer (V )]
489+ end , [], Consumers ),
490+ # group {consumers = C ,
491+ partition_index = Index }.
492+
493+ map_to_consumer (#{<<" pid" >> := Pid , <<" subscription_id" >> := SubId ,
494+ <<" owner" >> := Owner , <<" active" >> := Active }) ->
495+ # consumer {pid = Pid ,
496+ subscription_id = SubId ,
497+ owner = Owner ,
498+ status = active_to_status (Active )}.
499+
500+ active_to_status (true ) ->
501+ ? ACTIVE ;
502+ active_to_status (false ) ->
503+ ? WAITING .
504+
459505is_active (waiting ) ->
460506 false ;
461507is_active (_ ) ->
@@ -478,12 +524,12 @@ do_register_consumer(VirtualHost,
478524 # consumer {pid = ConnectionPid ,
479525 owner = Owner ,
480526 subscription_id = SubscriptionId ,
481- active = waiting };
527+ status = ? WAITING };
482528 false ->
483529 # consumer {pid = ConnectionPid ,
484530 subscription_id = SubscriptionId ,
485531 owner = Owner ,
486- active = active }
532+ status = ? ACTIVE }
487533 end ,
488534 Group1 = add_to_group (Consumer , Group0 ),
489535 StreamGroups1 =
@@ -493,17 +539,17 @@ do_register_consumer(VirtualHost,
493539 Group1 ,
494540 StreamGroups0 ),
495541
496- # consumer {active = Active } = Consumer ,
542+ # consumer {status = Status } = Consumer ,
497543 Effects =
498- case Active of
499- active ->
544+ case Status of
545+ ? ACTIVE ->
500546 [notify_consumer_effect (ConnectionPid , SubscriptionId ,
501- Stream , ConsumerName , is_active (Active ))];
547+ Stream , ConsumerName , is_active (Status ))];
502548 _ ->
503549 []
504550 end ,
505551
506- {State #? MODULE {groups = StreamGroups1 }, {ok , is_active (Active )}, Effects };
552+ {State #? MODULE {groups = StreamGroups1 }, {ok , is_active (Status )}, Effects };
507553do_register_consumer (VirtualHost ,
508554 Stream ,
509555 _PartitionIndex ,
@@ -523,7 +569,7 @@ do_register_consumer(VirtualHost,
523569 # consumer {pid = ConnectionPid ,
524570 owner = Owner ,
525571 subscription_id = SubscriptionId ,
526- active = active },
572+ status = ? ACTIVE },
527573 G1 = add_to_group (Consumer0 , Group0 ),
528574 {G1 ,
529575 [notify_consumer_effect (ConnectionPid , SubscriptionId ,
@@ -534,7 +580,7 @@ do_register_consumer(VirtualHost,
534580 # consumer {pid = ConnectionPid ,
535581 owner = Owner ,
536582 subscription_id = SubscriptionId ,
537- active = waiting },
583+ status = ? WAITING },
538584 G1 = add_to_group (Consumer0 , Group0 ),
539585
540586 case lookup_active_consumer (G1 ) of
@@ -550,7 +596,7 @@ do_register_consumer(VirtualHost,
550596 {update_consumer_state_in_group (G1 ,
551597 ActPid ,
552598 ActSubId ,
553- deactivating ),
599+ ? DEACTIVATING ),
554600 [notify_consumer_effect (ActPid ,
555601 ActSubId ,
556602 Stream ,
@@ -570,9 +616,9 @@ do_register_consumer(VirtualHost,
570616 ConsumerName ,
571617 Group1 ,
572618 StreamGroups0 ),
573- {value , # consumer {active = Active }} =
619+ {value , # consumer {status = Status }} =
574620 lookup_consumer (ConnectionPid , SubscriptionId , Group1 ),
575- {State #? MODULE {groups = StreamGroups1 }, {ok , is_active (Active )}, Effects }.
621+ {State #? MODULE {groups = StreamGroups1 }, {ok , is_active (Status )}, Effects }.
576622
577623handle_consumer_removal (# group {consumers = []} = G , _ , _ , _ ) ->
578624 {G , []};
@@ -608,7 +654,7 @@ handle_consumer_removal(Group0, Stream, ConsumerName, ActiveRemoved) ->
608654 {update_consumer_state_in_group (Group0 ,
609655 ActPid ,
610656 ActSubId ,
611- deactivating ),
657+ ? DEACTIVATING ),
612658 [notify_consumer_effect (ActPid , ActSubId ,
613659 Stream , ConsumerName , false , true )]}
614660 end ;
@@ -618,7 +664,7 @@ handle_consumer_removal(Group0, Stream, ConsumerName, ActiveRemoved) ->
618664 % % the active one is going away, picking a new one
619665 # consumer {pid = P , subscription_id = SID } =
620666 evaluate_active_consumer (Group0 ),
621- {update_consumer_state_in_group (Group0 , P , SID , active ),
667+ {update_consumer_state_in_group (Group0 , P , SID , ? ACTIVE ),
622668 [notify_consumer_effect (P , SID ,
623669 Stream , ConsumerName , true )]};
624670 false ->
@@ -688,13 +734,13 @@ compute_active_consumer(#group{consumers = Crs,
688734compute_active_consumer (# group {partition_index = - 1 ,
689735 consumers = [Consumer0 ]} =
690736 Group0 ) ->
691- Consumer1 = Consumer0 # consumer {active = active },
737+ Consumer1 = Consumer0 # consumer {status = ? ACTIVE },
692738 Group0 # group {consumers = [Consumer1 ]};
693739compute_active_consumer (# group {partition_index = - 1 ,
694740 consumers = [Consumer0 | T ]} =
695741 Group0 ) ->
696- Consumer1 = Consumer0 # consumer {active = active },
697- Consumers = lists :map (fun (C ) -> C # consumer {active = waiting } end , T ),
742+ Consumer1 = Consumer0 # consumer {status = ? ACTIVE },
743+ Consumers = lists :map (fun (C ) -> C # consumer {status = ? WAITING } end , T ),
698744 Group0 # group {consumers = [Consumer1 ] ++ Consumers }.
699745
700746evaluate_active_consumer (# group {partition_index = PartitionIndex ,
@@ -711,7 +757,7 @@ lookup_consumer(ConnectionPid, SubscriptionId,
711757 Consumers ).
712758
713759lookup_active_consumer (# group {consumers = Consumers }) ->
714- lists :search (fun (# consumer {active = Active }) -> is_active (Active ) end ,
760+ lists :search (fun (# consumer {status = Status }) -> is_active (Status ) end ,
715761 Consumers ).
716762
717763update_groups (_VirtualHost ,
@@ -737,20 +783,20 @@ update_groups(VirtualHost,
737783update_consumer_state_in_group (# group {consumers = Consumers0 } = G ,
738784 Pid ,
739785 SubId ,
740- NewState ) ->
786+ NewStatus ) ->
741787 CS1 = lists :map (fun (C0 ) ->
742788 case C0 of
743789 # consumer {pid = Pid , subscription_id = SubId } ->
744- C0 # consumer {active = NewState };
790+ C0 # consumer {status = NewStatus };
745791 C -> C
746792 end
747793 end ,
748794 Consumers0 ),
749795 G # group {consumers = CS1 }.
750796
751- update_consumers (# group {consumers = Consumers0 } = G , NewState ) ->
797+ update_consumers (# group {consumers = Consumers0 } = G , NewStatus ) ->
752798 Consumers1 = lists :map (fun (C ) ->
753- C # consumer {active = NewState }
799+ C # consumer {status = NewStatus }
754800 end , Consumers0 ),
755801 G # group {consumers = Consumers1 }.
756802
0 commit comments