From 298db5d1cdbbd3198b8b08ae63fcea7c701cac22 Mon Sep 17 00:00:00 2001 From: eldritch horrors Date: Mon, 4 Mar 2024 08:16:28 +0100 Subject: [PATCH] Merge pull request #9804 from edolstra/missing-nar-crash Fix crash when NAR is missing from binary cache (cherry picked from commit 3b20cca9625a1701a10a883735e7315185629563) Change-Id: I50ff18f4a6de69c323473b4a8e3e098d1f365145 --- src/libstore/build/worker.cc | 2 +- src/libstore/local-store.cc | 6 +++++- src/libstore/store-api.cc | 5 +++++ 3 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/libstore/build/worker.cc b/src/libstore/build/worker.cc index 850df5f1e..d6bcba3ff 100644 --- a/src/libstore/build/worker.cc +++ b/src/libstore/build/worker.cc @@ -250,7 +250,7 @@ void Worker::childTerminated(Goal * goal, bool wakeSleepers) void Worker::waitForBuildSlot(GoalPtr goal) { - debug("wait for build slot"); + goal->trace("wait for build slot"); bool isSubstitutionGoal = goal->jobCategory() == JobCategory::Substitution; if ((!isSubstitutionGoal && getNrLocalBuilds() < settings.maxBuildJobs) || (isSubstitutionGoal && getNrSubstitutions() < settings.maxSubstitutionJobs)) diff --git a/src/libstore/local-store.cc b/src/libstore/local-store.cc index 554e13e3d..78ca79c89 100644 --- a/src/libstore/local-store.cc +++ b/src/libstore/local-store.cc @@ -1203,7 +1203,11 @@ void LocalStore::addToStore(const ValidPathInfo & info, Source & source, Finally cleanup = [&]() { if (!narRead) { ParseSink sink; - parseDump(sink, source); + try { + parseDump(sink, source); + } catch (...) { + ignoreException(); + } } }; diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index 958691256..b787ac2f2 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -1069,6 +1069,11 @@ void copyStorePath( RepairFlag repair, CheckSigsFlag checkSigs) { + /* Bail out early (before starting a download from srcStore) if + dstStore already has this path. */ + if (!repair && dstStore.isValidPath(storePath)) + return; + auto srcUri = srcStore.getUri(); auto dstUri = dstStore.getUri(); auto storePathS = srcStore.printStorePath(storePath);