diff options
| author | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2015-03-09 13:00:00 +0100 |
|---|---|---|
| committer | Jean-Sébastien Pédron <jean-sebastien@rabbitmq.com> | 2015-03-09 13:10:05 +0100 |
| commit | 7b38a63dac57326ae2835c2af463245ff43a333b (patch) | |
| tree | 7a14862557de250841cdc6312ffa379240fbc70a /src | |
| parent | e759f8fbe39f4d8a2156925745d987cdcaf7feb7 (diff) | |
| download | rabbitmq-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.erl | 16 |
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), |
