summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2011-03-31 13:08:50 +0100
committerSimon MacMullen <simon@rabbitmq.com>2011-03-31 13:08:50 +0100
commit5c36ec391adbf2d949cfbce79efab20eb03b7116 (patch)
treece8dd5d29ca3c318d7e5d6ac281c93778782d4a2
parent992e24b44109679d60ec7dc808548b9d57efffd4 (diff)
downloadrabbitmq-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.erl29
-rw-r--r--src/rabbit_exchange.erl3
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),