Skip to content

Commit d15713a

Browse files
Merge pull request #2029 from rabbitmq/v3.7.x-backport-feature-flags-subsystem
Backport feature flags subsystem to RabbitMQ 3.7.x
2 parents 24e90d5 + 49b1d68 commit d15713a

19 files changed

+3801
-21
lines changed

Makefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,9 @@ define PROJECT_ENV
127127
]
128128
endef
129129

130-
LOCAL_DEPS = sasl mnesia os_mon inets
130+
LOCAL_DEPS = sasl mnesia os_mon inets compiler syntax_tools
131131
BUILD_DEPS = rabbitmq_cli syslog
132-
DEPS = ranch lager rabbit_common sysmon_handler recon observer_cli
132+
DEPS = ranch lager rabbit_common sysmon_handler recon observer_cli stdout_formatter
133133
TEST_DEPS = rabbitmq_ct_helpers rabbitmq_ct_client_helpers amqp_client meck proper
134134

135135
dep_syslog = git https://github.com/schlagert/syslog 3.4.5
@@ -182,6 +182,7 @@ SLOW_CT_SUITES := backing_queue \
182182
config_schema \
183183
dynamic_ha \
184184
eager_sync \
185+
feature_flags \
185186
health_check \
186187
lazy_queue \
187188
metrics \

scripts/rabbitmq-env

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,10 @@ rmq_normalize_path_var RABBITMQ_PID_FILE
276276

277277
[ "x" = "x$RABBITMQ_BOOT_MODULE" ] && RABBITMQ_BOOT_MODULE=${BOOT_MODULE}
278278

279+
[ "x" != "x$RABBITMQ_FEATURE_FLAGS_FILE" ] && RABBITMQ_FEATURE_FLAGS_FILE_source=environment
280+
[ "x" = "x$RABBITMQ_FEATURE_FLAGS_FILE" ] && RABBITMQ_FEATURE_FLAGS_FILE=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-feature_flags
281+
rmq_normalize_path_var RABBITMQ_FEATURE_FLAGS_FILE
282+
279283
[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${PLUGINS_EXPAND_DIR}
280284
[ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-plugins-expand
281285
rmq_normalize_path_var RABBITMQ_PLUGINS_EXPAND_DIR
@@ -308,6 +312,7 @@ rmq_check_if_shared_with_mnesia \
308312
RABBITMQ_CONFIG_FILE \
309313
RABBITMQ_LOG_BASE \
310314
RABBITMQ_PID_FILE \
315+
RABBITMQ_FEATURE_FLAGS_FILE \
311316
RABBITMQ_PLUGINS_EXPAND_DIR \
312317
RABBITMQ_ENABLED_PLUGINS_FILE \
313318
RABBITMQ_PLUGINS_DIR \
@@ -318,7 +323,8 @@ rmq_check_if_shared_with_mnesia \
318323

319324
## Development-specific environment.
320325
if [ "${RABBITMQ_DEV_ENV}" ]; then
321-
if [ "$RABBITMQ_PLUGINS_DIR_source" != 'environment' -o \
326+
if [ "$RABBITMQ_FEATURE_FLAGS_FILE_source" != 'environment' -o \
327+
"$RABBITMQ_PLUGINS_DIR_source" != 'environment' -o \
322328
"$RABBITMQ_ENABLED_PLUGINS_FILE_source" != 'environment' ]; then
323329
# We need to query the running node for the plugins directory
324330
# and the "enabled plugins" file.
@@ -338,16 +344,23 @@ if [ "${RABBITMQ_DEV_ENV}" ]; then
338344
esac
339345
done
340346
eval $( (${RABBITMQ_SCRIPTS_DIR}/rabbitmqctl $node_arg eval \
341-
'{ok, P} = application:get_env(rabbit, plugins_dir),
347+
'{ok, F} = application:get_env(rabbit, feature_flags_file),
348+
{ok, P} = application:get_env(rabbit, plugins_dir),
342349
{ok, E} = application:get_env(rabbit, enabled_plugins_file),
343350
B = os:getenv("RABBITMQ_MNESIA_BASE"),
344351
M = os:getenv("RABBITMQ_MNESIA_DIR"),
345352
io:format(
353+
"feature_flags_file=\"~s\"~n"
346354
"plugins_dir=\"~s\"~n"
347355
"enabled_plugins_file=\"~s\"~n"
348356
"mnesia_base=\"~s\"~n"
349-
"mnesia_dir=\"~s\"~n", [P, E, B, M]).' \
350-
2>/dev/null | grep -E '^(plugins_dir|enabled_plugins_file|mnesia_base|mnesia_dir)=') || :)
357+
"mnesia_dir=\"~s\"~n", [F, P, E, B, M]).' \
358+
2>/dev/null | grep -E '^(feature_flags_file|plugins_dir|enabled_plugins_file|mnesia_base|mnesia_dir)=') || :)
359+
360+
if [ "${feature_flags_file}" -a \
361+
"$RABBITMQ_FEATURE_FLAGS_FILE_source" != 'environment' ]; then
362+
RABBITMQ_FEATURE_FLAGS_FILE="${feature_flags_file}"
363+
fi
351364
if [ "${plugins_dir}" -a \
352365
"$RABBITMQ_PLUGINS_DIR_source" != 'environment' ]; then
353366
RABBITMQ_PLUGINS_DIR="${plugins_dir}"

