summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2013-03-05 12:38:51 +0000
committerSimon MacMullen <simon@rabbitmq.com>2013-03-05 12:38:51 +0000
commit9563fcd45ea69ec4ed353acd1b72d577f6566da3 (patch)
treecbf7a31112cd755648748b989ea9bc595d369eea
parent6bacb8a803bbfef2187a6fdd3455d44519558d0a (diff)
parent5ae47d98f0fe2f67503646316d7a0df186be80b6 (diff)
downloadrabbitmq-server-9563fcd45ea69ec4ed353acd1b72d577f6566da3.tar.gz
Merge default
-rw-r--r--ebin/rabbit_app.in1
-rw-r--r--src/rabbit_error_logger_file_h.erl2
-rw-r--r--src/rabbit_node_monitor.erl41
3 files changed, 43 insertions, 1 deletions
diff --git a/ebin/rabbit_app.in b/ebin/rabbit_app.in
index ad961a44..339fa69e 100644
--- a/ebin/rabbit_app.in
+++ b/ebin/rabbit_app.in
@@ -44,6 +44,7 @@
{log_levels, [{connection, info}]},
{ssl_cert_login_from, distinguished_name},
{reverse_dns_lookups, false},
+ {cluster_partition_handling, ignore},
{tcp_listen_options, [binary,
{packet, raw},
{reuseaddr, true},
diff --git a/src/rabbit_error_logger_file_h.erl b/src/rabbit_error_logger_file_h.erl
index 3efc9c0c..c00c1df9 100644
--- a/src/rabbit_error_logger_file_h.erl
+++ b/src/rabbit_error_logger_file_h.erl
@@ -76,6 +76,8 @@ init_file(File, PrevHandler) ->
Error -> Error
end.
+handle_event({info_report, _, {_, std_info, _}}, State) ->
+ ok; %% filter out "application: foo; exited: stopped; type: temporary"
handle_event(Event, State) ->
error_logger_file_h:handle_event(Event, State).
diff --git a/src/rabbit_node_monitor.erl b/src/rabbit_node_monitor.erl
index 71c2c80a..5d587977 100644
--- a/src/rabbit_node_monitor.erl
+++ b/src/rabbit_node_monitor.erl
@@ -270,7 +270,46 @@ handle_dead_rabbit(Node) ->
ok = rabbit_networking:on_node_down(Node),
ok = rabbit_amqqueue:on_node_down(Node),
ok = rabbit_alarm:on_node_down(Node),
- ok = rabbit_mnesia:on_node_down(Node).
+ ok = rabbit_mnesia:on_node_down(Node),
+ case application:get_env(rabbit, cluster_partition_handling) of
+ {ok, pause_minority} ->
+ case majority() of
+ true -> ok;
+ false -> await_cluster_recovery()
+ end;
+ {ok, ignore} ->
+ ok;
+ {ok, Term} ->
+ rabbit_log:warning("cluster_partition_handling ~p unrecognised, "
+ "assuming 'ignore'~n", [Term]),
+ ok
+ end,
+ ok.
+
+majority() ->
+ Nodes = rabbit_mnesia:cluster_nodes(all),
+ Alive = [N || N <- Nodes, pong =:= net_adm:ping(N)],
+ length(Alive) / length(Nodes) > 0.5.
+
+await_cluster_recovery() ->
+ rabbit_log:warning("Cluster minority status detected - awaiting recovery~n",
+ []),
+ Nodes = rabbit_mnesia:cluster_nodes(all),
+ spawn(fun () ->
+ %% If our group leader is inside an application we are about
+ %% to stop, application:stop/1 does not return.
+ group_leader(whereis(init), self()),
+ rabbit:stop(),
+ wait_for_cluster_recovery(Nodes)
+ end).
+
+wait_for_cluster_recovery(Nodes) ->
+ [erlang:disconnect_node(Node) || Node <- Nodes],
+ case majority() of
+ true -> rabbit:start();
+ false -> timer:sleep(1000),
+ wait_for_cluster_recovery(Nodes)
+ end.
handle_live_rabbit(Node) ->
ok = rabbit_alarm:on_node_up(Node),