summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/rabbit.erl2
-rw-r--r--src/rabbit_mnesia.erl2
-rw-r--r--src/rabbit_peer_discovery.erl56
3 files changed, 59 insertions, 1 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index c52949af4c..5228984ad2 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -328,6 +328,8 @@ broker_start() ->
start_apps(ToBeLoaded),
maybe_sd_notify(),
ok = log_broker_started(rabbit_plugins:strictly_plugins(rabbit_plugins:active())),
+ %% See rabbitmq/rabbitmq-server#1202 for details.
+ rabbit_peer_discovery:maybe_inject_randomized_delay(),
rabbit_peer_discovery:maybe_register(),
ok.
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index 68fe5468af..e48eb2b91f 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -119,6 +119,8 @@ init_from_config() ->
(Name, BadNames) when is_atom(Name) -> BadNames;
(Name, BadNames) -> [Name | BadNames]
end,
+ %% See rabbitmq/rabbitmq-server#1202 for details.
+ rabbit_peer_discovery:maybe_inject_randomized_delay(),
{DiscoveredNodes, NodeType} =
case rabbit_peer_discovery:discover_cluster_nodes() of
{ok, {Nodes, Type} = Config}
diff --git a/src/rabbit_peer_discovery.erl b/src/rabbit_peer_discovery.erl
index 98d2f9e7c5..52eac1c14e 100644
--- a/src/rabbit_peer_discovery.erl
+++ b/src/rabbit_peer_discovery.erl
@@ -22,7 +22,8 @@
-export([discover_cluster_nodes/0, backend/0, node_type/0,
normalize/1, format_discovered_nodes/1, log_configured_backend/0,
- register/0, unregister/0, maybe_register/0, maybe_unregister/0]).
+ register/0, unregister/0, maybe_register/0, maybe_unregister/0,
+ maybe_inject_randomized_delay/0]).
-export([append_node_prefix/1, node_prefix/0]).
-define(DEFAULT_BACKEND, rabbit_peer_discovery_classic_config).
@@ -31,6 +32,9 @@
-define(DEFAULT_NODE_TYPE, disc).
%% default node prefix to attach to discovered hostnames
-define(DEFAULT_PREFIX, "rabbit").
+%% default randomized delay range, in seconds
+-define(DEFAULT_STARTUP_RANDOMIZED_DELAY, {5, 60}).
+
-define(NODENAME_PART_SEPARATOR, "@").
@@ -99,6 +103,56 @@ maybe_unregister() ->
end.
+-spec maybe_inject_randomized_delay() -> ok.
+maybe_inject_randomized_delay() ->
+ Backend = backend(),
+ case Backend:supports_registration() of
+ true ->
+ rabbit_log:info("Peer discovery backend ~s supports registration.", [Backend]),
+ inject_randomized_delay();
+ false ->
+ rabbit_log:info("Peer discovery backend ~s does not support registration, skipping randomized startup delay.", [Backend]),
+ ok
+ end.
+
+-spec inject_randomized_delay() -> ok.
+
+inject_randomized_delay() ->
+ {Min, Max} = case randomized_delay_range() of
+ {A, B} -> {A, B};
+ [A, B] -> {A, B}
+ end,
+ case {Min, Max} of
+ %% When the max value is set to 0, consider the delay to be disabled.
+ %% In addition, `rand:uniform/1` will fail with a "no function clause"
+ %% when the argument is 0.
+ {_, 0} ->
+ rabbit_log:info("Randomized delay range's upper bound is set to 0. Considering it disabled."),
+ ok;
+ {_, N} when is_number(N) ->
+ rand:seed(exsplus),
+ RandomVal = rand:uniform(round(N)),
+ rabbit_log:debug("Randomized startup delay: configured range is from ~p to ~p, PRNG pick: ~p...", [Min, Max, RandomVal]),
+ Effective = case RandomVal < Min of
+ true -> Min;
+ false -> RandomVal
+ end,
+ rabbit_log:info("Will wait for ~p seconds before proceeding with regitration...", [Effective]),
+ timer:sleep(Effective * 1000),
+ ok
+ end.
+
+-spec randomized_delay_range() -> {integer(), integer()}.
+
+randomized_delay_range() ->
+ case application:get_env(rabbit, autocluster) of
+ {ok, Proplist} ->
+ proplists:get_value(randomized_startup_delay_range, Proplist, ?DEFAULT_STARTUP_RANDOMIZED_DELAY);
+ undefined ->
+ ?DEFAULT_STARTUP_RANDOMIZED_DELAY
+ end.
+
+
-spec register() -> ok.
register() ->