summaryrefslogtreecommitdiff
path: root/src/rabbit_exchange_decorator.erl
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2014-06-09 17:48:30 +0100
committerSimon MacMullen <simon@rabbitmq.com>2014-06-09 17:48:30 +0100
commitde82a62350f96ae88ff2c4660e269506176d82a6 (patch)
treebfa862d3ad57fdcbd3c110054810fcccbb65d656 /src/rabbit_exchange_decorator.erl
parent3fae823a5f503364e89a18ad11b812ef68a58e11 (diff)
downloadrabbitmq-server-de82a62350f96ae88ff2c4660e269506176d82a6.tar.gz
Support updating decorators correctly when plugins start and stop.
Diffstat (limited to 'src/rabbit_exchange_decorator.erl')
-rw-r--r--src/rabbit_exchange_decorator.erl24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/rabbit_exchange_decorator.erl b/src/rabbit_exchange_decorator.erl
index 2f056b1b..900f9c32 100644
--- a/src/rabbit_exchange_decorator.erl
+++ b/src/rabbit_exchange_decorator.erl
@@ -18,7 +18,7 @@
-include("rabbit.hrl").
--export([select/2, set/1]).
+-export([select/2, set/1, register/2, unregister/1]).
%% This is like an exchange type except that:
%%
@@ -104,3 +104,25 @@ list() -> [M || {_, M} <- rabbit_registry:lookup_all(exchange_decorator)].
cons_if_eq(Select, Select, Item, List) -> [Item | List];
cons_if_eq(_Select, _Other, _Item, List) -> List.
+
+register(TypeName, ModuleName) ->
+ rabbit_registry:register(exchange_decorator, TypeName, ModuleName),
+ [maybe_recover(X) || X <- rabbit_exchange:list()],
+ ok.
+
+unregister(TypeName) ->
+ rabbit_registry:unregister(exchange_decorator, TypeName),
+ [maybe_recover(X) || X <- rabbit_exchange:list()],
+ ok.
+
+maybe_recover(X = #exchange{name = Name,
+ decorators = Decs}) ->
+ #exchange{decorators = Decs1} = set(X),
+ Old = lists:sort(select(all, Decs)),
+ New = lists:sort(select(all, Decs1)),
+ case New of
+ Old -> ok;
+ _ -> %% TODO create a tx here for non-federation decorators
+ [M:create(none, X) || M <- New -- Old],
+ rabbit_exchange:update_decorators(Name)
+ end.