summaryrefslogtreecommitdiff
path: root/src/rabbit_binding.erl
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2011-04-06 15:01:46 +0100
committerSimon MacMullen <simon@rabbitmq.com>2011-04-06 15:01:46 +0100
commitf2d3b189ad34e01e80841a48552622577cb069f8 (patch)
treef9ee8a5bbb0562e97cb221b043425c685b4149c7 /src/rabbit_binding.erl
parentb010416a0a2ebf15cae4d4da211486a12f80b2aa (diff)
downloadrabbitmq-server-f2d3b189ad34e01e80841a48552622577cb069f8.tar.gz
Split back up into lots of little txs.
Diffstat (limited to 'src/rabbit_binding.erl')
-rw-r--r--src/rabbit_binding.erl49
1 files changed, 18 insertions, 31 deletions
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl
index 7c492778..c71a21f1 100644
--- a/src/rabbit_binding.erl
+++ b/src/rabbit_binding.erl
@@ -95,45 +95,32 @@
routing_key, arguments]).
recover(XNames, QNames) ->
- XBs = rabbit_misc:execute_mnesia_transaction(
- fun () ->
- XBs = recover_internal(XNames, QNames),
- callback_bindings(true, XBs),
- XBs
- end),
- callback_bindings(false, XBs),
- ok.
-
-recover_internal(XNames, QNames) ->
XNameSet = sets:from_list(XNames),
QNameSet = sets:from_list(QNames),
- lists:foldl(
- fun (Route = #route{binding = B = #binding{source = Src}}, Acc) ->
+ rabbit_misc:table_fold(
+ fun (Route = #route{binding = B}, _Acc) ->
case should_recover(B, XNameSet, QNameSet) of
true -> ok = sync_transient_binding(
Route, fun mnesia:write/3),
- rabbit_misc:dict_cons(Src, B, Acc);
- false -> Acc
+ B;
+ false -> none
end
- end, dict:new(),
- mnesia:select(rabbit_durable_route, [{'$1', [], ['$1']}])).
+ end,
+ fun (none, _Tx) ->
+ ok;
+ (B = #binding{source = Src}, Tx) ->
+ {ok, X} = rabbit_exchange:lookup(Src),
+ rabbit_exchange:callback(X, add_bindings, [Tx, X, [B]])
+ end,
+ none, rabbit_durable_route),
+ ok.
-should_recover(B = #binding{destination = Dst = #resource{ kind = Kind }},
+should_recover(#binding{destination = Dst = #resource{ kind = Kind }},
XNameSet, QNameSet) ->
- case mnesia:read({rabbit_route, B}) of
- [] -> sets:is_element(Dst, case Kind of
- exchange -> XNameSet;
- queue -> QNameSet
- end);
- _ -> false
- end.
-
-callback_bindings(Tx, XBs) ->
- dict:map(fun (XName, Bindings) ->
- {ok, X} = rabbit_exchange:lookup(XName),
- rabbit_exchange:callback(X, add_bindings,
- [Tx, X, Bindings])
- end, XBs).
+ sets:is_element(Dst, case Kind of
+ exchange -> XNameSet;
+ queue -> QNameSet
+ end).
exists(Binding) ->
binding_action(