summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Mazzoli <francesco@rabbitmq.com>2012-05-23 16:32:13 +0100
committerFrancesco Mazzoli <francesco@rabbitmq.com>2012-05-23 16:32:13 +0100
commitfe8f40694309eaa940dbbe0bc9dca96d6e77d42b (patch)
treeb0956b40ac9eaf38a38397b402c9429104f8ef48
parent09b981e2cd4b25eb004597ff9d893c01c22bd4a2 (diff)
downloadrabbitmq-server-git-fe8f40694309eaa940dbbe0bc9dca96d6e77d42b.tar.gz
added `rabbit_mnesia:remove_node/1' to remove node from clusters remotely
Maybe I'll add more explicit checks - e.g. whether the node to be remote is offline - for better error messages. Also, as discussed with Simon, we probably need to add machinery to monitor when offline nodes leave clusters.
-rw-r--r--src/rabbit_control.erl5
-rw-r--r--src/rabbit_mnesia.erl20
2 files changed, 24 insertions, 1 deletions
diff --git a/src/rabbit_control.erl b/src/rabbit_control.erl
index 235c162533..c677d8b9ed 100644
--- a/src/rabbit_control.erl
+++ b/src/rabbit_control.erl
@@ -200,6 +200,11 @@ action(recluster, Node, [ClusterNodeS], _Opts, Inform) ->
Inform("Re-clustering ~p with ~p", [Node, ClusterNode]),
rpc_call(Node, rabbit_mnesia, recluster, [ClusterNode]);
+action(remove_node, Node, [ClusterNodeS], _Opts, Inform) ->
+ ClusterNode = list_to_atom(ClusterNodeS),
+ Inform("Removing node ~p from cluster", [ClusterNode]),
+ rpc_call(Node, rabbit_mnesia, remove_node, [ClusterNode]);
+
action(wait, Node, [PidFile], _Opts, Inform) ->
Inform("Waiting for ~p", [Node]),
wait_for_application(Node, PidFile, rabbit, Inform);
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index 5364c35491..4a2b37ec1d 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -25,7 +25,7 @@
initialize_cluster_nodes_status/0, write_cluster_nodes_status/1,
read_cluster_nodes_status/0, update_cluster_nodes_status/0,
is_disc_node/0, on_node_down/1, on_node_up/1, should_be_disc_node/1,
- change_node_type/1, recluster/1]).
+ change_node_type/1, recluster/1, remove_node/1]).
-export([table_names/0]).
@@ -54,6 +54,7 @@
-spec(force_reset/0 :: () -> 'ok').
-spec(recluster/1 :: (node()) -> 'ok').
-spec(change_node_type/1 :: (node_type()) -> 'ok').
+-spec(remove_node/1 :: (node()) -> 'ok').
%% Various queries to get the status of the db
-spec(status/0 :: () -> [{'nodes', [{node_type(), [node()]}]} |
@@ -267,6 +268,22 @@ recluster(DiscoveryNode) ->
ok.
+remove_node(Node) ->
+ case mnesia:system_info(is_running) of
+ yes -> {atomic, ok} = mnesia:del_table_copy(schema, Node),
+ update_cluster_nodes_status(),
+ {_, []} = rpc:multicall(running_clustered_nodes(), rabbit_mnesia,
+ update_cluster_nodes_status, []);
+ no -> start_mnesia(),
+ try
+ [mnesia:force_load_table(T) || T <- rabbit_mnesia:table_names()],
+ remove_node(Node)
+ after
+ stop_mnesia()
+ end
+ end,
+ ok.
+
%%----------------------------------------------------------------------------
%% Queries
%%----------------------------------------------------------------------------
@@ -653,6 +670,7 @@ on_node_up(Node) ->
end.
on_node_down(Node) ->
+ update_cluster_nodes_status(),
case is_only_disc_node(Node) of
true -> rabbit_log:info("only running disc node went down~n");
false -> ok