diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2010-11-10 16:28:36 +0000 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2010-11-10 16:28:36 +0000 |
commit | d4426ec85bba84c87c9b21d1703b612e08d24ab3 (patch) | |
tree | f14c8136deb64b09cb413c09107be72cd7a12526 | |
parent | 805b31a78e8d97e705458a51566c2b83c36710a2 (diff) | |
download | rabbitmq-server-d4426ec85bba84c87c9b21d1703b612e08d24ab3.tar.gz |
Prevent a very difficult-to-trigger race.
-rw-r--r-- | src/rabbit_upgrade.erl | 9 |
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) |