summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2012-10-02 14:55:27 +0100
committerMatthias Radestock <matthias@rabbitmq.com>2012-10-02 14:55:27 +0100
commitc16e977dcec99d89fb31abb766745d9a1cab61cf (patch)
treefc355890f95113fe209b4cf5c00f7ed2b497359b
parenta94dc7e4676021ce93aa1006d8445e77aaefbd8c (diff)
parent3e79a2cf23e145de7768ef1544b7e55bfa90f971 (diff)
downloadrabbitmq-server-c16e977dcec99d89fb31abb766745d9a1cab61cf.tar.gz
merge bug25184 into default
-rw-r--r--src/rabbit_mnesia.erl24
1 files changed, 15 insertions, 9 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index bfecf06a..87069228 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -276,6 +276,9 @@ forget_cluster_node(Node, RemoveWhenOffline) ->
end.
remove_node_offline_node(Node) ->
+ %% We want the running nodes *now*, so we don't call
+ %% `cluster_nodes(running)' which will just get what's in the cluster status
+ %% file.
case {running_nodes(cluster_nodes(all)) -- [Node], node_type()} of
{[], disc} ->
%% Note that while we check if the nodes was the last to
@@ -289,9 +292,13 @@ remove_node_offline_node(Node) ->
case cluster_nodes(running) -- [node(), Node] of
[] -> start_mnesia(),
try
+ %% What we want to do here is replace the last node to
+ %% go down with the current node. The way we do this
+ %% is by force loading the table, and making sure that
+ %% they are loaded.
rabbit_table:force_load(),
- forget_cluster_node(Node, false),
- ensure_mnesia_running()
+ rabbit_table:wait_for_replicated(),
+ forget_cluster_node(Node, false)
after
stop_mnesia()
end;
@@ -666,13 +673,12 @@ remove_node_if_mnesia_running(Node) ->
end.
leave_cluster() ->
- RunningNodes = running_nodes(nodes_excl_me(cluster_nodes(all))),
- case not is_clustered() andalso RunningNodes =:= [] of
- true -> ok;
- false -> case lists:any(fun leave_cluster/1, RunningNodes) of
- true -> ok;
- false -> e(no_running_cluster_nodes)
- end
+ case nodes_excl_me(cluster_nodes(all)) of
+ [] -> ok;
+ AllNodes -> case lists:any(fun leave_cluster/1, AllNodes) of
+ true -> ok;
+ false -> e(no_running_cluster_nodes)
+ end
end.
leave_cluster(Node) ->