summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2011-04-06 15:17:12 +0100
committerSimon MacMullen <simon@rabbitmq.com>2011-04-06 15:17:12 +0100
commit6f9e91a2d0d38a1bcd680acbb4e2782d975c6a5d (patch)
tree1dcb26588528979ea981feca7e80de94db7c993d
parentdc5425baa1fbb1d32bbb08ad0d72f9e3788fbdc9 (diff)
downloadrabbitmq-server-6f9e91a2d0d38a1bcd680acbb4e2782d975c6a5d.tar.gz
Check for presence of binding in rabbit_durable_route on add.
-rw-r--r--src/rabbit_binding.erl20
1 files changed, 12 insertions, 8 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl
index c71a21f1..d293c812 100644
--- a/src/rabbit_binding.erl
+++ b/src/rabbit_binding.erl
@@ -142,14 +142,11 @@ add(Binding, InnerFun) ->
case InnerFun(Src, Dst) of
ok ->
case mnesia:read({rabbit_route, B}) of
- [] -> ok = sync_binding(B, all_durable([Src, Dst]),
- fun mnesia:write/3),
- fun (Tx) ->
- ok = rabbit_exchange:callback(
- Src, add_bindings,
- [Tx, Src, [B]]),
- rabbit_event:notify_if(
- not Tx, binding_created, info(B))
+ [] -> case mnesia:read({rabbit_durable_route, B}) of
+ [] -> add_internal(Src, Dst, B);
+ %% Binding exists, to queue on node which
+ %% is in the middle of starting
+ [_] -> rabbit_misc:const(not_found)
end;
[_] -> fun rabbit_misc:const_ok/1
end;
@@ -158,6 +155,13 @@ add(Binding, InnerFun) ->
end
end).
+add_internal(Src, Dst, B) ->
+ ok = sync_binding(B, all_durable([Src, Dst]), fun mnesia:write/3),
+ fun (Tx) ->
+ ok = rabbit_exchange:callback(Src, add_bindings, [Tx, Src, [B]]),
+ rabbit_event:notify_if(not Tx, binding_created, info(B))
+ end.
+
remove(Binding, InnerFun) ->
binding_action(
Binding,