diff options
| author | Matthias Radestock <matthias@lshift.net> | 2009-12-18 19:30:44 +0000 |
|---|---|---|
| committer | Matthias Radestock <matthias@lshift.net> | 2009-12-18 19:30:44 +0000 |
| commit | 21e43c8673020db8a6a7dc02c6856ac47a77fbd6 (patch) | |
| tree | 05303250634ca38ac9c1107993407b3ea99bbd73 /src | |
| parent | 21b9b3d0d7c337fd562e2d03610a7fd8ea1b03dc (diff) | |
| download | rabbitmq-server-git-21e43c8673020db8a6a7dc02c6856ac47a77fbd6.tar.gz | |
not_found error on attempt to declare a queue that exists on a stopped node
this prevents loss or duplication of messages when that node recovers
I considered returing {ok, Q} | {error, not_found} from
internal_declare (and subsequently declare), and let the channel deal
with throwing the appropriate amqp error. But
- that would be a change to a crucial internal API that is used by
quite a few extensions
- it would make the return type inconsistent with
rabbit_exchange:declare, which too only returns X, not {ok, X}.
- the rabbit_amqqueue module already knows about amqp errors - see
with_or_die. So this is not breaking any concern separation.
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_amqqueue.erl | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl index 1a5e82d714..d728ef6a76 100644 --- a/src/rabbit_amqqueue.erl +++ b/src/rabbit_amqqueue.erl @@ -163,15 +163,23 @@ internal_declare(Q = #amqqueue{name = QueueName}, WantDefaultBinding) -> case rabbit_misc:execute_mnesia_transaction( fun () -> case mnesia:wread({rabbit_queue, QueueName}) of - [] -> ok = store_queue(Q), - case WantDefaultBinding of - true -> add_default_binding(Q); - false -> ok - end, - Q; - [ExistingQ] -> ExistingQ + [] -> + case mnesia:read( + {rabbit_durable_queue, QueueName}) of + [] -> ok = store_queue(Q), + case WantDefaultBinding of + true -> add_default_binding(Q); + false -> ok + end, + Q; + [_] -> not_found %% existing Q on stopped node + end; + [ExistingQ] -> + ExistingQ end end) of + not_found -> exit(Q#amqqueue.pid, shutdown), + rabbit_misc:not_found(QueueName); Q -> Q; ExistingQ -> exit(Q#amqqueue.pid, shutdown), ExistingQ |
