summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2015-03-10 11:44:55 +0000
committerSimon MacMullen <simon@rabbitmq.com>2015-03-10 11:44:55 +0000
commit06717cc265e8dc2b2fb4293278089203f09d2a8a (patch)
treebc345123e16642c541feeeabe2d0cddd6a2cb73b
parentd538f7d95646a7a9527c9f05ee274768a758a266 (diff)
parent105ebce7b6de3655cf1324f11f1efb81e93e3eed (diff)
downloadrabbitmq-server-git-06717cc265e8dc2b2fb4293278089203f09d2a8a.tar.gz
Merge branch 'bug26636'
-rw-r--r--src/rabbit_networking.erl6
-rw-r--r--src/rabbit_node_monitor.erl20
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),