@@ -110,7 +110,8 @@ groups() ->
110110 node_removal_is_not_quorum_critical ,
111111 select_nodes_with_least_replicas ,
112112 select_nodes_with_least_replicas_node_down ,
113- subscribe_from_each
113+ subscribe_from_each ,
114+ grow_queue
114115
115116
116117 ]},
@@ -1536,6 +1537,77 @@ subscribe_from_each(Config) ->
15361537
15371538 ok .
15381539
1540+ grow_queue (Config ) ->
1541+ [Server0 , Server1 , _Server2 , _Server3 , _Server4 ] =
1542+ rabbit_ct_broker_helpers :get_node_configs (Config , nodename ),
1543+
1544+ Ch = rabbit_ct_client_helpers :open_channel (Config , Server0 ),
1545+ QQ = ? config (queue_name , Config ),
1546+ AQ = ? config (alt_queue_name , Config ),
1547+ ? assertEqual ({'queue.declare_ok' , QQ , 0 , 0 },
1548+ declare (Ch , QQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
1549+ {<<" x-quorum-initial-group-size" >>, long , 5 }])),
1550+ ? assertEqual ({'queue.declare_ok' , AQ , 0 , 0 },
1551+ declare (Ch , AQ , [{<<" x-queue-type" >>, longstr , <<" quorum" >>},
1552+ {<<" x-quorum-initial-group-size" >>, long , 5 }])),
1553+
1554+ QQs = [QQ , AQ ],
1555+ MsgCount = 3 ,
1556+
1557+ [begin
1558+ RaName = ra_name (Q ),
1559+ rabbit_ct_client_helpers :publish (Ch , Q , MsgCount ),
1560+ wait_for_messages_ready ([Server0 ], RaName , MsgCount ),
1561+ {ok , Q0 } = rpc :call (Server0 , rabbit_amqqueue , lookup , [Q , <<" /" >>]),
1562+ #{nodes := Nodes0 } = amqqueue :get_type_state (Q0 ),
1563+ ? assertEqual (5 , length (Nodes0 ))
1564+ end || Q <- QQs ],
1565+
1566+ rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue ,
1567+ force_all_queues_shrink_member_to_current_member , []),
1568+
1569+ TargetClusterSize_1 = 1 ,
1570+ assert_grown_queues (QQs , Server0 , TargetClusterSize_1 , MsgCount ),
1571+
1572+ % % grow queues to node 'Server1'
1573+ TargetClusterSize_2 = 2 ,
1574+ rpc :call (Server0 , rabbit_quorum_queue , grow , [Server1 , <<" /" >>, <<" .*" >>, all ]),
1575+ assert_grown_queues (QQs , Server0 , TargetClusterSize_2 , MsgCount ),
1576+
1577+ % % grow queues to quorum cluster size '2' has no effect
1578+ rpc :call (Server0 , rabbit_quorum_queue , grow , [TargetClusterSize_2 , <<" /" >>, <<" .*" >>, all ]),
1579+ assert_grown_queues (QQs , Server0 , TargetClusterSize_2 , MsgCount ),
1580+
1581+ % % grow queues to quorum cluster size '3'
1582+ TargetClusterSize_3 = 3 ,
1583+ rpc :call (Server0 , rabbit_quorum_queue , grow , [TargetClusterSize_3 , <<" /" >>, <<" .*" >>, all ]),
1584+ assert_grown_queues (QQs , Server0 , TargetClusterSize_3 , MsgCount ),
1585+
1586+ % % grow queues to quorum cluster size '5'
1587+ TargetClusterSize_5 = 5 ,
1588+ rpc :call (Server0 , rabbit_quorum_queue , grow , [TargetClusterSize_5 , <<" /" >>, <<" .*" >>, all ]),
1589+ assert_grown_queues (QQs , Server0 , TargetClusterSize_5 , MsgCount ),
1590+
1591+ % % shrink all queues again
1592+ rabbit_ct_broker_helpers :rpc (Config , 0 , rabbit_quorum_queue ,
1593+ force_all_queues_shrink_member_to_current_member , []),
1594+
1595+ assert_grown_queues (QQs , Server0 , TargetClusterSize_1 , MsgCount ),
1596+
1597+ % % grow queues to quorum cluster size > '5' (limit = 5).
1598+ TargetClusterSize_10 = 10 ,
1599+ rpc :call (Server0 , rabbit_quorum_queue , grow , [TargetClusterSize_10 , <<" /" >>, <<" .*" >>, all ]),
1600+ assert_grown_queues (QQs , Server0 , TargetClusterSize_5 , MsgCount ).
1601+
1602+ assert_grown_queues (Qs , Node , TargetClusterSize , MsgCount ) ->
1603+ [begin
1604+ RaName = ra_name (Q ),
1605+ wait_for_messages_ready ([Node ], RaName , MsgCount ),
1606+ {ok , Q0 } = rpc :call (Node , rabbit_amqqueue , lookup , [Q , <<" /" >>]),
1607+ #{nodes := Nodes0 } = amqqueue :get_type_state (Q0 ),
1608+ ? assertEqual (TargetClusterSize , length (Nodes0 ))
1609+ end || Q <- Qs ].
1610+
15391611gh_12635 (Config ) ->
15401612 % https://github.com/rabbitmq/rabbitmq-server/issues/12635
15411613 [Server0 , _Server1 , Server2 ] =
0 commit comments