diff options
author | Matthias Radestock <matthias@rabbitmq.com> | 2010-10-11 22:47:25 +0100 |
---|---|---|
committer | Matthias Radestock <matthias@rabbitmq.com> | 2010-10-11 22:47:25 +0100 |
commit | 786a473fb99e3a2c687fe1cbde0e1978f0687214 (patch) | |
tree | a445a6b6066df01d5d5e24fc91156e0fe7ce8a09 | |
parent | a70e57f8f65434a331270836e3c46c49fd078919 (diff) | |
download | rabbitmq-server-786a473fb99e3a2c687fe1cbde0e1978f0687214.tar.gz |
refactoring
-rw-r--r-- | src/rabbit_amqqueue.erl | 21 | ||||
-rw-r--r-- | src/rabbit_binding.erl | 76 |
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). |