@@ -59,6 +59,7 @@ groups() ->
5959 delete_member_queue_not_found ,
6060 delete_member ,
6161 delete_member_not_a_member ,
62+ delete_member_member_already_deleted ,
6263 node_removal_is_quorum_critical ]
6364 ++ memory_tests ()},
6465 {cluster_size_3 , [], [
@@ -1955,6 +1956,32 @@ delete_member_not_a_member(Config) ->
19551956 rpc :call (Server , rabbit_quorum_queue , delete_member ,
19561957 [<<" /" >>, QQ , Server ])).
19571958
1959+ delete_member_member_already_deleted (Config ) ->
1960+ [Server , Server2 ] = Servers = rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
1961+ NServers = length (Servers ),
1962+ Ch = rabbit_ct_client_helpers :open_channel (Config , Server ),
1963+ QQ = ? config (queue_name , Config ),
1964+ RaName = ra_name (QQ ),
1965+ ? assertEqual ({'queue.declare_ok' , QQ , 0 , 0 },
1966+ declare (Ch , QQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>}])),
1967+ ? awaitMatch (NServers , count_online_nodes (Server , <<" /" >>, QQ ), ? DEFAULT_AWAIT ),
1968+ ServerId = {RaName , Server },
1969+ ServerId2 = {RaName , Server2 },
1970+ % % use are APU directory to simulate situation where the ra:remove_server/2
1971+ % % call timed out but later succeeded
1972+ ? assertMatch (ok ,
1973+ rpc :call (Server2 , ra , leave_and_terminate ,
1974+ [quorum_queues , ServerId , ServerId2 ])),
1975+
1976+ % % idempotent by design
1977+ ? assertEqual (ok ,
1978+ rpc :call (Server , rabbit_quorum_queue , delete_member ,
1979+ [<<" /" >>, QQ , Server2 ])),
1980+ {ok , Q } = rpc :call (Server , rabbit_amqqueue , lookup , [QQ , <<" /" >>]),
1981+ #{nodes := Nodes } = amqqueue :get_type_state (Q ),
1982+ ? assertEqual (1 , length (Nodes )),
1983+ ok .
1984+
19581985delete_member_during_node_down (Config ) ->
19591986 [Server , DownServer , Remove ] = Servers = rabbit_ct_broker_helpers :get_node_configs (
19601987 Config , nodename ),
0 commit comments