diff options
| author | Matthew Sackman <matthew@rabbitmq.com> | 2010-06-22 18:18:28 +0100 |
|---|---|---|
| committer | Matthew Sackman <matthew@rabbitmq.com> | 2010-06-22 18:18:28 +0100 |
| commit | 94d5c4ec874b806fccacc5ffe12d10cc7245a633 (patch) | |
| tree | 93f88778c566304692cd7425d3f5c34d8534b360 | |
| parent | 1de614dfa220ca8c90a1e9385dc516f517b00c9e (diff) | |
| parent | 34bf47a1bce50deb54cfeb908920cc19bf61c04e (diff) | |
| download | rabbitmq-server-git-94d5c4ec874b806fccacc5ffe12d10cc7245a633.tar.gz | |
Merging bug 22867 onto amqp0_9_1
| -rw-r--r-- | include/rabbit.hrl | 3 | ||||
| -rw-r--r-- | src/rabbit_access_control.erl | 2 | ||||
| -rw-r--r-- | src/rabbit_channel.erl | 18 | ||||
| -rw-r--r-- | src/rabbit_error_logger.erl | 2 | ||||
| -rw-r--r-- | src/rabbit_exchange.erl | 31 |
5 files changed, 35 insertions, 21 deletions
diff --git a/include/rabbit.hrl b/include/rabbit.hrl index 5073d3be53..06297c69f3 100644 --- a/include/rabbit.hrl +++ b/include/rabbit.hrl @@ -49,7 +49,7 @@ -record(resource, {virtual_host, kind, name}). --record(exchange, {name, type, durable, arguments}). +-record(exchange, {name, type, durable, auto_delete, arguments}). -record(amqqueue, {name, durable, auto_delete, exclusive_owner = none, arguments, pid}). @@ -116,6 +116,7 @@ #exchange{name :: exchange_name(), type :: exchange_type(), durable :: boolean(), + auto_delete :: boolean(), arguments :: amqp_table()}). -type(binding() :: #binding{exchange_name :: exchange_name(), diff --git a/src/rabbit_access_control.erl b/src/rabbit_access_control.erl index 23b84afb82..a445f44197 100644 --- a/src/rabbit_access_control.erl +++ b/src/rabbit_access_control.erl @@ -240,7 +240,7 @@ add_vhost(VHostPath) -> write), [rabbit_exchange:declare( rabbit_misc:r(VHostPath, exchange, Name), - Type, true, []) || + Type, true, false, []) || {Name,Type} <- [{<<"">>, direct}, {<<"amq.direct">>, direct}, diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index 3bb015ece8..00e90982a3 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -659,8 +659,10 @@ handle_method(#'exchange.declare'{exchange = ExchangeNameBin, type = TypeNameBin, passive = false, durable = Durable, - deprecated_auto_delete = false, %% 0-9-1: true not supported - deprecated_internal = false, %% 0-9-1: true not supported + %% 0-9-1: deprecated but we still support it + deprecated_auto_delete = AutoDelete, + %% 0-9-1: true not supported + deprecated_internal = false, nowait = NoWait, arguments = Args}, _, State = #ch{ virtual_host = VHostPath }) -> @@ -681,9 +683,11 @@ handle_method(#'exchange.declare'{exchange = ExchangeNameBin, rabbit_exchange:declare(ExchangeName, CheckedType, Durable, + AutoDelete, Args) end, - ok = rabbit_exchange:assert_equivalence(X, CheckedType, Durable, Args), + ok = rabbit_exchange:assert_equivalence(X, CheckedType, Durable, + AutoDelete, Args), return_ok(State, NoWait, #'exchange.declare_ok'{}); handle_method(#'exchange.declare'{exchange = ExchangeNameBin, @@ -727,9 +731,9 @@ handle_method(#'queue.declare'{queue = QueueNameBin, end, %% We use this in both branches, because queue_declare may yet return an %% existing queue. - Finish = fun (#amqqueue{name = QueueName, - durable = Durable1, - auto_delete = AutoDelete1} = Q) + Finish = fun (#amqqueue{name = QueueName, + durable = Durable1, + auto_delete = AutoDelete1} = Q) when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> check_exclusive_access(Q, Owner, strict), check_configure_permitted(QueueName, State), @@ -748,7 +752,7 @@ handle_method(#'queue.declare'{queue = QueueNameBin, channel_error, "parameters for ~s not equivalent", [rabbit_misc:rs(QueueName)]) - end, + end, Q = case rabbit_amqqueue:with( rabbit_misc:r(VHostPath, queue, QueueNameBin), Finish) of diff --git a/src/rabbit_error_logger.erl b/src/rabbit_error_logger.erl index face0a1a21..e9baf2c480 100644 --- a/src/rabbit_error_logger.erl +++ b/src/rabbit_error_logger.erl @@ -48,7 +48,7 @@ boot() -> init([DefaultVHost]) -> #exchange{} = rabbit_exchange:declare( rabbit_misc:r(DefaultVHost, exchange, ?LOG_EXCH_NAME), - topic, true, []), + topic, true, false, []), {ok, #resource{virtual_host = DefaultVHost, kind = exchange, name = ?LOG_EXCH_NAME}}. diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index eb6f3e49f9..512f248c49 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -33,13 +33,13 @@ -include("rabbit.hrl"). -include("rabbit_framing.hrl"). --export([recover/0, declare/4, lookup/1, lookup_or_die/1, +-export([recover/0, declare/5, lookup/1, lookup_or_die/1, list/1, info_keys/0, info/1, info/2, info_all/1, info_all/2, publish/2]). -export([add_binding/5, delete_binding/5, list_bindings/1]). -export([delete/2]). -export([delete_queue_bindings/1, delete_transient_queue_bindings/1]). --export([assert_equivalence/4]). +-export([assert_equivalence/5]). -export([assert_args_equivalence/2]). -export([check_type/1]). @@ -63,9 +63,11 @@ -type(inner_fun() :: fun((exchange(), queue()) -> any())). -spec(recover/0 :: () -> 'ok'). --spec(declare/4 :: (exchange_name(), exchange_type(), boolean(), amqp_table()) -> exchange()). +-spec(declare/5 :: (exchange_name(), exchange_type(), boolean(), boolean(), + amqp_table()) -> exchange()). -spec(check_type/1 :: (binary()) -> atom()). --spec(assert_equivalence/4 :: (exchange(), atom(), boolean(), amqp_table()) -> 'ok'). +-spec(assert_equivalence/5 :: (exchange(), atom(), boolean(), boolean(), + amqp_table()) -> 'ok'). -spec(assert_args_equivalence/2 :: (exchange(), amqp_table()) -> 'ok'). -spec(lookup/1 :: (exchange_name()) -> {'ok', exchange()} | not_found()). -spec(lookup_or_die/1 :: (exchange_name()) -> exchange()). @@ -98,7 +100,7 @@ %%---------------------------------------------------------------------------- --define(INFO_KEYS, [name, type, durable, arguments]. +-define(INFO_KEYS, [name, type, durable, auto_delete, arguments]. recover() -> Exs = rabbit_misc:table_fold( @@ -133,10 +135,11 @@ recover_with_bindings(Bs, [X = #exchange{type = Type} | Xs], Bindings) -> recover_with_bindings([], [], []) -> ok. -declare(ExchangeName, Type, Durable, Args) -> +declare(ExchangeName, Type, Durable, AutoDelete, Args) -> Exchange = #exchange{name = ExchangeName, type = Type, durable = Durable, + auto_delete = AutoDelete, arguments = Args}, %% We want to upset things if it isn't ok; this is different from %% the other hooks invocations, where we tend to ignore the return @@ -187,11 +190,12 @@ check_type(TypeBin) -> end. assert_equivalence(X = #exchange{ durable = Durable, + auto_delete = AutoDelete, type = Type}, - Type, Durable, + Type, Durable, AutoDelete, RequiredArgs) -> ok = (type_to_module(Type)):assert_args_equivalence(X, RequiredArgs); -assert_equivalence(#exchange{ name = Name }, _Type, _Durable, +assert_equivalence(#exchange{ name = Name }, _Type, _Durable, _AutoDelete, _Args) -> rabbit_misc:protocol_error( precondition_failed, @@ -242,6 +246,7 @@ infos(Items, X) -> [{Item, i(Item, X)} || Item <- Items]. i(name, #exchange{name = Name}) -> Name; i(type, #exchange{type = Type}) -> Type; i(durable, #exchange{durable = Durable}) -> Durable; +i(auto_delete, #exchange{auto_delete = AutoDelete}) -> AutoDelete; i(arguments, #exchange{arguments = Arguments}) -> Arguments; i(Item, _) -> throw({bad_argument, Item}). @@ -519,9 +524,13 @@ delete(ExchangeName, IfUnused) -> Error end. -%% TODO: remove this autodelete machinery altogether. -maybe_auto_delete(Exchange) -> - {no_delete, Exchange}. +maybe_auto_delete(Exchange = #exchange{auto_delete = false}) -> + {no_delete, Exchange}; +maybe_auto_delete(Exchange = #exchange{auto_delete = true}) -> + case conditional_delete(Exchange) of + {error, in_use} -> {no_delete, Exchange}; + {deleted, Exchange, []} -> {auto_deleted, Exchange} + end. conditional_delete(Exchange = #exchange{name = ExchangeName}) -> Match = #route{binding = #binding{exchange_name = ExchangeName, _ = '_'}}, |
