Skip to content

Commit

Permalink
Avoid some StorePath -> Path -> StorePath roundtrips
Browse files Browse the repository at this point in the history
There were done when StorePath was defined in Rust and there were some
FFI issues. This is no longer an issue.
  • Loading branch information
Ericson2314 committed Mar 5, 2021
1 parent 665d4ec commit 6212e89
Showing 1 changed file with 15 additions and 20 deletions.
35 changes: 15 additions & 20 deletions src/libstore/misc.cc
Original file line number Diff line number Diff line change
Expand Up @@ -22,55 +22,53 @@ void Store::computeFSClosure(const StorePathSet & startPaths,

Sync<State> state_(State{0, paths_, 0});

std::function<void(const Path &)> enqueue;
std::function<void(const StorePath &)> enqueue;

std::condition_variable done;

enqueue = [&](const Path & path) -> void {
enqueue = [&](const StorePath & path) -> void {
{
auto state(state_.lock());
if (state->exc) return;
if (!state->paths.insert(parseStorePath(path)).second) return;
if (!state->paths.insert(path).second) return;
state->pending++;
}

queryPathInfo(parseStorePath(path), {[&, pathS(path)](std::future<ref<const ValidPathInfo>> fut) {
queryPathInfo(path, {[&](std::future<ref<const ValidPathInfo>> fut) {
// FIXME: calls to isValidPath() should be async

try {
auto info = fut.get();

auto path = parseStorePath(pathS);

if (flipDirection) {

StorePathSet referrers;
queryReferrers(path, referrers);
for (auto & ref : referrers)
if (ref != path)
enqueue(printStorePath(ref));
enqueue(ref);

if (includeOutputs)
for (auto & i : queryValidDerivers(path))
enqueue(printStorePath(i));
enqueue(i);

if (includeDerivers && path.isDerivation())
for (auto & i : queryDerivationOutputs(path))
if (isValidPath(i) && queryPathInfo(i)->deriver == path)
enqueue(printStorePath(i));
enqueue(i);

} else {

for (auto & ref : info->references)
if (ref != path)
enqueue(printStorePath(ref));
enqueue(ref);

if (includeOutputs && path.isDerivation())
for (auto & i : queryDerivationOutputs(path))
if (isValidPath(i)) enqueue(printStorePath(i));
if (isValidPath(i)) enqueue(i);

if (includeDerivers && info->deriver && isValidPath(*info->deriver))
enqueue(printStorePath(*info->deriver));
enqueue(*info->deriver);

}

Expand All @@ -90,7 +88,7 @@ void Store::computeFSClosure(const StorePathSet & startPaths,
};

for (auto & startPath : startPaths)
enqueue(printStorePath(startPath));
enqueue(startPath);

{
auto state(state_.lock());
Expand Down Expand Up @@ -160,13 +158,10 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
};

auto checkOutput = [&](
const Path & drvPathS, ref<Derivation> drv, const Path & outPathS, ref<Sync<DrvState>> drvState_)
const StorePath & drvPath, ref<Derivation> drv, const StorePath & outPath, ref<Sync<DrvState>> drvState_)
{
if (drvState_->lock()->done) return;

auto drvPath = parseStorePath(drvPathS);
auto outPath = parseStorePath(outPathS);

SubstitutablePathInfos infos;
querySubstitutablePathInfos({{outPath, getDerivationCA(*drv)}}, infos);

Expand Down Expand Up @@ -203,7 +198,7 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
return;
}

PathSet invalid;
StorePathSet invalid;
/* true for regular derivations, and CA derivations for which we
have a trust mapping for all wanted outputs. */
auto knownOutputPaths = true;
Expand All @@ -213,7 +208,7 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
break;
}
if (wantOutput(outputName, path.outputs) && !isValidPath(*pathOpt))
invalid.insert(printStorePath(*pathOpt));
invalid.insert(*pathOpt);
}
if (knownOutputPaths && invalid.empty()) return;

Expand All @@ -223,7 +218,7 @@ void Store::queryMissing(const std::vector<StorePathWithOutputs> & targets,
if (knownOutputPaths && settings.useSubstitutes && parsedDrv.substitutesAllowed()) {
auto drvState = make_ref<Sync<DrvState>>(DrvState(invalid.size()));
for (auto & output : invalid)
pool.enqueue(std::bind(checkOutput, printStorePath(path.path), drv, output, drvState));
pool.enqueue(std::bind(checkOutput, path.path, drv, output, drvState));
} else
mustBuildDrv(path.path, *drv);

Expand Down

0 comments on commit 6212e89

Please sign in to comment.