summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexandru Scvortov <alexandru@rabbitmq.com>2011-08-04 15:21:30 +0100
committerAlexandru Scvortov <alexandru@rabbitmq.com>2011-08-04 15:21:30 +0100
commit8e7b1857c5e9520fe08af23de094ce7a6ce5364b (patch)
tree7a88ebdaed7eacc5e1906a86911446e41badc72d
parent51c8e02239abcb2f8a9a80db8ed2385e0ce67d10 (diff)
parente07ee05ccd30089b7f7e86c0a80755ea0ac21fa2 (diff)
downloadrabbitmq-server-8e7b1857c5e9520fe08af23de094ce7a6ce5364b.tar.gz
merge default into bug23979
-rw-r--r--src/rabbit_mnesia.erl31
-rw-r--r--src/rabbit_node_monitor.erl7
2 files changed, 35 insertions, 3 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index ab553a8b..e0ef58fe 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -24,7 +24,7 @@
create_cluster_nodes_config/1, read_cluster_nodes_config/0,
record_running_nodes/0, read_previously_running_nodes/0,
delete_previously_running_nodes/0, running_nodes_filename/0,
- is_disc_node/0]).
+ is_disc_node/0, on_node_down/1]).
-export([table_names/0]).
@@ -118,6 +118,12 @@ cluster(ClusterNodes, Force) ->
ensure_mnesia_not_running(),
ensure_mnesia_dir(),
+ case {is_only_disc_node(node(), false),
+ should_be_disc_node(ClusterNodes)} of
+ {true, false} -> log_both("last disc node leaving cluster");
+ _ -> ok
+ end,
+
%% Wipe mnesia if we're changing type from disc to ram
case {is_disc_node(), should_be_disc_node(ClusterNodes)} of
{true, false} -> error_logger:warning_msg(
@@ -159,6 +165,7 @@ cluster(ClusterNodes, Force) ->
after
stop_mnesia()
end,
+
ok.
%% return node to its virgin state, where it is not member of any
@@ -690,6 +697,10 @@ wait_for_tables(TableNames) ->
reset(Force) ->
ensure_mnesia_not_running(),
+ case is_only_disc_node(node(), false) of
+ true -> log_both("resetting only disc node");
+ false -> ok
+ end,
Node = node(),
case Force of
true -> ok;
@@ -737,6 +748,24 @@ leave_cluster(Nodes, RunningNodes) ->
Nodes, RunningNodes}})
end.
+on_node_down(Node) ->
+ case is_only_disc_node(Node, true) of
+ true -> log_both("only disc node went down");
+ false -> ok
+ end.
+
+is_only_disc_node(Node, _MnesiaRunning = true) ->
+ [Node] =:= nodes_of_type(disc_copies);
+is_only_disc_node(Node, false) ->
+ start_mnesia(),
+ Res = is_only_disc_node(Node, true),
+ stop_mnesia(),
+ Res.
+
+log_both(Warning) ->
+ io:format("Warning: ~s~n", [Warning]),
+ error_logger:warning_msg("~s~n", [Warning]).
+
start_mnesia() ->
rabbit_misc:ensure_ok(mnesia:start(), cannot_start_mnesia),
ensure_mnesia_running().
diff --git a/src/rabbit_node_monitor.erl b/src/rabbit_node_monitor.erl
index 1f30a2fc..f82c831f 100644
--- a/src/rabbit_node_monitor.erl
+++ b/src/rabbit_node_monitor.erl
@@ -95,8 +95,11 @@ code_change(_OldVsn, State, _Extra) ->
%% TODO: This may turn out to be a performance hog when there are lots
%% of nodes. We really only need to execute some of these statements
-%% on *one* node, rather than all of them.
+%% on *one* node, rather than all of them. NOTE: This function will be
+%% executed *twice* if the other rabbit node is shut down cleanly
+%% (once for the rabbit_app going down and once for the node).
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_alarm:on_node_down(Node),
+ ok = rabbit_mnesia:on_node_down(Node).