summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2010-06-08 14:46:40 +0100
committerSimon MacMullen <simon@rabbitmq.com>2010-06-08 14:46:40 +0100
commit4cf1973200b316f57f50074dc5c2612e097e5baa (patch)
tree496f4bcfd9261237f1b312f3bf2d45c497fb868f
parente729c1b0d31c4e8e528643c7b72199bf2108ad29 (diff)
downloadrabbitmq-server-bug21841.tar.gz
Permit binding of durable queues to transient exchangesbug21841
-rw-r--r--src/rabbit_channel.erl4
-rw-r--r--src/rabbit_exchange.erl24
2 files changed, 11 insertions, 17 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl
index 9127c44b..f355bef3 100644
--- a/src/rabbit_channel.erl
+++ b/src/rabbit_channel.erl
@@ -934,10 +934,6 @@ binding_action(Fun, ExchangeNameBin, QueueNameBin, RoutingKey, Arguments,
not_found, "no binding ~s between ~s and ~s",
[RoutingKey, rabbit_misc:rs(ExchangeName),
rabbit_misc:rs(QueueName)]);
- {error, durability_settings_incompatible} ->
- rabbit_misc:protocol_error(
- not_allowed, "durability settings of ~s incompatible with ~s",
- [rabbit_misc:rs(QueueName), rabbit_misc:rs(ExchangeName)]);
ok -> return_ok(State, NoWait, ReturnMethod)
end.
diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl
index d237134f..ad6173ad 100644
--- a/src/rabbit_exchange.erl
+++ b/src/rabbit_exchange.erl
@@ -76,7 +76,7 @@
-spec(publish/2 :: (exchange(), delivery()) -> {routing_result(), [pid()]}).
-spec(add_binding/5 ::
(exchange_name(), queue_name(), routing_key(), amqp_table(), inner_fun()) ->
- bind_res() | {'error', 'durability_settings_incompatible'}).
+ bind_res()).
-spec(delete_binding/5 ::
(exchange_name(), queue_name(), routing_key(), amqp_table(), inner_fun()) ->
bind_res() | {'error', 'binding_not_found'}).
@@ -375,19 +375,17 @@ add_binding(ExchangeName, QueueName, RoutingKey, Arguments, InnerFun) ->
fun (X, Q, B) ->
%% this argument is used to check queue exclusivity;
%% in general, we want to fail on that in preference to
- %% failing on e.g., the durability being different.
+ %% anything else
InnerFun(X, Q),
- if Q#amqqueue.durable and not(X#exchange.durable) ->
- {error, durability_settings_incompatible};
- true ->
- case mnesia:read({rabbit_route, B}) of
- [] ->
- sync_binding(B, Q#amqqueue.durable,
- fun mnesia:write/3),
- {new, X, B};
- [_R] ->
- {existing, X, B}
- end
+ case mnesia:read({rabbit_route, B}) of
+ [] ->
+ sync_binding(B,
+ X#exchange.durable and
+ Q#amqqueue.durable,
+ fun mnesia:write/3),
+ {new, X, B};
+ [_R] ->
+ {existing, X, B}
end
end) of
{new, Exchange = #exchange{ type = Type }, Binding} ->