diff options
| author | Tony Garnock-Jones <tonyg@lshift.net> | 2009-05-13 15:23:55 +0100 |
|---|---|---|
| committer | Tony Garnock-Jones <tonyg@lshift.net> | 2009-05-13 15:23:55 +0100 |
| commit | c5af3c372c0750087d7448f2465ca59fc0434cff (patch) | |
| tree | f0970738cf8730f8c90569b66b3476ebb301488b /src | |
| parent | 67aab1f6d3d86d947bf3d7d4ecb813567baca8b3 (diff) | |
| parent | c652c6a18660ec0db2739dda17d508162b08cb64 (diff) | |
| download | rabbitmq-server-git-c5af3c372c0750087d7448f2465ca59fc0434cff.tar.gz | |
merge default into amqp_0_9_1
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_exchange.erl | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index 5aff3abfdb..d60725e27d 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -330,16 +330,13 @@ delete_forward_routes(Route) -> delete_transient_forward_routes(Route) -> ok = mnesia:delete_object(rabbit_route, Route, write). -has_bindings(ExchangeName) -> - MatchHead = #route{binding = #binding{exchange_name = ExchangeName, - _ = '_'}}, +contains(Table, MatchHead) -> try - continue(mnesia:select(rabbit_route, [{MatchHead, [], ['$_']}], - 1, read)) + continue(mnesia:select(Table, [{MatchHead, [], ['$_']}], 1, read)) catch exit:{aborted, {badarg, _}} -> %% work around OTP-7025, which was fixed in R12B-1, by %% falling back on a less efficient method - case mnesia:match_object(rabbit_route, MatchHead, read) of + case mnesia:match_object(Table, MatchHead, read) of [] -> false; [_|_] -> true end @@ -542,7 +539,11 @@ delete(ExchangeName, _IfUnused = false) -> call_with_exchange(ExchangeName, fun unconditional_delete/1). conditional_delete(Exchange = #exchange{name = ExchangeName}) -> - case has_bindings(ExchangeName) of + Match = #route{binding = #binding{exchange_name = ExchangeName, _ = '_'}}, + %% we need to check for durable routes here too in case a bunch of + %% routes to durable queues have been removed temporarily as a + %% result of a node failure + case contains(rabbit_route, Match) orelse contains(rabbit_durable_route, Match) of false -> unconditional_delete(Exchange); true -> {error, in_use} end. |
