summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2020-03-19 12:44:02 +0100
committerJean-Sébastien Pédron <jean-sebastien@rabbitmq.com>2020-03-19 18:41:56 +0100
commit2bd71325ce32b7ae31c2954f56e06da793a8a285 (patch)
tree581b8c95fec7e8f3ed4bd7e744fb4c492ca1879a /src
parente9547d3eaf6f8fddbc1f8bebfe93eb0b3d804d3b (diff)
downloadrabbitmq-server-git-2bd71325ce32b7ae31c2954f56e06da793a8a285.tar.gz
rabbit_feature_flags: Wait for old registry to be purged
... before deleting it and load the new code. In some rare cases, the soft purge didn't work because another process was running the old code. Thus the delete would fail. Now, we wait for the soft purge to succeed before proceeding.
Diffstat (limited to 'src')
-rw-r--r--src/rabbit_feature_flags.erl16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/rabbit_feature_flags.erl b/src/rabbit_feature_flags.erl
index db13b7347e..de9dae2c9f 100644
--- a/src/rabbit_feature_flags.erl
+++ b/src/rabbit_feature_flags.erl
@@ -1255,8 +1255,8 @@ load_registry_mod(Mod, Bin) ->
%% Time to load the new registry, replacing the old one. We use a
%% lock here to synchronize concurrent reloads.
global:set_lock(?FF_REGISTRY_LOADING_LOCK, [node()]),
- _ = code:soft_purge(Mod),
- _ = code:delete(Mod),
+ ok = purge_old_registry(Mod),
+ true = code:delete(Mod),
Ret = code:load_binary(Mod, FakeFilename, Bin),
global:del_lock(?FF_REGISTRY_LOADING_LOCK, [node()]),
case Ret of
@@ -1271,6 +1271,18 @@ load_registry_mod(Mod, Bin) ->
throw({feature_flag_registry_reload_failure, Reason})
end.
+purge_old_registry(Mod) ->
+ case code:is_loaded(Mod) of
+ {file, _} -> do_purge_old_registry(Mod);
+ false -> ok
+ end.
+
+do_purge_old_registry(Mod) ->
+ case code:soft_purge(Mod) of
+ true -> ok;
+ false -> do_purge_old_registry(Mod)
+ end.
+
%% -------------------------------------------------------------------
%% Feature flags state storage.
%% -------------------------------------------------------------------