diff options
author | Matthew Sackman <matthew@rabbitmq.com> | 2010-06-25 16:56:03 +0100 |
---|---|---|
committer | Matthew Sackman <matthew@rabbitmq.com> | 2010-06-25 16:56:03 +0100 |
commit | a118ccb00917a78174fd481be131664e44a2914d (patch) | |
tree | 94ca9aa01b4e88e92fa9b9455ff5871088736684 | |
parent | 6f431a81ca8e52c0fc5e8785b9448ed61dcb8b38 (diff) | |
download | rabbitmq-server-bug21872.tar.gz |
Avoid unnecessary mnesia lookup and significantly simplify queue declaration codebug21872
-rw-r--r-- | src/rabbit_channel.erl | 57 |
1 files changed, 24 insertions, 33 deletions
diff --git a/src/rabbit_channel.erl b/src/rabbit_channel.erl index d337df29..8649ecc7 100644 --- a/src/rabbit_channel.erl +++ b/src/rabbit_channel.erl @@ -726,42 +726,33 @@ 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) - when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> - check_exclusive_access(Q, Owner, strict), - check_configure_permitted(QueueName, State), - %% We need to notify the reader within the channel - %% process so that we can be sure there are no - %% outstanding exclusive queues being declared as the - %% connection shuts down. - case Owner of - none -> ok; - _ -> ok = rabbit_reader_queue_collector:register_exclusive_queue(CollectorPid, Q) - end, - Q; - %% non-equivalence trumps exclusivity arbitrarily - (#amqqueue{name = QueueName}) -> - rabbit_misc:protocol_error( - precondition_failed, - "parameters for ~s not equivalent", - [rabbit_misc:rs(QueueName)]) - end, - Q = case rabbit_amqqueue:with( - rabbit_misc:r(VHostPath, queue, QueueNameBin), - Finish) of - {error, not_found} -> - ActualNameBin = - case QueueNameBin of + ActualNameBin = case QueueNameBin of <<>> -> rabbit_guid:binstring_guid("amq.gen"); Other -> check_name('queue', Other) end, - QueueName = rabbit_misc:r(VHostPath, queue, ActualNameBin), - Finish(rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, - Args, Owner)); - #amqqueue{} = Other -> - Other + QueueName = rabbit_misc:r(VHostPath, queue, ActualNameBin), + Q = case rabbit_amqqueue:declare(QueueName, Durable, AutoDelete, + Args, Owner) of + #amqqueue{name = QueueName, + durable = Durable1, + auto_delete = AutoDelete1} = Q1 + when Durable =:= Durable1, AutoDelete =:= AutoDelete1 -> + check_exclusive_access(Q1, Owner, strict), + check_configure_permitted(QueueName, State), + %% We need to notify the reader within the channel + %% process so that we can be sure there are no + %% outstanding exclusive queues being declared as the + %% connection shuts down. + case Owner of + none -> ok; + _ -> ok = rabbit_reader_queue_collector:register_exclusive_queue(CollectorPid, Q1) + end, + Q1; + %% non-equivalence trumps exclusivity arbitrarily + #amqqueue{name = QueueName} -> + rabbit_misc:protocol_error( + precondition_failed, "parameters for ~s not equivalent", + [rabbit_misc:rs(QueueName)]) end, return_queue_declare_ok(State, NoWait, Q); |