@@ -1543,29 +1543,20 @@ shrink_all(Node) ->
15431543 amqqueue :get_type (Q ) == ? MODULE ,
15441544 lists :member (Node , get_nodes (Q ))].
15451545
1546-
1546+ - spec grow (node () | integer (), binary (), binary (), all | even ) ->
1547+ [{rabbit_amqqueue :name (),
1548+ {ok , pos_integer ()} | {error , pos_integer (), term ()}}].
15471549grow (Node , VhostSpec , QueueSpec , Strategy ) ->
15481550 grow (Node , VhostSpec , QueueSpec , Strategy , promotable ).
15491551
1550- - spec grow (node (), binary (), binary (), all | even , membership ()) ->
1552+ - spec grow (node () | integer () , binary (), binary (), all | even , membership ()) ->
15511553 [{rabbit_amqqueue :name (),
15521554 {ok , pos_integer ()} | {error , pos_integer (), term ()}}].
1553- grow (Node , VhostSpec , QueueSpec , Strategy , Membership ) ->
1555+ grow (Node , VhostSpec , QueueSpec , Strategy , Membership ) when is_atom ( Node ) ->
15541556 Running = rabbit_nodes :list_running (),
15551557 [begin
15561558 Size = length (get_nodes (Q )),
1557- QName = amqqueue :get_name (Q ),
1558- ? LOG_INFO (" ~ts : adding a new member (replica) on node ~w " ,
1559- [rabbit_misc :rs (QName ), Node ]),
1560- case add_member (Q , Node , Membership ) of
1561- ok ->
1562- {QName , {ok , Size + 1 }};
1563- {error , Err } ->
1564- ? LOG_WARNING (
1565- " ~ts : failed to add member (replica) on node ~w , error: ~w " ,
1566- [rabbit_misc :rs (QName ), Node , Err ]),
1567- {QName , {error , Size , Err }}
1568- end
1559+ maybe_grow (Q , Node , Membership , Size )
15691560 end
15701561 || Q <- rabbit_amqqueue :list (),
15711562 amqqueue :get_type (Q ) == ? MODULE ,
@@ -1575,7 +1566,53 @@ grow(Node, VhostSpec, QueueSpec, Strategy, Membership) ->
15751566 lists :member (Node , Running ),
15761567 matches_strategy (Strategy , get_nodes (Q )),
15771568 is_match (amqqueue :get_vhost (Q ), VhostSpec ) andalso
1578- is_match (get_resource_name (amqqueue :get_name (Q )), QueueSpec ) ].
1569+ is_match (get_resource_name (amqqueue :get_name (Q )), QueueSpec ) ];
1570+
1571+ grow (QuorumClusterSize , VhostSpec , QueueSpec , Strategy , Membership )
1572+ when is_integer (QuorumClusterSize ) ->
1573+ Running = rabbit_nodes :list_running (),
1574+ TotalRunning = length (Running ),
1575+
1576+ TargetQuorumClusterSize =
1577+ if QuorumClusterSize > TotalRunning ->
1578+ % % we cant grow beyond total running nodes
1579+ TotalRunning ;
1580+ true ->
1581+ QuorumClusterSize
1582+ end ,
1583+
1584+ lists :flatten (
1585+ [begin
1586+ QNodes = get_nodes (Q ),
1587+ case length (QNodes ) of
1588+ Size when Size < TargetQuorumClusterSize ->
1589+ TargetAvailableNodes = Running -- QNodes ,
1590+ Node = hd (TargetAvailableNodes ),
1591+ maybe_grow (Q , Node , Membership , Size );
1592+ _ ->
1593+ []
1594+ end
1595+ end
1596+ || _ <- lists :seq (1 , TargetQuorumClusterSize ),
1597+ Q <- rabbit_amqqueue :list (),
1598+ amqqueue :get_type (Q ) == ? MODULE ,
1599+ matches_strategy (Strategy , get_nodes (Q )),
1600+ is_match (amqqueue :get_vhost (Q ), VhostSpec ) andalso
1601+ is_match (get_resource_name (amqqueue :get_name (Q )), QueueSpec )]).
1602+
1603+ maybe_grow (Q , Node , Membership , Size ) ->
1604+ QName = amqqueue :get_name (Q ),
1605+ ? LOG_INFO (" ~ts : adding a new member (replica) on node ~w " ,
1606+ [rabbit_misc :rs (QName ), Node ]),
1607+ case add_member (Q , Node , Membership ) of
1608+ ok ->
1609+ {QName , {ok , Size + 1 }};
1610+ {error , Err } ->
1611+ ? LOG_WARNING (
1612+ " ~ts : failed to add member (replica) on node ~w , error: ~w " ,
1613+ [rabbit_misc :rs (QName ), Node , Err ]),
1614+ {QName , {error , Size , Err }}
1615+ end .
15791616
15801617- spec transfer_leadership (amqqueue :amqqueue (), node ()) -> {migrated , node ()} | {not_migrated , atom ()}.
15811618transfer_leadership (Q , Destination ) ->
0 commit comments