scripts/rabbitmq-env.bat

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,15 @@ if "!RABBITMQ_BOOT_MODULE!"=="" (
275275
)
276276
)
277277

278+
REM [ "x" = "x$RABBITMQ_FEATURE_FLAGS_FILE" ] && RABBITMQ_FEATURE_FLAGS_FILE=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-feature_flags
279+
if "!RABBITMQ_FEATURE_FLAGS_FILE!"=="" (
280+
if "!FEATURE_FLAGS_FILE!"=="" (
281+
set RABBITMQ_FEATURE_FLAGS_FILE=!RABBITMQ_MNESIA_BASE!\!RABBITMQ_NODENAME!-feature_flags
282+
) else (
283+
set RABBITMQ_FEATURE_FLAGS_FILE=!FEATURE_FLAGS_FILE!
284+
)
285+
)
286+
278287
REM [ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${PLUGINS_EXPAND_DIR}
279288
REM [ "x" = "x$RABBITMQ_PLUGINS_EXPAND_DIR" ] && RABBITMQ_PLUGINS_EXPAND_DIR=${RABBITMQ_MNESIA_BASE}/${RABBITMQ_NODENAME}-plugins-expand
280289
if "!RABBITMQ_PLUGINS_EXPAND_DIR!"=="" (
@@ -388,6 +397,13 @@ if defined RABBITMQ_DEV_ENV (
388397
if "!SCRIPT_NAME!" == "rabbitmq-plugins" (
389398
REM We may need to query the running node for the plugins directory
390399
REM and the "enabled plugins" file.
400+
if not "%RABBITMQ_FEATURE_FLAGS_FILE_source%" == "environment" (
401+
for /f "delims=" %%F in ('!SCRIPT_DIR!\rabbitmqctl eval "{ok, P} = application:get_env(rabbit, feature_flags_file), io:format(""~s~n"", [P])."') do @set feature_flags_file=%%F
402+
if exist "!feature_flags_file!" (
403+
set RABBITMQ_FEATURE_FLAGS_FILE=!feature_flags_file!
404+
)
405+
REM set feature_flags_file=
406+
)
391407
if not "%RABBITMQ_PLUGINS_DIR_source%" == "environment" (
392408
for /f "delims=" %%F in ('!SCRIPT_DIR!\rabbitmqctl eval "{ok, P} = application:get_env(rabbit, plugins_dir), io:format(""~s~n"", [P])."') do @set plugins_dir=%%F
393409
if exist "!plugins_dir!" (
@@ -467,6 +483,7 @@ exit /b
467483
REM Environment cleanup
468484
set BOOT_MODULE=
469485
set CONFIG_FILE=
486+
set FEATURE_FLAGS_FILE=
470487
set ENABLED_PLUGINS_FILE=
471488
set LOG_BASE=
472489
set MNESIA_BASE=

scripts/rabbitmq-server

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ RABBITMQ_DIST_PORT=$RABBITMQ_DIST_PORT \
197197
${RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS} \
198198
${RABBITMQ_NAME_TYPE} ${RABBITMQ_PRELAUNCH_NODENAME} \
199199
-conf_advanced "${RABBITMQ_ADVANCED_CONFIG_FILE}" \
200+
-rabbit feature_flags_file "\"$RABBITMQ_FEATURE_FLAGS_FILE\"" \
200201
-rabbit enabled_plugins_file "\"$RABBITMQ_ENABLED_PLUGINS_FILE\"" \
201202
-rabbit plugins_dir "\"$RABBITMQ_PLUGINS_DIR\"" \
202203
-extra "${RABBITMQ_NODENAME}"
@@ -304,6 +305,7 @@ start_rabbitmq_server() {
304305
-rabbit lager_log_root "\"$RABBITMQ_LOG_BASE\"" \
305306
-rabbit lager_default_file "$RABBIT_LAGER_HANDLER" \
306307
-rabbit lager_upgrade_file "$RABBITMQ_LAGER_HANDLER_UPGRADE" \
308+
-rabbit feature_flags_file "\"$RABBITMQ_FEATURE_FLAGS_FILE\"" \
307309
-rabbit enabled_plugins_file "\"$RABBITMQ_ENABLED_PLUGINS_FILE\"" \
308310
-rabbit plugins_dir "\"$RABBITMQ_PLUGINS_DIR\"" \
309311
-rabbit plugins_expand_dir "\"$RABBITMQ_PLUGINS_EXPAND_DIR\"" \

scripts/rabbitmq-server.bat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ if "!RABBITMQ_CONFIG_FILE_NOEX!.conf" == "!RABBITMQ_CONFIG_FILE!" (
149149
-s rabbit_prelaunch ^
150150
!RABBITMQ_NAME_TYPE! rabbitmqprelaunch!RANDOM!!TIME:~9!@localhost ^
151151
-conf_advanced "!RABBITMQ_ADVANCED_CONFIG_FILE!" ^
152+
-rabbit feature_flags_file "!RABBITMQ_FEATURE_FLAGS_FILE!" ^
152153
-rabbit enabled_plugins_file "!RABBITMQ_ENABLED_PLUGINS_FILE!" ^
153154
-rabbit plugins_dir "!RABBITMQ_PLUGINS_DIR!" ^
154155
-extra "!RABBITMQ_NODENAME!"
@@ -250,6 +251,7 @@ if "!ENV_OK!"=="false" (
250251
-rabbit lager_log_root \""!RABBITMQ_LOG_BASE:\=/!"\" ^
251252
-rabbit lager_default_file !RABBIT_LAGER_HANDLER! ^
252253
-rabbit lager_upgrade_file !RABBITMQ_LAGER_HANDLER_UPGRADE! ^
254+
-rabbit feature_flags_file \""!RABBITMQ_FEATURE_FLAGS_FILE:\=/!"\" ^
253255
-rabbit enabled_plugins_file \""!RABBITMQ_ENABLED_PLUGINS_FILE:\=/!"\" ^
254256
-rabbit plugins_dir \""!RABBITMQ_PLUGINS_DIR:\=/!"\" ^
255257
-rabbit plugins_expand_dir \""!RABBITMQ_PLUGINS_EXPAND_DIR:\=/!"\" ^

scripts/rabbitmq-service.bat

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@ if "!RABBITMQ_CONFIG_FILE_NOEX!.conf" == "!RABBITMQ_CONFIG_FILE!" (
232232
-s rabbit_prelaunch ^
233233
!RABBITMQ_NAME_TYPE! rabbitmqprelaunch!RANDOM!!TIME:~9!@localhost ^
234234
-conf_advanced "!RABBITMQ_ADVANCED_CONFIG_FILE!" ^
235+
-rabbit feature_flags_file "!RABBITMQ_FEATURE_FLAGS_FILE!" ^
235236
-rabbit enabled_plugins_file "!RABBITMQ_ENABLED_PLUGINS_FILE!" ^
236237
-rabbit plugins_dir "!RABBITMQ_PLUGINS_DIR!" ^
237238
-extra "!RABBITMQ_NODENAME!"
@@ -323,6 +324,7 @@ set ERLANG_SERVICE_ARGUMENTS= ^
323324
-rabbit lager_log_root \""!RABBITMQ_LOG_BASE:\=/!"\" ^
324325
-rabbit lager_default_file !RABBIT_LAGER_HANDLER! ^
325326
-rabbit lager_upgrade_file !RABBITMQ_LAGER_HANDLER_UPGRADE! ^
327+
-rabbit feature_flags_file \""!RABBITMQ_FEATURE_FLAGS_FILE:\=/!"\" ^
326328
-rabbit enabled_plugins_file \""!RABBITMQ_ENABLED_PLUGINS_FILE:\=/!"\" ^
327329
-rabbit plugins_dir \""!RABBITMQ_PLUGINS_DIR:\=/!"\" ^
328330
-rabbit plugins_expand_dir \""!RABBITMQ_PLUGINS_EXPAND_DIR:\=/!"\" ^

src/rabbit.erl

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@
6363
{requires, pre_boot},
6464
{enables, external_infrastructure}]}).
6565

66+
-rabbit_boot_step({feature_flags,
67+
[{description, "feature flags registry and initial state"},
68+
{mfa, {rabbit_feature_flags, init, []}},
69+
{requires, pre_boot},
70+
{enables, external_infrastructure}]}).
71+
6672
-rabbit_boot_step({database,
6773
[{mfa, {rabbit_mnesia, init, []}},
6874
{requires, file_handle_cache},
@@ -314,9 +320,11 @@ start() ->
314320
HipeResult = rabbit_hipe:maybe_hipe_compile(),
315321
ok = start_logger(),
316322
rabbit_hipe:log_hipe_result(HipeResult),
323+
Apps = load_all_apps(),
324+
rabbit_feature_flags:initialize_registry(),
317325
rabbit_node_monitor:prepare_cluster_status_files(),
318326
rabbit_mnesia:check_cluster_consistency(),
319-
broker_start()
327+
broker_start(Apps)
320328
end).
321329

322330
boot() ->
@@ -326,13 +334,15 @@ boot() ->
326334
HipeResult = rabbit_hipe:maybe_hipe_compile(),
327335
ok = start_logger(),
328336
rabbit_hipe:log_hipe_result(HipeResult),
337+
Apps = load_all_apps(),
338+
rabbit_feature_flags:initialize_registry(),
329339
rabbit_node_monitor:prepare_cluster_status_files(),
330340
ok = rabbit_upgrade:maybe_upgrade_mnesia(),
331341
%% It's important that the consistency check happens after
332342
%% the upgrade, since if we are a secondary node the
333343
%% primary node will have forgotten us
334344
rabbit_mnesia:check_cluster_consistency(),
335-
broker_start()
345+
broker_start(Apps)
336346
end).
337347

338348
ensure_config() ->
@@ -347,11 +357,14 @@ ensure_config() ->
347357
ok -> ok
348358
end.
349359

350-
351-
broker_start() ->
360+
load_all_apps() ->
352361
Plugins = rabbit_plugins:setup(),
353362
ToBeLoaded = Plugins ++ ?APPS,
354-
start_apps(ToBeLoaded),
363+
app_utils:load_applications(ToBeLoaded),
364+
ToBeLoaded.
365+
366+
broker_start(Apps) ->
367+
start_loaded_apps(Apps),
355368
maybe_sd_notify(),
356369
ok = rabbit_lager:broker_is_started(),
357370
ok = log_broker_started(rabbit_plugins:strictly_plugins(rabbit_plugins:active())).
@@ -533,6 +546,13 @@ start_apps(Apps) ->
533546

534547
start_apps(Apps, RestartTypes) ->
535548
app_utils:load_applications(Apps),
549+
ok = rabbit_feature_flags:refresh_feature_flags_after_app_load(Apps),
550+
start_loaded_apps(Apps, RestartTypes).
551+
552+
start_loaded_apps(Apps) ->
553+
start_loaded_apps(Apps, #{}).
554+
555+
start_loaded_apps(Apps, RestartTypes) ->
536556
ensure_sysmon_handler_app_config(),
537557
ConfigEntryDecoder = case application:get_env(rabbit, config_entry_decoder) of
538558
undefined ->

0 commit comments

Comments
 (0)