summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2011-08-16 10:49:39 +0100
committerSimon MacMullen <simon@rabbitmq.com>2011-08-16 10:49:39 +0100
commit61ebb48b3dac870832f59763713c189242121a55 (patch)
tree470af174ca0564affe163ba32f43c2230abd117d
parent32f8c0081e383cc4631242464c090cb460cc325e (diff)
parent0a30c40b052a3d244e7e6be3c3c2f456cea1b4f8 (diff)
downloadrabbitmq-server-61ebb48b3dac870832f59763713c189242121a55.tar.gz
Merge bug24289
-rw-r--r--src/rabbit_mnesia.erl55
-rw-r--r--src/rabbit_node_monitor.erl9
2 files changed, 59 insertions, 5 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index 157e3c3c..9f1e166d 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, on_node_up/1]).
-export([table_names/0]).
@@ -67,6 +67,8 @@
-spec(delete_previously_running_nodes/0 :: () -> 'ok').
-spec(running_nodes_filename/0 :: () -> file:filename()).
-spec(is_disc_node/0 :: () -> boolean()).
+-spec(on_node_up/1 :: (node()) -> 'ok').
+-spec(on_node_down/1 :: (node()) -> 'ok').
-endif.
@@ -120,10 +122,19 @@ cluster(ClusterNodes, Force) ->
ensure_mnesia_not_running(),
ensure_mnesia_dir(),
+ case not Force andalso is_only_disc_node(node(), false) andalso
+ not should_be_disc_node(ClusterNodes) of
+ true -> log_both("last running 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(
- "changing node type; wiping mnesia...~n~n"),
+ {true, false} -> rabbit_misc:with_local_io(
+ fun () -> error_logger:warning_msg(
+ "changing node type; wiping "
+ "mnesia...~n~n")
+ end),
rabbit_misc:ensure_ok(mnesia:delete_schema([node()]),
cannot_delete_schema);
_ -> ok
@@ -161,6 +172,7 @@ cluster(ClusterNodes, Force) ->
after
stop_mnesia()
end,
+
ok.
%% return node to its virgin state, where it is not member of any
@@ -702,6 +714,10 @@ wait_for_tables(TableNames) ->
reset(Force) ->
ensure_mnesia_not_running(),
+ case not Force andalso is_only_disc_node(node(), false) of
+ true -> log_both("no other disc nodes running");
+ false -> ok
+ end,
Node = node(),
case Force of
true -> ok;
@@ -753,6 +769,39 @@ wait_for(Condition) ->
error_logger:info_msg("Waiting for ~p...~n", [Condition]),
timer:sleep(1000).
+on_node_up(Node) ->
+ case is_only_disc_node(Node, true) of
+ true -> rabbit_misc:with_local_io(
+ fun () -> rabbit_log:info("cluster contains disc "
+ "nodes again~n")
+ end);
+ false -> ok
+ end.
+
+on_node_down(Node) ->
+ case is_only_disc_node(Node, true) of
+ true -> rabbit_misc:with_local_io(
+ fun () -> rabbit_log:info("only running disc node "
+ "went down~n")
+ end);
+ false -> ok
+ end.
+
+is_only_disc_node(Node, _MnesiaRunning = true) ->
+ RunningSet = sets:from_list(running_clustered_nodes()),
+ DiscSet = sets:from_list(nodes_of_type(disc_copies)),
+ [Node] =:= sets:to_list(sets:intersection(RunningSet, DiscSet));
+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]),
+ rabbit_misc:with_local_io(
+ fun () -> error_logger:warning_msg("~s~n", [Warning]) end).
+
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 78aeb2ef..cb4f826d 100644
--- a/src/rabbit_node_monitor.erl
+++ b/src/rabbit_node_monitor.erl
@@ -68,7 +68,7 @@ handle_call(_Request, _From, State) ->
handle_cast({rabbit_running_on, Node}, State) ->
rabbit_log:info("rabbit on ~p up~n", [Node]),
erlang:monitor(process, {rabbit, Node}),
- ok = rabbit_alarm:on_node_up(Node),
+ ok = handle_live_rabbit(Node),
{noreply, State};
handle_cast(_Msg, State) ->
{noreply, State}.
@@ -94,4 +94,9 @@ code_change(_OldVsn, State, _Extra) ->
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).
+
+handle_live_rabbit(Node) ->
+ ok = rabbit_alarm:on_node_up(Node),
+ ok = rabbit_mnesia:on_node_up(Node).