diff options
author | Alexandru Scvortov <alexandru@rabbitmq.com> | 2011-08-04 15:21:30 +0100 |
---|---|---|
committer | Alexandru Scvortov <alexandru@rabbitmq.com> | 2011-08-04 15:21:30 +0100 |
commit | 8e7b1857c5e9520fe08af23de094ce7a6ce5364b (patch) | |
tree | 7a88ebdaed7eacc5e1906a86911446e41badc72d | |
parent | 51c8e02239abcb2f8a9a80db8ed2385e0ce67d10 (diff) | |
parent | e07ee05ccd30089b7f7e86c0a80755ea0ac21fa2 (diff) | |
download | rabbitmq-server-8e7b1857c5e9520fe08af23de094ce7a6ce5364b.tar.gz |
merge default into bug23979
-rw-r--r-- | src/rabbit_mnesia.erl | 31 | ||||
-rw-r--r-- | src/rabbit_node_monitor.erl | 7 |
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). |