diff options
author | Matthias Radestock <matthias@lshift.net> | 2009-05-20 19:41:53 +0100 |
---|---|---|
committer | Matthias Radestock <matthias@lshift.net> | 2009-05-20 19:41:53 +0100 |
commit | 1873d26cd5b4c7ea9ffa1a408d4684436bc99414 (patch) | |
tree | 1a181307ea9c4ff5e70e4e089919b61956b1964e | |
parent | 84713a3a28622e097540be7b8ac0c3a055cf5500 (diff) | |
download | rabbitmq-server-1873d26cd5b4c7ea9ffa1a408d4684436bc99414.tar.gz |
break ume cycles
-rw-r--r-- | src/rabbit_exchange.erl | 32 |
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 -> |