summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2009-05-20 19:41:53 +0100
committerMatthias Radestock <matthias@lshift.net>2009-05-20 19:41:53 +0100
commit1873d26cd5b4c7ea9ffa1a408d4684436bc99414 (patch)
tree1a181307ea9c4ff5e70e4e089919b61956b1964e
parent84713a3a28622e097540be7b8ac0c3a055cf5500 (diff)
downloadrabbitmq-server-1873d26cd5b4c7ea9ffa1a408d4684436bc99414.tar.gz
break ume cycles
-rw-r--r--src/rabbit_exchange.erl32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index 4b5aea5c..0ec2d42d 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -190,7 +190,10 @@ info_all(VHostPath) -> map(VHostPath, fun (X) -> info(X) end).
info_all(VHostPath, Items) -> map(VHostPath, fun (X) -> info(X, Items) end).
-publish(X, Mandatory, Immediate, Txn,
+publish(X, Mandatory, Immediate, Txn, Message) ->
+ publish(X, [], Mandatory, Immediate, Txn, Message).
+
+publish(X, Seen, Mandatory, Immediate, Txn,
Message = #basic_message{routing_key = RK, content = C}) ->
case rabbit_router:deliver(route(X, RK, C),
Mandatory, Immediate, Txn, Message) of
@@ -200,15 +203,24 @@ publish(X, Mandatory, Immediate, Txn,
undefined ->
R;
UmeName ->
- case lookup(UmeName) of
- {ok, Ume} ->
- publish(Ume, Mandatory, Immediate, Txn, Message);
- {error, not_found} ->
- rabbit_log:warning(
- "unroutable message exchange for ~s "
- "does not exist: ~s",
- [rabbit_misc:rs(XName), rabbit_misc:rs(UmeName)]),
- R
+ NewSeen = [XName | Seen],
+ case lists:member(UmeName, NewSeen) of
+ true ->
+ R;
+ false ->
+ case lookup(UmeName) of
+ {ok, Ume} ->
+ publish(Ume, NewSeen,
+ Mandatory, Immediate, Txn,
+ Message);
+ {error, not_found} ->
+ rabbit_log:warning(
+ "unroutable message exchange for ~s "
+ "does not exist: ~s",
+ [rabbit_misc:rs(XName),
+ rabbit_misc:rs(UmeName)]),
+ R
+ end
end
end;
R ->