diff options
-rw-r--r-- | deps/rabbit/src/rabbit.erl | 20 | ||||
-rw-r--r-- | deps/rabbit/src/rabbit_queue_type.erl | 15 |
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()) -> |