mirror of
https://github.com/NixOS/nix.git
synced 2025-11-15 23:12:44 +01:00
Fix the detection of already built drv outputs
PRs #4370 and #4348 had a bad interaction in that the second broke the fist one in a not trivial way. The issue was that since #4348 the logic for detecting whether a derivation output is already built requires some logic that was specific to the `LocalStore`. It happens though that most of this logic could be upstreamed to any `Store`, which is what this commit does.
This commit is contained in:
parent
ae3c3e3bb2
commit
4d45839499
6 changed files with 78 additions and 53 deletions
|
|
@ -877,35 +877,9 @@ StorePathSet LocalStore::queryValidDerivers(const StorePath & path)
|
|||
});
|
||||
}
|
||||
|
||||
// Try to resolve the derivation at path `original`, with a caching layer
|
||||
// to make it more efficient
|
||||
std::optional<Derivation> cachedResolve(
|
||||
LocalStore& store,
|
||||
const StorePath& original)
|
||||
{
|
||||
// This is quite dirty and leaky, but will disappear once #4340 is merged
|
||||
static Sync<std::map<StorePath, std::optional<Derivation>>> resolutionsCache;
|
||||
{
|
||||
auto resolutions = resolutionsCache.lock();
|
||||
auto resolvedDrvIter = resolutions->find(original);
|
||||
if (resolvedDrvIter != resolutions->end()) {
|
||||
auto & [_, resolvedDrv] = *resolvedDrvIter;
|
||||
return *resolvedDrv;
|
||||
}
|
||||
}
|
||||
|
||||
/* Try resolve drv and use that path instead. */
|
||||
auto drv = store.readDerivation(original);
|
||||
auto attempt = drv.tryResolve(store);
|
||||
if (!attempt)
|
||||
return std::nullopt;
|
||||
/* Store in memo table. */
|
||||
resolutionsCache.lock()->insert_or_assign(original, *attempt);
|
||||
return *attempt;
|
||||
}
|
||||
|
||||
std::map<std::string, std::optional<StorePath>>
|
||||
LocalStore::queryPartialDerivationOutputMap(const StorePath& path_)
|
||||
LocalStore::queryDerivationOutputMapNoResolve(const StorePath& path_)
|
||||
{
|
||||
auto path = path_;
|
||||
auto outputs = retrySQLite<std::map<std::string, std::optional<StorePath>>>([&]() {
|
||||
|
|
@ -924,20 +898,9 @@ LocalStore::queryPartialDerivationOutputMap(const StorePath& path_)
|
|||
if (!settings.isExperimentalFeatureEnabled("ca-derivations"))
|
||||
return outputs;
|
||||
|
||||
auto drv = readDerivation(path);
|
||||
|
||||
auto resolvedDrv = cachedResolve(*this, path);
|
||||
|
||||
if (!resolvedDrv) {
|
||||
for (auto& [outputName, _] : drv.outputsAndOptPaths(*this)) {
|
||||
if (!outputs.count(outputName))
|
||||
outputs.emplace(outputName, std::nullopt);
|
||||
}
|
||||
return outputs;
|
||||
}
|
||||
|
||||
auto resolvedDrvHashes = staticOutputHashes(*this, *resolvedDrv);
|
||||
for (auto& [outputName, hash] : resolvedDrvHashes) {
|
||||
auto drv = readInvalidDerivation(path);
|
||||
auto drvHashes = staticOutputHashes(*this, drv);
|
||||
for (auto& [outputName, hash] : drvHashes) {
|
||||
auto realisation = queryRealisation(DrvOutput{hash, outputName});
|
||||
if (realisation)
|
||||
outputs.insert_or_assign(outputName, realisation->outPath);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue