summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon MacMullen <simon@rabbitmq.com>2010-11-10 16:28:36 +0000
committerSimon MacMullen <simon@rabbitmq.com>2010-11-10 16:28:36 +0000
commitcde3d07e1bc1c73f80e10e4b0108527cb1dac22b (patch)
treef14c8136deb64b09cb413c09107be72cd7a12526
parent81acdf83959c74ebcd30cbf1e775533dd3df543e (diff)
downloadrabbitmq-server-git-cde3d07e1bc1c73f80e10e4b0108527cb1dac22b.tar.gz
Prevent a very difficult-to-trigger race.
-rw-r--r--src/rabbit_upgrade.erl9
1 files changed, 4 insertions, 5 deletions
diff --git a/src/rabbit_upgrade.erl b/src/rabbit_upgrade.erl
index 481c53e725..57fe7f632a 100644
--- a/src/rabbit_upgrade.erl
+++ b/src/rabbit_upgrade.erl
@@ -122,16 +122,15 @@ heads(G) ->
apply_upgrades(Upgrades) ->
LockFile = lock_filename(),
- case file:read_file_info(LockFile) of
- {error, enoent} ->
- info("Upgrades: ~w to apply~n", [length(Upgrades)]),
- {ok, Lock} = file:open(LockFile, [write]),
+ case file:open(LockFile, [write, exclusive]) of
+ {ok, Lock} ->
ok = file:close(Lock),
+ info("Upgrades: ~w to apply~n", [length(Upgrades)]),
[apply_upgrade(Upgrade) || Upgrade <- Upgrades],
info("Upgrades: All applied~n", []),
ok = write_version(),
ok = file:delete(LockFile);
- {ok, _FI} ->
+ {error, eexist} ->
exit(previous_upgrade_failed);
{error, _} = Error ->
exit(Error)