summaryrefslogtreecommitdiff
path: root/deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2012-04-10 17:12:17 +0100
committerSimon MacMullen <simon@rabbitmq.com>2012-04-10 17:12:17 +0100
commit75439f8aebddc2f9da97d27ec6523ca6ab039b1f (patch)
tree310fa7038463ea18c00d88d01c667170097ca490 /deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl
parentd014b4ef45e6a898d8b7f9a7b4c11113510742e2 (diff)
downloadrabbitmq-server-git-75439f8aebddc2f9da97d27ec6523ca6ab039b1f.tar.gz
Don't be ridiculous. It is not true that any exchange will only reference a given connection at most once.
Diffstat (limited to 'deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl')
-rw-r--r--deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl42
1 files changed, 19 insertions, 23 deletions
diff --git a/deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl b/deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl
index 137b33f565..41940f5577 100644
--- a/deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl
+++ b/deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl
@@ -40,27 +40,23 @@ adjust(Sup, XName, everything) ->
end;
adjust(Sup, XName, {connection, ConnName}) ->
- %% We just created this connection, it must exist
- {ok, NewUpstream} = upstream(XName, ConnName),
- case child(Sup, ConnName) of
- {ok, OldUpstream} ->
- case OldUpstream =:= NewUpstream of
- true -> ok;
- false -> stop(Sup, OldUpstream),
- start(Sup, NewUpstream, XName)
- end;
- {error, not_found} ->
- start(Sup, NewUpstream, XName)
- end;
+ OldUpstreams0 = children(Sup, ConnName),
+ NewUpstreams0 = upstreams(XName, ConnName),
+ %% If any haven't changed, don't restart them
+ {OldUpstreams, NewUpstreams} =
+ lists:foldl(
+ fun (OldU, {OldUs, NewUs}) ->
+ case lists:member(OldU, NewUs) of
+ true -> {OldUs -- [OldU], NewUs -- [OldU]};
+ false -> {OldUs, NewUs}
+ end
+ end, {OldUpstreams0, NewUpstreams0}, OldUpstreams0),
+ [stop(Sup, OldUpstream) || OldUpstream <- OldUpstreams],
+ [start(Sup, NewUpstream, XName) || NewUpstream <- NewUpstreams];
adjust(Sup, XName, {clear_connection, ConnName}) ->
prune_for_upstream_set(<<"all">>, XName),
- case child(Sup, ConnName) of
- {ok, Upstream} ->
- stop(Sup, Upstream);
- {error, not_found} ->
- ok
- end;
+ [stop(Sup, Upstream) || Upstream <- children(Sup, ConnName)];
%% TODO handle changes of upstream sets properly
adjust(Sup, XName, {upstream_set, Set}) ->
@@ -83,16 +79,16 @@ stop(Sup, Upstream) ->
%% remove it here too.
rabbit_federation_status:remove_upstream(Upstream).
-child(Sup, ConnName) ->
- rabbit_federation_util:find_upstream(
+children(Sup, ConnName) ->
+ rabbit_federation_util:find_upstreams(
ConnName, [U || {U, _, _, _} <- supervisor2:which_children(Sup)]).
-upstream(XName, ConnName) ->
+upstreams(XName, ConnName) ->
case upstream_set(XName) of
{ok, UpstreamSet} ->
rabbit_federation_upstream:from_set(UpstreamSet, XName, ConnName);
- {error, not_found} = E ->
- E
+ {error, not_found} ->
+ []
end.
upstream_set(XName) ->