LocalBinaryCacheStore::upsertFile(): Fix race
When multiple threads try to upsert the same file, this could fail. Fixes #4667.
This commit is contained in:
parent
4638bcfb2c
commit
dd77f71afe
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue