summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Radestock <matthias@rabbitmq.com>2010-10-11 22:47:25 +0100
committerMatthias Radestock <matthias@rabbitmq.com>2010-10-11 22:47:25 +0100
commit786a473fb99e3a2c687fe1cbde0e1978f0687214 (patch)
treea445a6b6066df01d5d5e24fc91156e0fe7ce8a09
parenta70e57f8f65434a331270836e3c46c49fd078919 (diff)
downloadrabbitmq-server-786a473fb99e3a2c687fe1cbde0e1978f0687214.tar.gz
refactoring
-rw-r--r--src/rabbit_amqqueue.erl21
-rw-r--r--src/rabbit_binding.erl76
2 files changed, 43 insertions, 54 deletions
diff --git a/src/rabbit_amqqueue.erl b/src/rabbit_amqqueue.erl
index 572bfc01..6dcd04d5 100644
--- a/src/rabbit_amqqueue.erl
+++ b/src/rabbit_amqqueue.erl
@@ -469,17 +469,16 @@ maybe_expire(QPid) ->
gen_server2:cast(QPid, maybe_expire).
on_node_down(Node) ->
- Deletions =
- lists:foldl(
- fun rabbit_binding:combine_deletions/2,
- rabbit_binding:new_deletions(),
- rabbit_misc:execute_mnesia_transaction(
- fun () -> qlc:e(qlc:q([delete_queue(QueueName) ||
- #amqqueue{name = QueueName, pid = Pid}
- <- mnesia:table(rabbit_queue),
- node(Pid) == Node]))
- end)),
- ok = rabbit_binding:process_deletions(Deletions).
+ rabbit_binding:process_deletions(
+ lists:foldl(
+ fun rabbit_binding:combine_deletions/2,
+ rabbit_binding:new_deletions(),
+ rabbit_misc:execute_mnesia_transaction(
+ fun () -> qlc:e(qlc:q([delete_queue(QueueName) ||
+ #amqqueue{name = QueueName, pid = Pid}
+ <- mnesia:table(rabbit_queue),
+ node(Pid) == Node]))
+ end))).
delete_queue(QueueName) ->
ok = mnesia:delete({rabbit_queue, QueueName}),
diff --git a/src/rabbit_binding.erl b/src/rabbit_binding.erl
index 59c59072..8b041fde 100644
--- a/src/rabbit_binding.erl
+++ b/src/rabbit_binding.erl
@@ -354,13 +354,12 @@ maybe_auto_delete(XName, Bindings, Deletions) ->
{error, not_found} ->
add_deletion(XName, {undefined, not_deleted, Bindings}, Deletions);
{ok, X} ->
- Deletions1 =
- add_deletion(XName, {X, not_deleted, Bindings}, Deletions),
- case rabbit_exchange:maybe_auto_delete(X) of
- not_deleted -> Deletions1;
- {deleted, Deletions2} -> combine_deletions(Deletions1,
- Deletions2)
- end
+ add_deletion(XName, {X, not_deleted, Bindings},
+ case rabbit_exchange:maybe_auto_delete(X) of
+ not_deleted -> Deletions;
+ {deleted, Deletions1} -> combine_deletions(
+ Deletions, Deletions1)
+ end)
end.
delete_forward_routes(Route) ->
@@ -404,45 +403,36 @@ reverse_binding(#binding{source = SrcName,
%% Binding / exchange deletion abstraction API
%% ----------------------------------------------------------------------------
-anything_but(NotThis, NotThis, NotThis) ->
- NotThis;
-anything_but(NotThis, NotThis, This) ->
- This;
-anything_but(NotThis, This, NotThis) ->
- This;
-anything_but(_NotThis, This, This) ->
- This.
-
-boolean_or(True, True, _Any) ->
- True;
-boolean_or(True, _Any, True) ->
- True;
-boolean_or(_True, Any, Any) ->
- Any.
-
-new_deletions() ->
- dict:new().
-
-add_deletion(XName, Init = {X, Deleted, Bindings}, Deletions) ->
- dict:update(
- XName, fun ({X1, Deleted1, Bindings1}) ->
- {anything_but(undefined, X, X1),
- boolean_or(deleted, Deleted, Deleted1),
- [Bindings | Bindings1]}
- end, Init, Deletions).
+anything_but( NotThis, NotThis, NotThis) -> NotThis;
+anything_but( NotThis, NotThis, This) -> This;
+anything_but( NotThis, This, NotThis) -> This;
+anything_but(_NotThis, This, This) -> This.
+
+boolean_or( True, True, _Any) -> True;
+boolean_or( True, _Any, True) -> True;
+boolean_or(_True, Any, Any) -> Any.
+
+new_deletions() -> dict:new().
+
+add_deletion(XName, Entry, Deletions) ->
+ dict:update(XName, fun (Entry1) -> combine_entries(Entry1, Entry) end,
+ Entry, Deletions).
combine_deletions(Deletions1, Deletions2) ->
- dict:merge(
- fun (_XName, {X1, Deleted1, Bindings1}, {X2, Deleted2, Bindings2}) ->
- {anything_but(undefined, X1, X2),
- boolean_or(deleted, Deleted1, Deleted2),
- [Bindings1 | Bindings2]}
- end, Deletions1, Deletions2).
+ dict:merge(fun (_XName, E1, E2) -> combine_entries(E1, E2) end,
+ Deletions1, Deletions2).
+
+combine_entries({X1, Deleted1, Bindings1}, {X2, Deleted2, Bindings2}) ->
+ {anything_but(undefined, X1, X2), boolean_or(deleted, Deleted1, Deleted2),
+ [Bindings1 | Bindings2]}.
process_deletions(Deletions) ->
dict:fold(
- fun (_XName, {X = #exchange{ type = Type }, not_deleted, Bindings}, ok) ->
- (type_to_module(Type)):remove_bindings(X, lists:flatten(Bindings));
- (_XName, {X = #exchange{ type = Type }, deleted, Bindings}, ok) ->
- (type_to_module(Type)):delete(X, lists:flatten(Bindings))
+ fun (_XName, {X = #exchange{ type = Type }, Deleted, Bindings}, ok) ->
+ TypeModule = type_to_module(Type),
+ FlatBindings = lists:flatten(Bindings),
+ case Deleted of
+ not_deleted -> TypeModule:remove_bindings(X, FlatBindings);
+ deleted -> TypeModule:delete(X, FlatBindings)
+ end
end, ok, Deletions).