diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2011-03-31 13:08:50 +0100 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2011-03-31 13:08:50 +0100 |
commit | 5c36ec391adbf2d949cfbce79efab20eb03b7116 (patch) | |
tree | ce8dd5d29ca3c318d7e5d6ac281c93778782d4a2 | |
parent | 992e24b44109679d60ec7dc808548b9d57efffd4 (diff) | |
download | rabbitmq-server-5c36ec391adbf2d949cfbce79efab20eb03b7116.tar.gz |
Only recover bindings that are to exchanges or to queues that are on this node.
-rw-r--r-- | src/rabbit_binding.erl | 29 | ||||
-rw-r--r-- | src/rabbit_exchange.erl | 3 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl index 84ae789c..c9cf0a39 100644 --- a/src/rabbit_binding.erl +++ b/src/rabbit_binding.erl @@ -96,15 +96,32 @@ recover() -> rabbit_misc:table_fold( fun (Route = #route{binding = B}, Acc) -> - case mnesia:read({rabbit_route, B}) of - [] -> {_, Rev} = route_with_reverse(Route), - ok = mnesia:write(rabbit_route, Route, write), - ok = mnesia:write(rabbit_reverse_route, Rev, write), - [B | Acc]; - [_] -> Acc + case should_recover(B) of + true -> {_, Rev} = route_with_reverse(Route), + ok = mnesia:write(rabbit_route, Route, write), + ok = mnesia:write(rabbit_reverse_route, Rev, write), + [B | Acc]; + false -> Acc end end, [], rabbit_durable_route). +should_recover(B = #binding{destination = Dest = #resource{ kind = Kind }}) -> + case mnesia:read({rabbit_route, B}) of + [] -> case Kind of + exchange -> true; + queue -> case mnesia:read({rabbit_durable_queue, Dest}) of + [Q] -> #amqqueue{pid = Pid} = Q, + Node = node(), + case node(Pid) of + Node -> true; + _ -> false + end; + _ -> false + end + end; + _ -> false + end. + exists(Binding) -> binding_action( Binding, fun (_Src, _Dst, B) -> diff --git a/src/rabbit_exchange.erl b/src/rabbit_exchange.erl index f6ab9d74..572a0b70 100644 --- a/src/rabbit_exchange.erl +++ b/src/rabbit_exchange.erl @@ -95,7 +95,6 @@ recover() -> {RecXBs, NoRecXBs} = filter_recovered_exchanges(Xs, Bs), ok = recovery_callbacks(RecXBs, NoRecXBs). -%% TODO strip out bindings that are to queues not on this node filter_recovered_exchanges(Xs, Bs) -> RecXs = dict:from_list([{XName, X} || X = #exchange{name = XName} <- Xs]), lists:foldl( @@ -112,11 +111,9 @@ recovery_callbacks(RecXBs, NoRecXBs) -> fun () -> ok end, fun (ok, Tx) -> dict:map(fun (X = #exchange{type = Type}, Bs) -> - io:format("Recover X ~p~n", [X]), (type_to_module(Type)):start(Tx, X, Bs) end, RecXBs), dict:map(fun (X = #exchange{type = Type}, Bs) -> - io:format("Recover Bs ~p~n", [Bs]), (type_to_module(Type)):add_bindings(Tx, X, Bs) end, NoRecXBs) end), |