summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2012-09-18 11:42:55 +0100
committerSimon MacMullen <simon@rabbitmq.com>2012-09-18 11:42:55 +0100
commitae391b362ac1f447e5b4b975b64c71a0b592b088 (patch)
tree1ccefa08925962647ab0da0d70709346eae9cc82
parent39cc7a0a0185de0f4868354344013648f8228a18 (diff)
downloadrabbitmq-server-ae391b362ac1f447e5b4b975b64c71a0b592b088.tar.gz
Pull our attempts to list all nodes out of transactions and loops.
-rw-r--r--src/rabbit_mirror_queue_misc.erl20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/rabbit_mirror_queue_misc.erl b/src/rabbit_mirror_queue_misc.erl
index f53319c0..603a490b 100644
--- a/src/rabbit_mirror_queue_misc.erl
+++ b/src/rabbit_mirror_queue_misc.erl
@@ -73,6 +73,7 @@ remove_from_queue(QueueName, DeadGMPids) ->
remove_from_queue0(QueueName, DeadGMPids) ->
DeadNodes = [node(DeadGMPid) || DeadGMPid <- DeadGMPids],
+ ClusterNodes = clusterable_nodes() -- DeadNodes,
rabbit_misc:execute_mnesia_transaction(
fun () ->
%% Someone else could have deleted the queue before we
@@ -99,9 +100,10 @@ remove_from_queue0(QueueName, DeadGMPids) ->
%% "exactly" mode can cause this to
%% happen.
{_, OldNodes} = actual_queue_nodes(Q1),
- {_, NewNodes} = suggested_queue_nodes(Q1),
+ {_, NewNodes} = suggested_queue_nodes(
+ Q1, ClusterNodes),
{ok, QPid1, [QPid | SPids] -- Alive,
- (NewNodes -- OldNodes) -- DeadNodes};
+ NewNodes -- OldNodes};
_ ->
%% Master has changed, and we're not it,
%% so leave alone to allow the promoted
@@ -113,12 +115,14 @@ remove_from_queue0(QueueName, DeadGMPids) ->
end).
on_node_up() ->
+ ClusterNodes = clusterable_nodes(),
QNames =
rabbit_misc:execute_mnesia_transaction(
fun () ->
mnesia:foldl(
fun (Q = #amqqueue{name = QName}, QNames0) ->
- {_MNode, SNodes} = suggested_queue_nodes(Q),
+ {_MNode, SNodes} = suggested_queue_nodes(
+ Q, ClusterNodes),
case lists:member(node(), SNodes) of
true -> [QName | QNames0];
false -> QNames0
@@ -229,15 +233,21 @@ promote_slave([SPid | SPids]) ->
%% the one to promote is the oldest.
{SPid, SPids}.
-suggested_queue_nodes(Q) ->
+suggested_queue_nodes(Q) -> suggested_queue_nodes(Q, clusterable_nodes()).
+
+%% This variant exists so we can pull a call to clusterable_nodes()
+%% out of a loop or transaction or both.
+suggested_queue_nodes(Q, ClusterNodes) ->
{MNode0, SNodes} = actual_queue_nodes(Q),
MNode = case MNode0 of
none -> node();
_ -> MNode0
end,
suggested_queue_nodes(policy(<<"ha-mode">>, Q), policy(<<"ha-params">>, Q),
- {MNode, SNodes}, clusterable_nodes()).
+ {MNode, SNodes}, ClusterNodes).
+%% TODO we should probably just redefine
+%% rabbit_mnesia:running_clustered_nodes/0? Waiting on Francesco.
clusterable_nodes() ->
%% We may end up here via on_node_up/0, in which case we are still
%% booting - rabbit_mnesia:running_clustered_nodes/0 will report