summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2014-06-25 13:59:48 +0100
committerSimon MacMullen <simon@rabbitmq.com>2014-06-25 13:59:48 +0100
commit831e65295113a5e38b45d75612affde866914d60 (patch)
tree7a6c837f64d80f8ec960099a459872abae9c860c /src
parentc23c9583976ef7d1408f776e284ea083e3c75d1d (diff)
downloadrabbitmq-server-git-831e65295113a5e38b45d75612affde866914d60.tar.gz
Make "rabbitmqctl forget_cluster_node --offline" impersonate the node rather than require you start one in the background.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_control_main.erl26
-rw-r--r--src/rabbit_table.erl7
2 files changed, 30 insertions, 3 deletions
diff --git a/src/rabbit_control_main.erl b/src/rabbit_control_main.erl
index 451f4d70d0..b1a8721ff3 100644
--- a/src/rabbit_control_main.erl
+++ b/src/rabbit_control_main.erl
@@ -131,6 +131,7 @@
%%----------------------------------------------------------------------------
start() ->
+ start_distribution(),
{ok, [[NodeStr|_]|_]} = init:get_argument(nodename),
{Command, Opts, Args} =
case parse_arguments(init:get_plain_arguments(), NodeStr) of
@@ -302,8 +303,12 @@ action(forget_cluster_node, Node, [ClusterNodeS], Opts, Inform) ->
ClusterNode = list_to_atom(ClusterNodeS),
RemoveWhenOffline = proplists:get_bool(?OFFLINE_OPT, Opts),
Inform("Removing node ~p from cluster", [ClusterNode]),
- rpc_call(Node, rabbit_mnesia, forget_cluster_node,
- [ClusterNode, RemoveWhenOffline]);
+ case RemoveWhenOffline of
+ true -> become_and_apply(Node, rabbit_mnesia, forget_cluster_node,
+ [ClusterNode, true]);
+ false -> rpc_call(Node, rabbit_mnesia, forget_cluster_node,
+ [ClusterNode, false])
+ end;
action(sync_queue, Node, [Q], Opts, Inform) ->
VHost = proplists:get_value(?VHOST_OPT, Opts),
@@ -650,6 +655,23 @@ exit_loop(Port) ->
{Port, _} -> exit_loop(Port)
end.
+start_distribution() ->
+ CtlNodeName = rabbit_misc:format("rabbitmqctl-~s", [os:getpid()]),
+ {ok, _} = net_kernel:start([list_to_atom(CtlNodeName), shortnames]).
+
+become_and_apply(BecomeNode, M, F, A) ->
+ case net_adm:ping(BecomeNode) of
+ pong -> exit({node_running, BecomeNode});
+ pang -> io:format(" * Impersonating node ~s...", [BecomeNode]),
+ error_logger:tty(false),
+ ok = net_kernel:stop(),
+ {ok, _} = net_kernel:start([BecomeNode, shortnames]),
+ io:format(" done~n", []),
+ Dir = mnesia:system_info(directory),
+ io:format(" * Mnesia dir: ~s~n", [Dir]),
+ apply(M, F, A)
+ end.
+
%%----------------------------------------------------------------------------
default_if_empty(List, Default) when is_list(List) ->
diff --git a/src/rabbit_table.erl b/src/rabbit_table.erl
index 47c77cd0f7..fe2c3b5843 100644
--- a/src/rabbit_table.erl
+++ b/src/rabbit_table.erl
@@ -70,7 +70,12 @@ wait_for_replicated() ->
not lists:member({local_content, true}, TabDef)]).
wait(TableNames) ->
- {ok, Timeout} = application:get_env(rabbit, mnesia_table_loading_timeout),
+ %% We might be in ctl here for offline ops, in which case we can't
+ %% get_env() for the rabbit app.
+ Timeout = case application:get_env(rabbit, mnesia_table_loading_timeout) of
+ {ok, T} -> T;
+ undefined -> 30000
+ end,
case mnesia:wait_for_tables(TableNames, Timeout) of
ok ->
ok;