summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Sackman <matthew@rabbitmq.com>2010-06-22 18:18:28 +0100
committerMatthew Sackman <matthew@rabbitmq.com>2010-06-22 18:18:28 +0100
commit94d5c4ec874b806fccacc5ffe12d10cc7245a633 (patch)
tree93f88778c566304692cd7425d3f5c34d8534b360
parent1de614dfa220ca8c90a1e9385dc516f517b00c9e (diff)
parent34bf47a1bce50deb54cfeb908920cc19bf61c04e (diff)
downloadrabbitmq-server-git-94d5c4ec874b806fccacc5ffe12d10cc7245a633.tar.gz
Merging bug 22867 onto amqp0_9_1
-rw-r--r--include/rabbit.hrl3
-rw-r--r--src/rabbit_access_control.erl2
-rw-r--r--src/rabbit_channel.erl18
-rw-r--r--src/rabbit_error_logger.erl2
-rw-r--r--src/rabbit_exchange.erl31
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, _ = '_'}},