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
commitd4426ec85bba84c87c9b21d1703b612e08d24ab3 (patch)
treef14c8136deb64b09cb413c09107be72cd7a12526
parent805b31a78e8d97e705458a51566c2b83c36710a2 (diff)
downloadrabbitmq-server-d4426ec85bba84c87c9b21d1703b612e08d24ab3.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 481c53e7..57fe7f63 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)