summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrancesco Mazzoli <francesco@rabbitmq.com>2012-09-19 12:16:33 +0100
committerFrancesco Mazzoli <francesco@rabbitmq.com>2012-09-19 12:16:33 +0100
commit784b2821e93f666fec178b0e421da8bbe407c358 (patch)
treea881ab6fbcd036a947b9c3d90affc49073cf7ab8
parent3634b80263f000e647870cd4c9649385d7e62c68 (diff)
downloadrabbitmq-server-784b2821e93f666fec178b0e421da8bbe407c358.tar.gz
revert to manual rpc for running nodes, but use mnesia to check if nodes are running
-rw-r--r--src/rabbit_mnesia.erl47
1 files changed, 30 insertions, 17 deletions
diff --git a/src/rabbit_mnesia.erl b/src/rabbit_mnesia.erl
index 1dfdb1f7..e1dee13e 100644
--- a/src/rabbit_mnesia.erl
+++ b/src/rabbit_mnesia.erl
@@ -316,7 +316,7 @@ forget_cluster_node(Node, RemoveWhenOffline) ->
end.
remove_node_offline_node(Node) ->
- case {mnesia:system_info(running_db_nodes) -- [Node],
+ case {ordsets:del_element(Node, running_nodes(all_clustered_nodes())),
is_disc_node()} of
{[], true} ->
%% Note that while we check if the nodes was the last to
@@ -415,36 +415,38 @@ mnesia_nodes() ->
true -> ordsets:add_element(node(), DiscCopies);
false -> DiscCopies
end,
- RunningNodes = mnesia:system_info(running_db_nodes),
- {ok, {AllNodes, DiscNodes, RunningNodes}};
+ {ok, {AllNodes, DiscNodes}};
false ->
{error, tables_not_present}
end
end.
cluster_status(WhichNodes, ForceMnesia) ->
+ %% I don't want to call `running_nodes/1' unless if necessary, since it's
+ %% pretty expensive.
Nodes = case mnesia_nodes() of
- {ok, Status} ->
- {ok, Status};
+ {ok, {AllNodes, DiscNodes}} ->
+ {ok, {AllNodes, DiscNodes,
+ fun() -> running_nodes(AllNodes) end}};
{error, _Reason} when not ForceMnesia ->
{AllNodes, DiscNodes, RunningNodes} =
rabbit_node_monitor:read_cluster_status(),
- %% The cluster status file records the status when
- %% the node is online, but we know for sure that
- %% the node is offline now, so we can remove it
- %% from the list of running nodes.
- {ok, {AllNodes, DiscNodes,
- ordsets:del_element(node(), RunningNodes)}};
+ %% The cluster status file records the status when the node
+ %% is online, but we know for sure that the node is offline
+ %% now, so we can remove it from the list of running nodes.
+ {ok,
+ {AllNodes, DiscNodes,
+ fun() -> ordsets:del_element(node(), RunningNodes) end}};
Err = {error, _} ->
Err
end,
case Nodes of
- {ok, {AllNodes1, DiscNodes1, RunningNodes1}} ->
+ {ok, {AllNodes1, DiscNodes1, RunningNodesThunk}} ->
{ok, case WhichNodes of
- status -> {AllNodes1, DiscNodes1, RunningNodes1};
+ status -> {AllNodes1, DiscNodes1, RunningNodesThunk()};
all -> AllNodes1;
disc -> DiscNodes1;
- running -> RunningNodes1
+ running -> RunningNodesThunk()
end};
Err1 = {error, _} ->
Err1
@@ -1002,7 +1004,9 @@ remove_node_if_mnesia_running(Node) ->
end.
leave_cluster() ->
- case {is_clustered(), mnesia:system_info(running_db_nodes) -- [node()]} of
+ case {is_clustered(),
+ running_nodes(ordsets:del_element(node(), all_clustered_nodes()))}
+ of
{false, []} -> ok;
{_, AllNodes} -> case lists:any(fun leave_cluster/1, AllNodes) of
true -> ok;
@@ -1048,9 +1052,18 @@ change_extra_db_nodes(ClusterNodes0, Force) ->
Nodes
end.
+%% We're not using `mnesia:system_info(running_db_nodes)' directly because if
+%% the node is a RAM node it won't know about other nodes when mnesia is stopped
+running_nodes(Nodes) ->
+ {Replies, _BadNodes} =
+ rpc:multicall(Nodes, rabbit_mnesia, is_running_remote, []),
+ [Node || {Running, Node} <- Replies, Running].
+
is_running_remote() ->
- {proplists:is_defined(rabbit, application:which_applications(infinity)),
- node()}.
+ {case mnesia:system_info(is_running) of
+ yes -> true;
+ no -> false
+ end, node()}.
check_consistency(OTP, Rabbit) ->
rabbit_misc:sequence_error(