mirror of
https://github.com/NixOS/nix.git
synced 2024-11-25 16:23:02 +00:00
Merge pull request #10570 from layus/shared_caches
Share evaluation caches across installables
This commit is contained in:
commit
de51e5c335
@ -443,13 +443,10 @@ ref<eval_cache::EvalCache> openEvalCache(
|
|||||||
EvalState & state,
|
EvalState & state,
|
||||||
std::shared_ptr<flake::LockedFlake> lockedFlake)
|
std::shared_ptr<flake::LockedFlake> lockedFlake)
|
||||||
{
|
{
|
||||||
auto fingerprint = lockedFlake->getFingerprint(state.store);
|
auto fingerprint = evalSettings.useEvalCache && evalSettings.pureEval
|
||||||
return make_ref<nix::eval_cache::EvalCache>(
|
? lockedFlake->getFingerprint(state.store)
|
||||||
evalSettings.useEvalCache && evalSettings.pureEval
|
: std::nullopt;
|
||||||
? fingerprint
|
auto rootLoader = [&state, lockedFlake]()
|
||||||
: std::nullopt,
|
|
||||||
state,
|
|
||||||
[&state, lockedFlake]()
|
|
||||||
{
|
{
|
||||||
/* For testing whether the evaluation cache is
|
/* For testing whether the evaluation cache is
|
||||||
complete. */
|
complete. */
|
||||||
@ -465,7 +462,17 @@ ref<eval_cache::EvalCache> openEvalCache(
|
|||||||
assert(aOutputs);
|
assert(aOutputs);
|
||||||
|
|
||||||
return aOutputs->value;
|
return aOutputs->value;
|
||||||
});
|
};
|
||||||
|
|
||||||
|
if (fingerprint) {
|
||||||
|
auto search = state.evalCaches.find(fingerprint.value());
|
||||||
|
if (search == state.evalCaches.end()) {
|
||||||
|
search = state.evalCaches.emplace(fingerprint.value(), make_ref<nix::eval_cache::EvalCache>(fingerprint, state, rootLoader)).first;
|
||||||
|
}
|
||||||
|
return search->second;
|
||||||
|
} else {
|
||||||
|
return make_ref<nix::eval_cache::EvalCache>(std::nullopt, state, rootLoader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Installables SourceExprCommand::parseInstallables(
|
Installables SourceExprCommand::parseInstallables(
|
||||||
|
@ -34,6 +34,9 @@ class StorePath;
|
|||||||
struct SingleDerivedPath;
|
struct SingleDerivedPath;
|
||||||
enum RepairFlag : bool;
|
enum RepairFlag : bool;
|
||||||
struct MemoryInputAccessor;
|
struct MemoryInputAccessor;
|
||||||
|
namespace eval_cache {
|
||||||
|
class EvalCache;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -282,6 +285,11 @@ public:
|
|||||||
return *new EvalErrorBuilder<T>(*this, args...);
|
return *new EvalErrorBuilder<T>(*this, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cache for evaluation caches, so as to reuse the same root value if possible
|
||||||
|
*/
|
||||||
|
std::map<const Hash, ref<eval_cache::EvalCache>> evalCaches;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
/* Cache for calls to addToStore(); maps source paths to the store
|
/* Cache for calls to addToStore(); maps source paths to the store
|
||||||
|
Loading…
Reference in New Issue
Block a user