Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit a8347b2

Browse files
Use a persistent term in rabbit_federation_app_state
This avoids a classic deadlock in Erlang: when an application_controller (AC) invokes a callback, such as pre_stop/1, the function invoked cannot use any OTP functions that would ultimately require an AC response. application:set_env/2 is one of such functions, so with this commit we switch to a persistent term.
1 parent adc25bb commit a8347b2

2 files changed

Lines changed: 11 additions & 7 deletions

File tree

deps/rabbitmq_federation_common/src/rabbit_federation_app_state.erl

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,24 @@
77

88
%% Tracks transient application state for federation plugins.
99
%% Used to prevent link restarts during node shutdown.
10+
%%
11+
%% Uses persistent_term for storage because prep_stop/1 is called by the
12+
%% application_controller, and application:set_env/3 would deadlock.
1013
-module(rabbit_federation_app_state).
1114

1215
-export([is_shutting_down/0, mark_as_shutting_down/0, reset_shutting_down_marker/0]).
1316

14-
-define(APP, rabbitmq_federation_common).
17+
-define(KEY, {?MODULE, shutting_down}).
1518

1619
-spec is_shutting_down() -> boolean().
1720
is_shutting_down() ->
18-
application:get_env(?APP, shutting_down, false).
21+
persistent_term:get(?KEY, false).
1922

2023
-spec mark_as_shutting_down() -> ok.
2124
mark_as_shutting_down() ->
22-
application:set_env(?APP, shutting_down, true).
25+
persistent_term:put(?KEY, true).
2326

2427
-spec reset_shutting_down_marker() -> ok.
2528
reset_shutting_down_marker() ->
26-
application:unset_env(?APP, shutting_down).
29+
_ = persistent_term:erase(?KEY),
30+
ok.

deps/rabbitmq_federation_common/test/unit_SUITE.erl

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,16 @@ obfuscate_upstream_params_network_with_char_list_password_value(_Config) ->
6868
ok.
6969

7070
shutdown_flag_defaults_to_false(_Config) ->
71-
application:unset_env(rabbitmq_federation_common, shutting_down),
71+
ok = rabbit_federation_app_state:reset_shutting_down_marker(),
7272
?assertEqual(false, rabbit_federation_app_state:is_shutting_down()),
7373
ok.
7474

7575
shutdown_flag_can_be_set(_Config) ->
76-
application:unset_env(rabbitmq_federation_common, shutting_down),
76+
ok = rabbit_federation_app_state:reset_shutting_down_marker(),
7777
?assertEqual(false, rabbit_federation_app_state:is_shutting_down()),
7878
ok = rabbit_federation_app_state:mark_as_shutting_down(),
7979
?assertEqual(true, rabbit_federation_app_state:is_shutting_down()),
80-
application:unset_env(rabbitmq_federation_common, shutting_down),
80+
ok = rabbit_federation_app_state:reset_shutting_down_marker(),
8181
ok.
8282

8383
shutdown_flag_can_be_cleared(_Config) ->

0 commit comments

Comments
 (0)