From 11d7c80370a01e96bceb9dbe5124d3e91c841c7d Mon Sep 17 00:00:00 2001
From: Philip Wilk
Date: Sat, 6 Sep 2025 12:00:02 +0100
Subject: [PATCH] bugfix/3514: do not throw on substituter errors if other
substituters are still enabled
---
src/libstore/build/substitution-goal.cc | 25 +++++++++++++++----------
src/libstore/store-api.cc | 25 ++++++++++++++++---------
2 files changed, 31 insertions(+), 19 deletions(-)
diff --git a/src/libstore/build/substitution-goal.cc b/src/libstore/build/substitution-goal.cc
index ab95ea4a2..d219834f2 100644
--- a/src/libstore/build/substitution-goal.cc
+++ b/src/libstore/build/substitution-goal.cc
@@ -55,9 +55,14 @@ Goal::Co PathSubstitutionGoal::init()
auto subs = settings.useSubstitutes ? getDefaultSubstituters() : std::list[>();
bool substituterFailed = false;
+ std::optional lastStoresException = std::nullopt;
for (const auto & sub : subs) {
trace("trying next substituter");
+ if (lastStoresException.has_value()) {
+ logError(lastStoresException->info());
+ lastStoresException.reset();
+ }
cleanup();
@@ -80,19 +85,13 @@ Goal::Co PathSubstitutionGoal::init()
try {
// FIXME: make async
info = sub->queryPathInfo(subPath ? *subPath : storePath);
- } catch (InvalidPath &) {
+ } catch (InvalidPath & e) {
continue;
} catch (SubstituterDisabled & e) {
- if (settings.tryFallback)
- continue;
- else
- throw e;
+ continue;
} catch (Error & e) {
- if (settings.tryFallback) {
- logError(e.info());
- continue;
- } else
- throw e;
+ lastStoresException = std::make_optional(std::move(e));
+ continue;
}
if (info->path != storePath) {
@@ -156,6 +155,12 @@ Goal::Co PathSubstitutionGoal::init()
worker.failedSubstitutions++;
worker.updateProgress();
}
+ if (lastStoresException.has_value()) {
+ if (!settings.tryFallback) {
+ throw *lastStoresException;
+ } else
+ logError(lastStoresException->info());
+ }
/* Hack: don't indicate failure if there were no substituters.
In that case the calling derivation should just do a
diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc
index d96be5965..a2fa7af2f 100644
--- a/src/libstore/store-api.cc
+++ b/src/libstore/store-api.cc
@@ -1,3 +1,4 @@
+#include "nix/util/logging.hh"
#include "nix/util/signature/local-keys.hh"
#include "nix/util/source-accessor.hh"
#include "nix/store/globals.hh"
@@ -392,11 +393,14 @@ void Store::querySubstitutablePathInfos(const StorePathCAMap & paths, Substituta
{
if (!settings.useSubstitutes)
return;
- for (auto & sub : getDefaultSubstituters()) {
- for (auto & path : paths) {
- if (infos.count(path.first))
- // Choose first succeeding substituter.
- continue;
+
+ for (auto & path : paths) {
+ std::optional lastStoresException = std::nullopt;
+ for (auto & sub : getDefaultSubstituters()) {
+ if (lastStoresException.has_value()) {
+ logError(lastStoresException->info());
+ lastStoresException.reset();
+ }
auto subPath(path.first);
@@ -437,12 +441,15 @@ void Store::querySubstitutablePathInfos(const StorePathCAMap & paths, Substituta
} catch (InvalidPath &) {
} catch (SubstituterDisabled &) {
} catch (Error & e) {
- if (settings.tryFallback)
- logError(e.info());
- else
- throw;
+ lastStoresException = std::make_optional(std::move(e));
}
}
+ if (lastStoresException.has_value()) {
+ if (!settings.tryFallback) {
+ throw *lastStoresException;
+ } else
+ logError(lastStoresException->info());
+ }
}
}
]