diff options
Diffstat (limited to 'src')
| -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 c71a21f101..d293c8124d 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, |
