Skip to content

Commit 5a1bd25

Browse files
Merge pull request #14425 from rabbitmq/mk-shovel-library-mode
Shovel: introduce operating modes
2 parents e4bc525 + e61eb7a commit 5a1bd25

File tree

6 files changed

+81
-9
lines changed

6 files changed

+81
-9
lines changed

deps/rabbitmq_shovel/include/rabbit_shovel.hrl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
%% Copyright (c) 2007-2025 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
66
%%
77

8+
-define(SHOVEL_APP, rabbitmq_shovel).
9+
810
-record(endpoint,
911
{uris,
1012
resource_declaration

deps/rabbitmq_shovel/priv/schema/rabbitmq_shovel.schema

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22
%% RabbitMQ Shovel plugin
33
%% ----------------------------------------------------------------------------
44

5+
{mapping, "shovel.operating_mode", "rabbitmq_shovel.operating_mode", [
6+
[{datatype, {enum, [standard, alternative, library]}}]
7+
]}.
8+
59
{mapping, "shovel.topology.predeclared", "rabbitmq_shovel.topology.predeclared", [
610
[{datatype, {enum, [true, false]}}]
711
]}.

deps/rabbitmq_shovel/src/rabbit_shovel_dyn_worker_sup_sup.erl

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,14 @@ start_link() ->
2626
{ok, Pid0} -> Pid0;
2727
{error, {already_started, Pid0}} -> Pid0
2828
end,
29-
Shovels = rabbit_runtime_parameters:list_component(<<"shovel">>),
29+
OpMode = rabbit_shovel_operating_mode:operating_mode(),
30+
Shovels = case OpMode of
31+
standard ->
32+
rabbit_runtime_parameters:list_component(<<"shovel">>);
33+
_Other ->
34+
%% when operating in a non-standard mode, do not start any shovels
35+
[]
36+
end,
3037
[start_child({pget(vhost, Shovel), pget(name, Shovel)},
3138
pget(value, Shovel)) || Shovel <- Shovels],
3239
{ok, Pid}.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
%% This Source Code Form is subject to the terms of the Mozilla Public
2+
%% License, v. 2.0. If a copy of the MPL was not distributed with this
3+
%% file, You can obtain one at https://mozilla.org/MPL/2.0/.
4+
%%
5+
%% Copyright (c) 2007-2025 Broadcom. All Rights Reserved. The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. All rights reserved.
6+
%%
7+
8+
-module(rabbit_shovel_operating_mode).
9+
10+
-include("rabbit_shovel.hrl").
11+
12+
-export([
13+
operating_mode/0
14+
]).
15+
16+
-type operating_mode() :: 'standard' | atom().
17+
18+
%%
19+
%% API
20+
%%
21+
22+
-spec operating_mode() -> operating_mode().
23+
operating_mode() ->
24+
application:get_env(?SHOVEL_APP, operating_mode, standard).

deps/rabbitmq_shovel/src/rabbit_shovel_parameters.erl

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,22 @@
3939
{enables, recovery}]}).
4040

4141
register() ->
42-
rabbit_registry:register(runtime_parameter, <<"shovel">>, ?MODULE).
42+
OpMode = rabbit_shovel_operating_mode:operating_mode(),
43+
case OpMode of
44+
standard ->
45+
rabbit_registry:register(runtime_parameter, <<"shovel">>, ?MODULE);
46+
_Other ->
47+
?LOG_DEBUG("Shovel: skipping runtime parameter registration, operating mode: ~ts", [OpMode])
48+
end.
4349

4450
unregister() ->
45-
rabbit_registry:unregister(runtime_parameter, <<"shovel">>).
51+
OpMode = rabbit_shovel_operating_mode:operating_mode(),
52+
case OpMode of
53+
standard ->
54+
rabbit_registry:unregister(runtime_parameter, <<"shovel">>);
55+
_Other ->
56+
?LOG_DEBUG("Shovel: skipping runtime parameter deregistration, operating mode: ~ts", [OpMode])
57+
end.
4658

4759
validate(_VHost, <<"shovel">>, Name, Def0, User) ->
4860
Def = rabbit_data_coercion:to_proplist(Def0),
@@ -65,10 +77,22 @@ pget2(K1, K2, Defs) -> case {pget(K1, Defs), pget(K2, Defs)} of
6577
end.
6678

6779
notify(VHost, <<"shovel">>, Name, Definition, _Username) ->
68-
rabbit_shovel_dyn_worker_sup_sup:adjust({VHost, Name}, Definition).
80+
OpMode = rabbit_shovel_operating_mode:operating_mode(),
81+
case OpMode of
82+
standard ->
83+
rabbit_shovel_dyn_worker_sup_sup:adjust({VHost, Name}, Definition);
84+
_Other ->
85+
?LOG_DEBUG("Shovel: ignoring a runtime parameter update, operating mode: ~ts", [OpMode])
86+
end.
6987

7088
notify_clear(VHost, <<"shovel">>, Name, _Username) ->
71-
rabbit_shovel_dyn_worker_sup_sup:stop_child({VHost, Name}).
89+
OpMode = rabbit_shovel_operating_mode:operating_mode(),
90+
case OpMode of
91+
standard ->
92+
rabbit_shovel_dyn_worker_sup_sup:stop_child({VHost, Name});
93+
_Other ->
94+
?LOG_DEBUG("Shovel: ignoring a cleared runtime parameter, operating mode: ~ts", [OpMode])
95+
end.
7296

7397
%%----------------------------------------------------------------------------
7498

deps/rabbitmq_shovel/src/rabbit_shovel_sup.erl

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
-module(rabbit_shovel_sup).
99
-behaviour(supervisor).
1010

11+
-include_lib("kernel/include/logger.hrl").
12+
-include_lib("logging.hrl").
13+
1114
-export([start_link/0, init/1]).
1215

1316
-import(rabbit_shovel_config, []).
@@ -21,6 +24,9 @@ start_link() ->
2124
end.
2225

2326
init([Configurations]) ->
27+
OpMode = rabbit_shovel_operating_mode:operating_mode(),
28+
?LOG_DEBUG("Shovel: operating mode set to ~ts", [OpMode]),
29+
StaticShovelSpecs = make_child_specs(OpMode, Configurations),
2430
Len = dict:size(Configurations),
2531
ChildSpecs = [
2632
#{
@@ -39,11 +45,13 @@ init([Configurations]) ->
3945
type => supervisor,
4046
modules => [rabbit_shovel_dyn_worker_sup_sup]
4147
}
42-
| make_child_specs(Configurations)
48+
| StaticShovelSpecs
4349
],
44-
{ok, {#{strategy => one_for_one, intensity => 2 * Len, period => 2}, ChildSpecs}}.
50+
Opts = #{strategy => one_for_one, intensity => 2 * Len, period => 2},
51+
{ok, {Opts, ChildSpecs}}.
52+
4553

46-
make_child_specs(Configurations) ->
54+
make_child_specs(standard, Configurations) ->
4755
dict:fold(
4856
fun (ShovelName, ShovelConfig, Acc) ->
4957
[
@@ -57,7 +65,10 @@ make_child_specs(Configurations) ->
5765
}
5866
| Acc
5967
]
60-
end, [], Configurations).
68+
end, [], Configurations);
69+
make_child_specs(_NonStandardOpMode, _Configurations) ->
70+
%% when operating in a non-standard mode, do not start any shovels
71+
[].
6172

6273
parse_configuration(undefined) ->
6374
{ok, dict:new()};

0 commit comments

Comments
 (0)