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