@@ -279,9 +279,14 @@ start_cluster(Q) ->
279279 UIDs = maps :from_list ([{Node , ra :new_uid (ra_lib :to_binary (RaName ))}
280280 || Node <- [LeaderNode | FollowerNodes ]]),
281281 NewQ0 = amqqueue :set_pid (Q , LeaderId ),
282- NewQ1 = amqqueue :set_type_state (NewQ0 ,
283- #{nodes => [LeaderNode | FollowerNodes ],
284- uids => UIDs }),
282+ NewQ1 = case rabbit_feature_flags :is_enabled (track_qq_members_uids ) of
283+ false ->
284+ amqqueue :set_type_state (NewQ0 ,
285+ #{nodes => [LeaderNode | FollowerNodes ]});
286+ true ->
287+ amqqueue :set_type_state (NewQ0 ,
288+ #{nodes => UIDs })
289+ end ,
285290
286291 Versions = [V || {ok , V } <- erpc :multicall (FollowerNodes ,
287292 rabbit_fifo , version , [],
@@ -726,7 +731,7 @@ repair_amqqueue_nodes(Q0) ->
726731 {Name , _ } = amqqueue :get_pid (Q0 ),
727732 Members = ra_leaderboard :lookup_members (Name ),
728733 RaNodes = [N || {_ , N } <- Members ],
729- #{ nodes : = Nodes } = amqqueue : get_type_state (Q0 ),
734+ Nodes = get_nodes (Q0 ),
730735 case lists :sort (RaNodes ) =:= lists :sort (Nodes ) of
731736 true ->
732737 % % up to date
@@ -735,7 +740,18 @@ repair_amqqueue_nodes(Q0) ->
735740 % % update amqqueue record
736741 Fun = fun (Q ) ->
737742 TS0 = amqqueue :get_type_state (Q ),
738- TS = TS0 #{nodes => RaNodes },
743+ TS = case rabbit_feature_flags :is_enabled (track_qq_members_uids )
744+ andalso has_uuid_tracking (TS0 )
745+ of
746+ false ->
747+ TS0 #{nodes => RaNodes };
748+ true ->
749+ RaUids = maps :from_list ([{N , erpc :call (N , ra_directory , uid_of ,
750+ [? RA_SYSTEM , Name ],
751+ ? RPC_TIMEOUT )}
752+ || N <- RaNodes ]),
753+ TS0 #{nodes => RaUids }
754+ end ,
739755 amqqueue :set_type_state (Q , TS )
740756 end ,
741757 _ = rabbit_amqqueue :update (QName , Fun ),
@@ -796,10 +812,9 @@ recover(_Vhost, Queues) ->
796812 QName = amqqueue :get_name (Q0 ),
797813 MutConf = make_mutable_config (Q0 ),
798814 RaUId = ra_directory :uid_of (? RA_SYSTEM , Name ),
799- QTypeState0 = amqqueue :get_type_state (Q0 ),
800- RaUIds = maps :get (uids , QTypeState0 , undefined ),
801- QTypeState = case RaUIds of
802- undefined ->
815+ #{nodes := Nodes } = QTypeState0 = amqqueue :get_type_state (Q0 ),
816+ QTypeState = case Nodes of
817+ List when is_list (List ) ->
803818 % % Queue is not aware of node to uid mapping, do nothing
804819 QTypeState0 ;
805820 #{node () := RaUId } ->
@@ -810,7 +825,7 @@ recover(_Vhost, Queues) ->
810825 % % does not match the one returned by ra_directory, regen uid
811826 maybe_delete_data_dir (RaUId ),
812827 NewRaUId = ra :new_uid (ra_lib :to_binary (Name )),
813- QTypeState0 #{uids := RaUIds #{node () => NewRaUId }}
828+ QTypeState0 #{nodes := Nodes #{node () => NewRaUId }}
814829 end ,
815830 Q = amqqueue :set_type_state (Q0 , QTypeState ),
816831 Res = case ra :restart_server (? RA_SYSTEM , ServerId , MutConf ) of
@@ -1413,21 +1428,20 @@ do_add_member(Q0, Node, Membership, Timeout)
14131428 % % TODO parallel calls might crash this, or add a duplicate in quorum_nodes
14141429 ServerId = {RaName , Node },
14151430 Members = members (Q0 ),
1416- QTypeState0 = amqqueue :get_type_state (Q0 ),
1417- RaUIds = maps :get (uids , QTypeState0 , undefined ),
1418- QTypeState = case RaUIds of
1419- undefined ->
1420- % % Queue is not aware of node to uid mapping, do nothing
1421- QTypeState0 ;
1422- #{Node := _ } ->
1423- % % Queue is aware and uid for targeted node exists, do nothing
1424- QTypeState0 ;
1425- _ ->
1426- % % Queue is aware but current node has no UId, regen uid
1427- NewRaUId = ra :new_uid (ra_lib :to_binary (RaName )),
1428- QTypeState0 #{uids := RaUIds #{Node => NewRaUId }}
1429- end ,
1430- Q = amqqueue :set_type_state (Q0 , QTypeState ),
1431+ QTypeState0 = #{nodes := _Nodes }= amqqueue :get_type_state (Q0 ),
1432+ NewRaUId = ra :new_uid (ra_lib :to_binary (RaName )),
1433+ % QTypeState = case Nodes of
1434+ % L when is_list(L) ->
1435+ % %% Queue is not aware of node to uid mapping, just add the new node
1436+ % QTypeState0#{nodes := lists:usort([Node | Nodes])};
1437+ % #{Node := _} ->
1438+ % %% Queue is aware and uid for targeted node exists, do nothing
1439+ % QTypeState0;
1440+ % _ ->
1441+ % %% Queue is aware but current node has no UId, regen uid
1442+ % QTypeState0#{nodes := Nodes#{Node => NewRaUId}}
1443+ % end,
1444+ Q = amqqueue :set_type_state (Q0 , QTypeState0 ),
14311445 MachineVersion = erpc_call (Node , rabbit_fifo , version , [], infinity ),
14321446 Conf = make_ra_conf (Q , ServerId , Membership , MachineVersion ),
14331447 case ra :start_server (? RA_SYSTEM , Conf ) of
@@ -1443,8 +1457,12 @@ do_add_member(Q0, Node, Membership, Timeout)
14431457 {ok , {RaIndex , RaTerm }, Leader } ->
14441458 Fun = fun (Q1 ) ->
14451459 Q2 = update_type_state (
1446- Q1 , fun (#{nodes := Nodes } = Ts ) ->
1447- Ts #{nodes => lists :usort ([Node | Nodes ])}
1460+ Q1 , fun (#{nodes := NodesList } = Ts ) when is_list (NodesList ) ->
1461+ Ts #{nodes => lists :usort ([Node | NodesList ])};
1462+ (#{nodes := #{Node := _ } = _NodesMap } = Ts ) ->
1463+ Ts ;
1464+ (#{nodes := NodesMap } = Ts ) when is_map (NodesMap ) ->
1465+ Ts #{nodes => maps :put (Node , NewRaUId , NodesMap )}
14481466 end ),
14491467 amqqueue :set_pid (Q2 , Leader )
14501468 end ,
@@ -1517,12 +1535,10 @@ delete_member(Q, Node) when ?amqqueue_is_quorum(Q) ->
15171535 Fun = fun (Q1 ) ->
15181536 update_type_state (
15191537 Q1 ,
1520- fun (#{nodes := Nodes ,
1521- uids := UIds } = Ts ) ->
1522- Ts #{nodes => lists :delete (Node , Nodes ),
1523- uids => maps :remove (Node , UIds )};
1524- (#{nodes := Nodes } = Ts ) ->
1525- Ts #{nodes => lists :delete (Node , Nodes )}
1538+ fun (#{nodes := Nodes } = Ts ) when is_list (Nodes ) ->
1539+ Ts #{nodes => lists :delete (Node , Nodes )};
1540+ (#{nodes := Nodes } = Ts ) when is_map (Nodes ) ->
1541+ Ts #{nodes => maps :remove (Node , Nodes )}
15261542 end )
15271543 end ,
15281544 _ = rabbit_amqqueue :update (QName , Fun ),
@@ -2069,7 +2085,12 @@ make_mutable_config(Q) ->
20692085
20702086get_nodes (Q ) when ? is_amqqueue (Q ) ->
20712087 #{nodes := Nodes } = amqqueue :get_type_state (Q ),
2072- Nodes .
2088+ case Nodes of
2089+ List when is_list (List ) ->
2090+ List ;
2091+ Map when is_map (Map ) ->
2092+ maps :keys (Map )
2093+ end .
20732094
20742095get_connected_nodes (Q ) when ? is_amqqueue (Q ) ->
20752096 ErlangNodes = [node () | nodes ()],
@@ -2425,3 +2446,8 @@ queue_vm_stats_sups() ->
24252446queue_vm_ets () ->
24262447 {[quorum_ets ],
24272448 [[ra_log_ets ]]}.
2449+
2450+ has_uuid_tracking (#{nodes := Nodes }) when is_map (Nodes ) ->
2451+ true ;
2452+ has_uuid_tracking (_QTypeState ) ->
2453+ false .
0 commit comments