@@ -59,6 +59,7 @@ groups() ->
59
59
delete_member_queue_not_found ,
60
60
delete_member ,
61
61
delete_member_not_a_member ,
62
+ delete_member_member_already_deleted ,
62
63
node_removal_is_quorum_critical ]
63
64
++ memory_tests ()},
64
65
{cluster_size_3 , [], [
@@ -1955,6 +1956,32 @@ delete_member_not_a_member(Config) ->
1955
1956
rpc :call (Server , rabbit_quorum_queue , delete_member ,
1956
1957
[<<" /" >>, QQ , Server ])).
1957
1958
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
+
1958
1985
delete_member_during_node_down (Config ) ->
1959
1986
[Server , DownServer , Remove ] = Servers = rabbit_ct_broker_helpers :get_node_configs (
1960
1987
Config , nodename ),
0 commit comments