From 8e8caf7f3e535d4e397f422f6c0effd81f497305 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 11 Jul 2017 23:11:35 +0200 Subject: [PATCH] fetchTarball: Prevent concurrent downloads of the same file Fixes #849. --- src/libstore/download.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/libstore/download.cc b/src/libstore/download.cc index 15eb68c69..ac9a2b8fe 100644 --- a/src/libstore/download.cc +++ b/src/libstore/download.cc @@ -6,6 +6,7 @@ #include "archive.hh" #include "s3.hh" #include "compression.hh" +#include "pathlocks.hh" #ifdef ENABLE_S3 #include @@ -586,6 +587,8 @@ Path Downloader::downloadCached(ref store, const string & url_, bool unpa Path dataFile = cacheDir + "/" + urlHash + ".info"; Path fileLink = cacheDir + "/" + urlHash + "-file"; + PathLocks lock({fileLink}, fmt("waiting for lock on ‘%1%’...", fileLink)); + Path storePath; string expectedETag; @@ -647,6 +650,7 @@ Path Downloader::downloadCached(ref store, const string & url_, bool unpa if (unpack) { Path unpackedLink = cacheDir + "/" + baseNameOf(storePath) + "-unpacked"; + PathLocks lock2({unpackedLink}, fmt("waiting for lock on ‘%1%’...", unpackedLink)); Path unpackedStorePath; if (pathExists(unpackedLink)) { unpackedStorePath = readLink(unpackedLink);