summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--deps/rabbit/src/rabbit.erl20
-rw-r--r--deps/rabbit/src/rabbit_queue_type.erl15
2 files changed, 28 insertions, 7 deletions
diff --git a/deps/rabbit/src/rabbit.erl b/deps/rabbit/src/rabbit.erl
index 32e07d095b..2c123ad2fb 100644
--- a/deps/rabbit/src/rabbit.erl
+++ b/deps/rabbit/src/rabbit.erl
@@ -963,11 +963,23 @@ do_run_postlaunch_phase(Plugins) ->
end
end, Plugins),
- %% Export definitions after all plugins have been enabled,
+ %% Import definitions after all plugins have been enabled,
%% see rabbitmq/rabbitmq-server#2384.
- case rabbit_definitions:maybe_load_definitions() of
- ok -> ok;
- DefLoadError -> throw(DefLoadError)
+ %% Also, if target_cluster_size_hint is set, don't import
+ %% definitions until all nodes join the cluster
+ %% rabbitmq/rabbitmq-server#3850
+ TargetClusterSize = rabbit_nodes:target_cluster_size_hint(),
+ CurrentClusterSize = rabbit_nodes:total_count(),
+ case CurrentClusterSize >= TargetClusterSize of
+ true ->
+ ?LOG_INFO("Target cluster size of ~p node(s) has been reached.", [TargetClusterSize]),
+ case rabbit_definitions:maybe_load_definitions() of
+ ok -> ok;
+ DefLoadError -> throw(DefLoadError)
+ end;
+ false ->
+ ?LOG_INFO("Not importing definitions because ~p more node(s) are expected in the cluster.", [TargetClusterSize - CurrentClusterSize]),
+ ok
end,
%% Start listeners after all plugins have been enabled,
diff --git a/deps/rabbit/src/rabbit_queue_type.erl b/deps/rabbit/src/rabbit_queue_type.erl
index 128d0a2bd0..07f22a3573 100644
--- a/deps/rabbit/src/rabbit_queue_type.erl
+++ b/deps/rabbit/src/rabbit_queue_type.erl
@@ -222,9 +222,18 @@ is_enabled(Type) ->
{'absent', amqqueue:amqqueue(), absent_reason()} |
{protocol_error, Type :: atom(), Reason :: string(), Args :: term()}.
declare(Q0, Node) ->
- Q = rabbit_queue_decorator:set(rabbit_policy:set(Q0)),
- Mod = amqqueue:get_type(Q),
- Mod:declare(Q, Node).
+ TargetClusterSize = rabbit_nodes:target_cluster_size_hint(),
+ CurrentClusterSize = rabbit_nodes:total_count(),
+ case CurrentClusterSize >= TargetClusterSize of
+ true ->
+ Q = rabbit_queue_decorator:set(rabbit_policy:set(Q0)),
+ Mod = amqqueue:get_type(Q),
+ Mod:declare(Q, Node);
+ false ->
+ timer:sleep(5000),
+ declare(Q0, Node)
+ end.
+
-spec delete(amqqueue:amqqueue(), boolean(),
boolean(), rabbit_types:username()) ->