Cleanup internal exchanges and queues after plugin is disabled or policy removed
rabbitmq-federation#63 [#153011041]
This commit is contained in:
parent
f6949e37e8
commit
a8953cd6ce
|
|
@ -198,8 +198,14 @@ terminate(Reason, #state{downstream_connection = DConn,
|
|||
upstream = Upstream,
|
||||
upstream_params = UParams,
|
||||
downstream_exchange = XName,
|
||||
internal_exchange_timer = TRef}) ->
|
||||
internal_exchange_timer = TRef,
|
||||
internal_exchange = IntExchange,
|
||||
queue = Queue}) ->
|
||||
timer:cancel(TRef),
|
||||
%% Cleanup of internal queue and exchange
|
||||
delete_upstream_queue(Conn, Queue),
|
||||
delete_upstream_exchange(Conn, IntExchange),
|
||||
|
||||
rabbit_federation_link_util:ensure_connection_closed(DConn),
|
||||
rabbit_federation_link_util:ensure_connection_closed(Conn),
|
||||
rabbit_federation_link_util:log_terminate(Reason, Upstream, UParams, XName),
|
||||
|
|
@ -591,6 +597,10 @@ delete_upstream_exchange(Conn, XNameBin) ->
|
|||
rabbit_federation_link_util:disposable_channel_call(
|
||||
Conn, #'exchange.delete'{exchange = XNameBin}).
|
||||
|
||||
delete_upstream_queue(Conn, Queue) ->
|
||||
rabbit_federation_link_util:disposable_channel_call(
|
||||
Conn, #'queue.delete'{queue = Queue}).
|
||||
|
||||
update_headers(#upstream_params{table = Table}, UName, Redelivered, Headers) ->
|
||||
rabbit_basic:prepend_table_header(
|
||||
?ROUTING_HEADER, Table ++ [{<<"redelivered">>, bool, Redelivered}] ++
|
||||
|
|
|
|||
|
|
@ -51,7 +51,9 @@ groups() ->
|
|||
dynamic_reconfiguration,
|
||||
dynamic_reconfiguration_integrity,
|
||||
federate_unfederate,
|
||||
dynamic_plugin_stop_start
|
||||
dynamic_plugin_stop_start,
|
||||
dynamic_plugin_cleanup_stop_start,
|
||||
dynamic_policy_cleanup
|
||||
]}
|
||||
]},
|
||||
{with_disambiguate, [], [
|
||||
|
|
@ -412,6 +414,7 @@ binding_recovery(Config) ->
|
|||
rabbit_ct_broker_helpers:set_parameter(Config,
|
||||
Rabbit, <<"federation-upstream-set">>, <<"upstream">>,
|
||||
[[{<<"upstream">>, <<"rabbit">>}, {<<"exchange">>, <<"upstream">>}]]),
|
||||
wait_for_federation(120, Config, Rabbit, <<"/">>),
|
||||
|
||||
publish_expect(Ch3, <<"upstream">>, <<"key">>, Q, <<"HELLO">>),
|
||||
true = (none =/= suffix(Config, Rabbit, <<"rabbit">>, "upstream")),
|
||||
|
|
@ -747,9 +750,87 @@ dynamic_plugin_stop_start(Config) ->
|
|||
end || X <- [X1, X2]],
|
||||
|
||||
clear_policy(Config, 0, <<"dyn">>),
|
||||
assert_connections(Config, 0, [X1, X2], [])
|
||||
assert_connections(Config, 0, [X1, X2], []),
|
||||
delete_exchange(Ch, X2)
|
||||
end, [x(X1)]).
|
||||
|
||||
dynamic_plugin_cleanup_stop_start(Config) ->
|
||||
X1 = <<"dyn.exch1">>,
|
||||
with_ch(Config,
|
||||
fun (_Ch) ->
|
||||
set_policy(Config, 0, <<"dyn">>, <<"^dyn\\.">>, <<"localhost">>),
|
||||
|
||||
%% Declare federated exchange - get link
|
||||
assert_connections(Config, 0, [X1], [<<"localhost">>]),
|
||||
wait_for_federation(120, Config, 0, <<"/">>),
|
||||
|
||||
true = has_internal_federated_exchange(Config, 0, <<"/">>),
|
||||
true = has_internal_federated_queue(Config, 0, <<"/">>),
|
||||
|
||||
%% Disable plugin, link goes
|
||||
ok = rabbit_ct_broker_helpers:disable_plugin(Config, 0,
|
||||
"rabbitmq_federation"),
|
||||
|
||||
%% Internal exchanges and queues need cleanup
|
||||
false = has_internal_federated_exchange(Config, 0, <<"/">>),
|
||||
false = has_internal_federated_queue(Config, 0, <<"/">>),
|
||||
|
||||
ok = rabbit_ct_broker_helpers:enable_plugin(Config, 0,
|
||||
"rabbitmq_federation"),
|
||||
clear_policy(Config, 0, <<"dyn">>),
|
||||
assert_connections(Config, 0, [X1], [])
|
||||
end, [x(X1)]).
|
||||
|
||||
dynamic_policy_cleanup(Config) ->
|
||||
X1 = <<"dyn.exch1">>,
|
||||
with_ch(Config,
|
||||
fun (_Ch) ->
|
||||
set_policy(Config, 0, <<"dyn">>, <<"^dyn\\.">>, <<"localhost">>),
|
||||
|
||||
%% Declare federated exchange - get link
|
||||
assert_connections(Config, 0, [X1], [<<"localhost">>]),
|
||||
wait_for_federation(120, Config, 0, <<"/">>),
|
||||
|
||||
true = has_internal_federated_exchange(Config, 0, <<"/">>),
|
||||
true = has_internal_federated_queue(Config, 0, <<"/">>),
|
||||
|
||||
clear_policy(Config, 0, <<"dyn">>),
|
||||
timer:sleep(5000),
|
||||
|
||||
%% Internal exchanges and queues need cleanup
|
||||
false = has_internal_federated_exchange(Config, 0, <<"/">>),
|
||||
false = has_internal_federated_queue(Config, 0, <<"/">>),
|
||||
|
||||
clear_policy(Config, 0, <<"dyn">>),
|
||||
assert_connections(Config, 0, [X1], [])
|
||||
end, [x(X1)]).
|
||||
|
||||
wait_for_federation(0, _, _, _) ->
|
||||
ok;
|
||||
wait_for_federation(N, Config, Node, VHost) ->
|
||||
case has_internal_federated_exchange(Config, Node, VHost) andalso
|
||||
has_internal_federated_queue(Config, Node, VHost) of
|
||||
true ->
|
||||
ok;
|
||||
false ->
|
||||
timer:sleep(500),
|
||||
wait_for_federation(N - 1, Config, Node, VHost)
|
||||
end.
|
||||
|
||||
has_internal_federated_exchange(Config, Node, VHost) ->
|
||||
lists:any(fun(X) ->
|
||||
X#exchange.type == 'x-federation-upstream'
|
||||
end, rabbit_ct_broker_helpers:rpc(Config, Node,
|
||||
rabbit_exchange, list, [VHost])).
|
||||
|
||||
has_internal_federated_queue(Config, Node, VHost) ->
|
||||
lists:any(
|
||||
fun(Q) ->
|
||||
{'longstr', <<"federation">>} ==
|
||||
rabbit_misc:table_lookup(Q#amqqueue.arguments, <<"x-internal-purpose">>)
|
||||
end, rabbit_ct_broker_helpers:rpc(Config, Node,
|
||||
rabbit_amqqueue, list, [VHost])).
|
||||
|
||||
%%----------------------------------------------------------------------------
|
||||
|
||||
with_ch(Config, Fun, Xs) ->
|
||||
|
|
|
|||
Loading…
Reference in New Issue