LocalBinaryCacheStore::upsertFile(): Fix race

When multiple threads try to upsert the same file, this could fail.

Fixes #4667.
This commit is contained in:
Eelco Dolstra 2021-03-26 17:10:15 +01:00
parent 4638bcfb2c
commit dd77f71afe
2 changed files with 7 additions and 1 deletions

View file

@ -2,6 +2,8 @@
#include "globals.hh" #include "globals.hh"
#include "nar-info-disk-cache.hh" #include "nar-info-disk-cache.hh"
#include <atomic>
namespace nix { namespace nix {
struct LocalBinaryCacheStoreConfig : virtual BinaryCacheStoreConfig struct LocalBinaryCacheStoreConfig : virtual BinaryCacheStoreConfig
@ -50,7 +52,8 @@ protected:
const std::string & mimeType) override const std::string & mimeType) override
{ {
auto path2 = binaryCacheDir + "/" + path; auto path2 = binaryCacheDir + "/" + path;
Path tmp = path2 + ".tmp." + std::to_string(getpid()); static std::atomic<int> counter{0};
Path tmp = fmt("%s.tmp.%d.%d", path2, getpid(), ++counter);
AutoDelete del(tmp, false); AutoDelete del(tmp, false);
StreamToSourceAdapter source(istream); StreamToSourceAdapter source(istream);
writeFile(tmp, source); writeFile(tmp, source);

View file

@ -6,6 +6,8 @@ source common.sh
sed -i 's/experimental-features .*/& ca-derivations ca-references/' "$NIX_CONF_DIR"/nix.conf sed -i 's/experimental-features .*/& ca-derivations ca-references/' "$NIX_CONF_DIR"/nix.conf
rm -rf $TEST_ROOT/binary_cache
export REMOTE_STORE=file://$TEST_ROOT/binary_cache export REMOTE_STORE=file://$TEST_ROOT/binary_cache
buildDrvs () { buildDrvs () {
@ -13,6 +15,7 @@ buildDrvs () {
} }
# Populate the remote cache # Populate the remote cache
clearStore
buildDrvs --post-build-hook ../push-to-store.sh buildDrvs --post-build-hook ../push-to-store.sh
# Restart the build on an empty store, ensuring that we don't build # Restart the build on an empty store, ensuring that we don't build