resync hydra with upstream #4
@ -2,6 +2,7 @@
|
|||||||
#include "hydra-build-result.hh"
|
#include "hydra-build-result.hh"
|
||||||
#include <nix/store/globals.hh>
|
#include <nix/store/globals.hh>
|
||||||
#include <nix/store/parsed-derivations.hh>
|
#include <nix/store/parsed-derivations.hh>
|
||||||
|
#include <nix/util/thread-pool.hh>
|
||||||
|
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
@ -404,6 +405,34 @@ void State::processQueueChange(Connection & conn)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
std::map<DrvOutput, std::optional<StorePath>> State::getMissingRemotePaths(
|
||||||
|
ref<Store> destStore,
|
||||||
|
const std::map<DrvOutput, std::optional<StorePath>> & paths)
|
||||||
|
{
|
||||||
|
Sync<std::map<DrvOutput, std::optional<StorePath>>> missing_;
|
||||||
|
ThreadPool tp;
|
||||||
|
|
||||||
|
for (auto & [output, maybeOutputPath] : paths) {
|
||||||
|
if (!maybeOutputPath) {
|
||||||
|
auto missing(missing_.lock());
|
||||||
|
missing->insert({output, maybeOutputPath});
|
||||||
|
} else {
|
||||||
|
tp.enqueue([&] {
|
||||||
|
if (!destStore->isValidPath(*maybeOutputPath)) {
|
||||||
|
auto missing(missing_.lock());
|
||||||
|
missing->insert({output, maybeOutputPath});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tp.process();
|
||||||
|
|
||||||
|
auto missing(missing_.lock());
|
||||||
|
return *missing;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Step::ptr State::createStep(ref<Store> destStore,
|
Step::ptr State::createStep(ref<Store> destStore,
|
||||||
Connection & conn, Build::ptr build, const StorePath & drvPath,
|
Connection & conn, Build::ptr build, const StorePath & drvPath,
|
||||||
Build::ptr referringBuild, Step::ptr referringStep, std::set<StorePath> & finishedDrvs,
|
Build::ptr referringBuild, Step::ptr referringStep, std::set<StorePath> & finishedDrvs,
|
||||||
@ -487,16 +516,15 @@ Step::ptr State::createStep(ref<Store> destStore,
|
|||||||
|
|
||||||
/* Are all outputs valid? */
|
/* Are all outputs valid? */
|
||||||
auto outputHashes = staticOutputHashes(*localStore, *(step->drv));
|
auto outputHashes = staticOutputHashes(*localStore, *(step->drv));
|
||||||
bool valid = true;
|
std::map<DrvOutput, std::optional<StorePath>> paths;
|
||||||
std::map<DrvOutput, std::optional<StorePath>> missing;
|
|
||||||
for (auto & [outputName, maybeOutputPath] : destStore->queryPartialDerivationOutputMap(drvPath, &*localStore)) {
|
for (auto & [outputName, maybeOutputPath] : destStore->queryPartialDerivationOutputMap(drvPath, &*localStore)) {
|
||||||
auto outputHash = outputHashes.at(outputName);
|
auto outputHash = outputHashes.at(outputName);
|
||||||
if (maybeOutputPath && destStore->isValidPath(*maybeOutputPath))
|
paths.insert({{outputHash, outputName}, maybeOutputPath});
|
||||||
continue;
|
|
||||||
valid = false;
|
|
||||||
missing.insert({{outputHash, outputName}, maybeOutputPath});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto missing = getMissingRemotePaths(destStore, paths);
|
||||||
|
bool valid = missing.empty();
|
||||||
|
|
||||||
/* Try to copy the missing paths from the local store or from
|
/* Try to copy the missing paths from the local store or from
|
||||||
substitutes. */
|
substitutes. */
|
||||||
if (!missing.empty()) {
|
if (!missing.empty()) {
|
||||||
|
@ -514,6 +514,12 @@ private:
|
|||||||
BuildOutput getBuildOutputCached(Connection & conn, nix::ref<nix::Store> destStore,
|
BuildOutput getBuildOutputCached(Connection & conn, nix::ref<nix::Store> destStore,
|
||||||
const nix::StorePath & drvPath);
|
const nix::StorePath & drvPath);
|
||||||
|
|
||||||
|
/* Returns paths missing from the remote store. Paths are processed in
|
||||||
|
* parallel to work around the possible latency of remote stores. */
|
||||||
|
std::map<nix::DrvOutput, std::optional<nix::StorePath>> getMissingRemotePaths(
|
||||||
|
nix::ref<nix::Store> destStore,
|
||||||
|
const std::map<nix::DrvOutput, std::optional<nix::StorePath>> & paths);
|
||||||
|
|
||||||
Step::ptr createStep(nix::ref<nix::Store> store,
|
Step::ptr createStep(nix::ref<nix::Store> store,
|
||||||
Connection & conn, Build::ptr build, const nix::StorePath & drvPath,
|
Connection & conn, Build::ptr build, const nix::StorePath & drvPath,
|
||||||
Build::ptr referringBuild, Step::ptr referringStep, std::set<nix::StorePath> & finishedDrvs,
|
Build::ptr referringBuild, Step::ptr referringStep, std::set<nix::StorePath> & finishedDrvs,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user