diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2012-04-10 17:12:17 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2012-04-10 17:12:17 +0100 |
commit | 75439f8aebddc2f9da97d27ec6523ca6ab039b1f (patch) | |
tree | 310fa7038463ea18c00d88d01c667170097ca490 /deps/rabbitmq_federation/src/rabbit_federation_link_sup.erl | |
parent | d014b4ef45e6a898d8b7f9a7b4c11113510742e2 (diff) | |
download | rabbitmq-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.erl | 42 |
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) -> |