@@ -1672,34 +1672,36 @@ online(Q) when ?is_amqqueue(Q) ->
16721672 is_pid (Pid )].
16731673
16741674format (Q , Ctx ) when ? is_amqqueue (Q ) ->
1675- % % TODO: this should really just be voters
1676- Nodes = lists :sort (get_nodes (Q )),
1675+ Voters = lists :sort (get_voters (Q )),
16771676 Running = case Ctx of
16781677 #{running_nodes := Running0 } ->
16791678 Running0 ;
16801679 _ ->
16811680 % % WARN: slow
16821681 rabbit_nodes :list_running ()
16831682 end ,
1684- Online = [N || N <- Nodes , lists :member (N , Running )],
1683+ OnlineVoters = [N || N <- Voters , lists :member (N , Running )],
16851684 {_ , LeaderNode } = amqqueue :get_pid (Q ),
1686- State = case is_minority (Nodes , Online ) of
1687- true when length (Online ) == 0 ->
1685+ State = case is_minority (Voters , OnlineVoters ) of
1686+ true when length (OnlineVoters ) == 0 ->
16881687 down ;
16891688 true ->
16901689 minority ;
16911690 false ->
1692- case lists :member (LeaderNode , Online ) of
1691+ case lists :member (LeaderNode , OnlineVoters ) of
16931692 true ->
16941693 running ;
16951694 false ->
16961695 down
16971696 end
16981697 end ,
1698+ Nodes = lists :sort (get_nodes (Q )),
1699+ Online = [N || N <- Nodes , lists :member (N , Running )],
16991700 [{type , quorum },
17001701 {state , State },
17011702 {node , LeaderNode },
17021703 {members , Nodes },
1704+ {voters , Voters },
17031705 {leader , LeaderNode },
17041706 {online , Online }].
17051707
@@ -1783,6 +1785,14 @@ get_nodes(Q) when ?is_amqqueue(Q) ->
17831785 #{nodes := Nodes } = amqqueue :get_type_state (Q ),
17841786 Nodes .
17851787
1788+ get_voters (Q ) when ? amqqueue_is_quorum (Q ) ->
1789+ Leader = amqqueue :get_pid (Q ),
1790+ case ra_server_proc :local_state_query (Leader , voters , 5000 ) of
1791+ {ok , Vs , _ } -> [Node || {_RaName , Node } <- Vs ];
1792+ _ -> []
1793+ end .
1794+
1795+
17861796get_connected_nodes (Q ) when ? is_amqqueue (Q ) ->
17871797 ErlangNodes = [node () | nodes ()],
17881798 [N || N <- get_nodes (Q ), lists :member (N , ErlangNodes )].
@@ -1907,6 +1917,9 @@ force_all_queues_shrink_member_to_current_member() ->
19071917 rabbit_log :warning (" Disaster recovery procedure: shrinking finished" ),
19081918 ok .
19091919
1920+ is_minority ([], _ ) ->
1921+ % % Leader couldn't list voters.
1922+ true ;
19101923is_minority (All , Up ) ->
19111924 MinQuorum = length (All ) div 2 + 1 ,
19121925 length (Up ) < MinQuorum .
0 commit comments