summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@lshift.net>2009-12-18 19:30:44 +0000
committerMatthias Radestock <matthias@lshift.net>2009-12-18 19:30:44 +0000
commit21e43c8673020db8a6a7dc02c6856ac47a77fbd6 (patch)
tree05303250634ca38ac9c1107993407b3ea99bbd73 /src
parent21b9b3d0d7c337fd562e2d03610a7fd8ea1b03dc (diff)
downloadrabbitmq-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.erl22
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