diff options
| author | Simon MacMullen <simon@rabbitmq.com> | 2015-03-10 11:44:55 +0000 |
|---|---|---|
| committer | Simon MacMullen <simon@rabbitmq.com> | 2015-03-10 11:44:55 +0000 |
| commit | 06717cc265e8dc2b2fb4293278089203f09d2a8a (patch) | |
| tree | bc345123e16642c541feeeabe2d0cddd6a2cb73b | |
| parent | d538f7d95646a7a9527c9f05ee274768a758a266 (diff) | |
| parent | 105ebce7b6de3655cf1324f11f1efb81e93e3eed (diff) | |
| download | rabbitmq-server-git-06717cc265e8dc2b2fb4293278089203f09d2a8a.tar.gz | |
Merge branch 'bug26636'
| -rw-r--r-- | src/rabbit_networking.erl | 6 | ||||
| -rw-r--r-- | src/rabbit_node_monitor.erl | 20 |
2 files changed, 20 insertions, 6 deletions
diff --git a/src/rabbit_networking.erl b/src/rabbit_networking.erl index 1a2883748f..f5deaef388 100644 --- a/src/rabbit_networking.erl +++ b/src/rabbit_networking.erl @@ -394,7 +394,11 @@ node_listeners(Node) -> mnesia:dirty_read(rabbit_listener, Node). on_node_down(Node) -> - ok = mnesia:dirty_delete(rabbit_listener, Node). + case lists:member(Node, nodes()) of + false -> ok = mnesia:dirty_delete(rabbit_listener, Node); + true -> rabbit_log:info( + "Keep ~s listeners: the node is already back~n", [Node]) + end. start_client(Sock, SockTransform) -> {ok, _Child, Reader} = supervisor:start_child(rabbit_tcp_client_sup, []), diff --git a/src/rabbit_node_monitor.erl b/src/rabbit_node_monitor.erl index 94a95deb0d..0f00e66e55 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) @@ -732,7 +732,9 @@ handle_dead_rabbit(Node, State = #state{partitions = Partitions, %% that we do not attempt to deal with individual (other) partitions %% going away. It's only safe to forget anything about partitions when %% there are no partitions. - Partitions1 = case Partitions -- (Partitions -- alive_rabbit_nodes()) of + Down = Partitions -- alive_rabbit_nodes(), + NoLongerPartitioned = rabbit_mnesia:cluster_nodes(running), + Partitions1 = case Partitions -- Down -- NoLongerPartitioned of [] -> []; _ -> Partitions end, @@ -825,8 +827,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 +840,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), |
