diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2011-04-06 15:17:12 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2011-04-06 15:17:12 +0100 |
commit | 6f9e91a2d0d38a1bcd680acbb4e2782d975c6a5d (patch) | |
tree | 1dcb26588528979ea981feca7e80de94db7c993d | |
parent | dc5425baa1fbb1d32bbb08ad0d72f9e3788fbdc9 (diff) | |
download | rabbitmq-server-6f9e91a2d0d38a1bcd680acbb4e2782d975c6a5d.tar.gz |
Check for presence of binding in rabbit_durable_route on add.
-rw-r--r-- | src/rabbit_binding.erl | 20 |
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, |