summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2015-03-09 13:00:00 +0100
committerJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2015-03-09 13:10:05 +0100
commit7b38a63dac57326ae2835c2af463245ff43a333b (patch)
tree7a14862557de250841cdc6312ffa379240fbc70a /src
parente759f8fbe39f4d8a2156925745d987cdcaf7feb7 (diff)
downloadrabbitmq-server-git-7b38a63dac57326ae2835c2af463245ff43a333b.tar.gz
rabbit_node_monitor: In handle_dead_rabbit(), consider node down once
... in pause conditions, especially if the remote node is back in the cluster already. This gives the node a chance to enter a pause mode. Without this, partitions may never be fixed.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_node_monitor.erl16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/rabbit_node_monitor.erl b/src/rabbit_node_monitor.erl
index 94a95deb0d..785b3b5243 100644
--- a/src/rabbit_node_monitor.erl
+++ b/src/rabbit_node_monitor.erl
@@ -633,13 +633,13 @@ handle_dead_node(Node, State = #state{autoheal = Autoheal}) ->
%% back.
case application:get_env(rabbit, cluster_partition_handling) of
{ok, pause_minority} ->
- case majority() of
+ case majority([Node]) of
true -> ok;
false -> await_cluster_recovery(fun majority/0)
end,
State;
{ok, {pause_if_all_down, PreferredNodes, HowToRecover}} ->
- case in_preferred_partition(PreferredNodes) of
+ case in_preferred_partition(PreferredNodes, [Node]) of
true -> ok;
false -> await_cluster_recovery(
fun in_preferred_partition/0)
@@ -825,8 +825,12 @@ disconnect(Node) ->
%% about whether we connect to nodes which are currently disconnected.
majority() ->
+ majority([]).
+
+majority(NodesDown) ->
Nodes = rabbit_mnesia:cluster_nodes(all),
- length(alive_nodes(Nodes)) / length(Nodes) > 0.5.
+ AliveNodes = alive_nodes(Nodes) -- NodesDown,
+ length(AliveNodes) / length(Nodes) > 0.5.
in_preferred_partition() ->
{ok, {pause_if_all_down, PreferredNodes, _}} =
@@ -834,9 +838,13 @@ in_preferred_partition() ->
in_preferred_partition(PreferredNodes).
in_preferred_partition(PreferredNodes) ->
+ in_preferred_partition(PreferredNodes, []).
+
+in_preferred_partition(PreferredNodes, NodesDown) ->
Nodes = rabbit_mnesia:cluster_nodes(all),
RealPreferredNodes = [N || N <- PreferredNodes, lists:member(N, Nodes)],
- RealPreferredNodes =:= [] orelse alive_nodes(RealPreferredNodes) =/= [].
+ AliveNodes = alive_nodes(RealPreferredNodes) -- NodesDown,
+ RealPreferredNodes =:= [] orelse AliveNodes =/= [].
all_nodes_up() ->
Nodes = rabbit_mnesia:cluster_nodes(all),