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 | 4fa5c3309ebc119b35f3a6f6c9c5e7d5eadaf5ee (patch) | |
| tree | ce8dd5d29ca3c318d7e5d6ac281c93778782d4a2 /src | |
| parent | da2bd58438daf6e72acf7ec82a11770277474fdf (diff) | |
| download | rabbitmq-server-git-4fa5c3309ebc119b35f3a6f6c9c5e7d5eadaf5ee.tar.gz | |
Only recover bindings that are to exchanges or to queues that are on this node.
Diffstat (limited to 'src')
| -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 84ae789cfc..c9cf0a3926 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 f6ab9d74b9..572a0b7089 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), |
