summaryrefslogtreecommitdiff
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
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.
-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.
%% -------------------------------------------------------------------