@@ -1528,25 +1528,14 @@ shrink_all(Node) ->
15281528grow (Node , VhostSpec , QueueSpec , Strategy ) ->
15291529 grow (Node , VhostSpec , QueueSpec , Strategy , promotable ).
15301530
1531- - spec grow (node (), binary (), binary (), all | even , membership ()) ->
1531+ - spec grow (node () | integer () , binary (), binary (), all | even , membership ()) ->
15321532 [{rabbit_amqqueue :name (),
15331533 {ok , pos_integer ()} | {error , pos_integer (), term ()}}].
1534- grow (Node , VhostSpec , QueueSpec , Strategy , Membership ) ->
1534+ grow (Node , VhostSpec , QueueSpec , Strategy , Membership ) when is_atom ( Node ) ->
15351535 Running = rabbit_nodes :list_running (),
15361536 [begin
15371537 Size = length (get_nodes (Q )),
1538- QName = amqqueue :get_name (Q ),
1539- rabbit_log :info (" ~ts : adding a new member (replica) on node ~w " ,
1540- [rabbit_misc :rs (QName ), Node ]),
1541- case add_member (Q , Node , Membership ) of
1542- ok ->
1543- {QName , {ok , Size + 1 }};
1544- {error , Err } ->
1545- rabbit_log :warning (
1546- " ~ts : failed to add member (replica) on node ~w , error: ~w " ,
1547- [rabbit_misc :rs (QName ), Node , Err ]),
1548- {QName , {error , Size , Err }}
1549- end
1538+ maybe_grow (Q , Node , Membership , Size )
15501539 end
15511540 || Q <- rabbit_amqqueue :list (),
15521541 amqqueue :get_type (Q ) == ? MODULE ,
@@ -1556,7 +1545,53 @@ grow(Node, VhostSpec, QueueSpec, Strategy, Membership) ->
15561545 lists :member (Node , Running ),
15571546 matches_strategy (Strategy , get_nodes (Q )),
15581547 is_match (amqqueue :get_vhost (Q ), VhostSpec ) andalso
1559- is_match (get_resource_name (amqqueue :get_name (Q )), QueueSpec ) ].
1548+ is_match (get_resource_name (amqqueue :get_name (Q )), QueueSpec ) ];
1549+
1550+ grow (QuorumClusterSize , VhostSpec , QueueSpec , Strategy , Membership )
1551+ when is_integer (QuorumClusterSize ) ->
1552+ Running = rabbit_nodes :list_running (),
1553+ TotalRunning = length (Running ),
1554+
1555+ TargetQuorumClusterSize =
1556+ if QuorumClusterSize > TotalRunning ->
1557+ % % we cant grow beyond total running nodes
1558+ TotalRunning ;
1559+ true ->
1560+ QuorumClusterSize
1561+ end ,
1562+
1563+ lists :flatten (
1564+ [begin
1565+ QNodes = get_nodes (Q ),
1566+ case length (QNodes ) of
1567+ Size when Size < TargetQuorumClusterSize ->
1568+ TargetAvailableNodes = Running -- QNodes ,
1569+ Node = hd (TargetAvailableNodes ),
1570+ maybe_grow (Q , Node , Membership , Size );
1571+ _ ->
1572+ []
1573+ end
1574+ end
1575+ || _ <- lists :seq (1 , TargetQuorumClusterSize ),
1576+ Q <- rabbit_amqqueue :list (),
1577+ amqqueue :get_type (Q ) == ? MODULE ,
1578+ matches_strategy (Strategy , get_nodes (Q )),
1579+ is_match (amqqueue :get_vhost (Q ), VhostSpec ) andalso
1580+ is_match (get_resource_name (amqqueue :get_name (Q )), QueueSpec )]).
1581+
1582+ maybe_grow (Q , Node , Membership , Size ) ->
1583+ QName = amqqueue :get_name (Q ),
1584+ rabbit_log :info (" ~ts : adding a new member (replica) on node ~w " ,
1585+ [rabbit_misc :rs (QName ), Node ]),
1586+ case add_member (Q , Node , Membership ) of
1587+ ok ->
1588+ {QName , {ok , Size + 1 }};
1589+ {error , Err } ->
1590+ rabbit_log :warning (
1591+ " ~ts : failed to add member (replica) on node ~w , error: ~w " ,
1592+ [rabbit_misc :rs (QName ), Node , Err ]),
1593+ {QName , {error , Size , Err }}
1594+ end .
15601595
15611596- spec transfer_leadership (amqqueue :amqqueue (), node ()) -> {migrated , node ()} | {not_migrated , atom ()}.
15621597transfer_leadership (Q , Destination ) ->
0 commit comments