@@ -1672,18 +1672,17 @@ 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 = 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+ Online = [N || N <- Voters , lists :member (N , Running )],
16851684 {_ , LeaderNode } = amqqueue :get_pid (Q ),
1686- State = case is_minority (Nodes , Online ) of
1685+ State = case is_minority (Voters , Online ) of
16871686 true when length (Online ) == 0 ->
16881687 down ;
16891688 true ->
@@ -1696,10 +1695,12 @@ format(Q, Ctx) when ?is_amqqueue(Q) ->
16961695 down
16971696 end
16981697 end ,
1698+ Nodes = lists :sort (get_nodes (Q )),
16991699 [{type , quorum },
17001700 {state , State },
17011701 {node , LeaderNode },
17021702 {members , Nodes },
1703+ {voters , Voters },
17031704 {leader , LeaderNode },
17041705 {online , Online }].
17051706
@@ -1783,6 +1784,15 @@ get_nodes(Q) when ?is_amqqueue(Q) ->
17831784 #{nodes := Nodes } = amqqueue :get_type_state (Q ),
17841785 Nodes .
17851786
1787+ get_voters (Q ) when ? amqqueue_is_quorum (Q ) ->
1788+ {_ , Leader } = amqqueue :get_pid (Q ),
1789+ % % FIXME replace with proper API pending rabbitmq/ra#411
1790+ case ra_server_proc :state_query (Leader , voters , 1000 ) of
1791+ {ok , Members , _ } -> Members ;
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