aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/remote-store.cc
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-19 14:52:35 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-20 15:59:52 -0400
commit6bc98c7fba9f783414692fcef41d90ed80928b6c (patch)
treec6e79f43ed32d133a62135497b35b73d6c2b1126 /src/libstore/remote-store.cc
parentf62543fe1cc544a5684af327f63a1aeb1bdeba94 (diff)
Give `queryPartialDerivationOutputMap` an `evalStore` parameter
This makes it more useful. In general, the derivation will be in one store, and the realisation info is in another. This also helps us avoid duplication. See how `resolveDerivedPath` is now simpler because it uses `queryPartialDerivationOutputMap`. In #8369 we get more flavors of derived path, and need more code to resolve them all, and this problem only gets worse. The fact that we need a new method to deal with the multiple dispatch is unfortunate, but this generally relates to the fact that `Store` is a sub-par interface, too bulky/unwieldy and conflating separate concerns. Solving that is out of scope of this PR. This is part of the RFC 92 work. See tracking issue #6316
Diffstat (limited to 'src/libstore/remote-store.cc')
-rw-r--r--src/libstore/remote-store.cc33
1 files changed, 21 insertions, 12 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 1e2104e1f..bfe2258a4 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -378,27 +378,36 @@ StorePathSet RemoteStore::queryDerivationOutputs(const StorePath & path)
}
-std::map<std::string, std::optional<StorePath>> RemoteStore::queryPartialDerivationOutputMap(const StorePath & path)
+std::map<std::string, std::optional<StorePath>> RemoteStore::queryPartialDerivationOutputMap(const StorePath & path, Store * evalStore_)
{
if (GET_PROTOCOL_MINOR(getProtocol()) >= 0x16) {
- auto conn(getConnection());
- conn->to << WorkerProto::Op::QueryDerivationOutputMap << printStorePath(path);
- conn.processStderr();
- return WorkerProto::Serialise<std::map<std::string, std::optional<StorePath>>>::read(*this, *conn);
+ if (!evalStore_) {
+ auto conn(getConnection());
+ conn->to << WorkerProto::Op::QueryDerivationOutputMap << printStorePath(path);
+ conn.processStderr();
+ return WorkerProto::Serialise<std::map<std::string, std::optional<StorePath>>>::read(*this, *conn);
+ } else {
+ auto & evalStore = *evalStore_;
+ auto outputs = evalStore.queryStaticPartialDerivationOutputMap(path);
+ // union with the first branch overriding the statically-known ones
+ // when non-`std::nullopt`.
+ for (auto && [outputName, optPath] : queryPartialDerivationOutputMap(path, nullptr)) {
+ if (optPath)
+ outputs.insert_or_assign(std::move(outputName), std::move(optPath));
+ else
+ outputs.insert({std::move(outputName), std::nullopt});
+ }
+ return outputs;
+ }
} else {
+ auto & evalStore = evalStore_ ? *evalStore_ : *this;
// Fallback for old daemon versions.
// For floating-CA derivations (and their co-dependencies) this is an
// under-approximation as it only returns the paths that can be inferred
// from the derivation itself (and not the ones that are known because
// the have been built), but as old stores don't handle floating-CA
// derivations this shouldn't matter
- auto derivation = readDerivation(path);
- auto outputsWithOptPaths = derivation.outputsAndOptPaths(*this);
- std::map<std::string, std::optional<StorePath>> ret;
- for (auto & [outputName, outputAndPath] : outputsWithOptPaths) {
- ret.emplace(outputName, outputAndPath.second);
- }
- return ret;
+ return evalStore.queryStaticPartialDerivationOutputMap(path);
}
}