1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-12-22 17:01:08 +01:00

bugfix/3514: do not throw on substituter errors if other substituters are still enabled

This commit is contained in:
Philip Wilk 2025-09-06 12:00:02 +01:00
parent 49e9c14e2f
commit 11d7c80370
No known key found for this signature in database
2 changed files with 31 additions and 19 deletions

View file

@ -55,9 +55,14 @@ Goal::Co PathSubstitutionGoal::init()
auto subs = settings.useSubstitutes ? getDefaultSubstituters() : std::list<ref<Store>>(); auto subs = settings.useSubstitutes ? getDefaultSubstituters() : std::list<ref<Store>>();
bool substituterFailed = false; bool substituterFailed = false;
std::optional<Error> lastStoresException = std::nullopt;
for (const auto & sub : subs) { for (const auto & sub : subs) {
trace("trying next substituter"); trace("trying next substituter");
if (lastStoresException.has_value()) {
logError(lastStoresException->info());
lastStoresException.reset();
}
cleanup(); cleanup();
@ -80,19 +85,13 @@ Goal::Co PathSubstitutionGoal::init()
try { try {
// FIXME: make async // FIXME: make async
info = sub->queryPathInfo(subPath ? *subPath : storePath); info = sub->queryPathInfo(subPath ? *subPath : storePath);
} catch (InvalidPath &) { } catch (InvalidPath & e) {
continue; continue;
} catch (SubstituterDisabled & e) { } catch (SubstituterDisabled & e) {
if (settings.tryFallback)
continue; continue;
else
throw e;
} catch (Error & e) { } catch (Error & e) {
if (settings.tryFallback) { lastStoresException = std::make_optional(std::move(e));
logError(e.info());
continue; continue;
} else
throw e;
} }
if (info->path != storePath) { if (info->path != storePath) {
@ -156,6 +155,12 @@ Goal::Co PathSubstitutionGoal::init()
worker.failedSubstitutions++; worker.failedSubstitutions++;
worker.updateProgress(); 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. /* Hack: don't indicate failure if there were no substituters.
In that case the calling derivation should just do a In that case the calling derivation should just do a

View file

@ -1,3 +1,4 @@
#include "nix/util/logging.hh"
#include "nix/util/signature/local-keys.hh" #include "nix/util/signature/local-keys.hh"
#include "nix/util/source-accessor.hh" #include "nix/util/source-accessor.hh"
#include "nix/store/globals.hh" #include "nix/store/globals.hh"
@ -392,11 +393,14 @@ void Store::querySubstitutablePathInfos(const StorePathCAMap & paths, Substituta
{ {
if (!settings.useSubstitutes) if (!settings.useSubstitutes)
return; return;
for (auto & sub : getDefaultSubstituters()) {
for (auto & path : paths) { for (auto & path : paths) {
if (infos.count(path.first)) std::optional<Error> lastStoresException = std::nullopt;
// Choose first succeeding substituter. for (auto & sub : getDefaultSubstituters()) {
continue; if (lastStoresException.has_value()) {
logError(lastStoresException->info());
lastStoresException.reset();
}
auto subPath(path.first); auto subPath(path.first);
@ -437,12 +441,15 @@ void Store::querySubstitutablePathInfos(const StorePathCAMap & paths, Substituta
} catch (InvalidPath &) { } catch (InvalidPath &) {
} catch (SubstituterDisabled &) { } catch (SubstituterDisabled &) {
} catch (Error & e) { } catch (Error & e) {
if (settings.tryFallback) lastStoresException = std::make_optional(std::move(e));
logError(e.info());
else
throw;
} }
} }
if (lastStoresException.has_value()) {
if (!settings.tryFallback) {
throw *lastStoresException;
} else
logError(lastStoresException->info());
}
} }
} }