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 | cde3d07e1bc1c73f80e10e4b0108527cb1dac22b (patch) | |
| tree | f14c8136deb64b09cb413c09107be72cd7a12526 | |
| parent | 81acdf83959c74ebcd30cbf1e775533dd3df543e (diff) | |
| download | rabbitmq-server-git-cde3d07e1bc1c73f80e10e4b0108527cb1dac22b.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 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) |
