mirror of
https://github.com/NixOS/nix.git
synced 2025-12-03 15:40:59 +01:00
Persistently cache InputAccessor::fetchToStore()
This avoids repeated copying of the same source tree between Nix invocations. It requires the accessor to have a "fingerprint" (e.g. a Git revision) that uniquely determines its contents.
This commit is contained in:
parent
f450c8773c
commit
99d5204baa
8 changed files with 77 additions and 3 deletions
|
|
@ -1,5 +1,6 @@
|
|||
#include "input-accessor.hh"
|
||||
#include "store-api.hh"
|
||||
#include "cache.hh"
|
||||
|
||||
namespace nix {
|
||||
|
||||
|
|
@ -11,6 +12,30 @@ StorePath InputAccessor::fetchToStore(
|
|||
PathFilter * filter,
|
||||
RepairFlag repair)
|
||||
{
|
||||
// FIXME: add an optimisation for the case where the accessor is
|
||||
// an FSInputAccessor pointing to a store path.
|
||||
|
||||
std::optional<fetchers::Attrs> cacheKey;
|
||||
|
||||
if (!filter && fingerprint) {
|
||||
cacheKey = fetchers::Attrs{
|
||||
{"_what", "fetchToStore"},
|
||||
{"store", store->storeDir},
|
||||
{"name", std::string(name)},
|
||||
{"fingerprint", *fingerprint},
|
||||
{"method", (uint8_t) method},
|
||||
{"path", path.abs()}
|
||||
};
|
||||
if (auto res = fetchers::getCache()->lookup(*cacheKey)) {
|
||||
StorePath storePath(fetchers::getStrAttr(*res, "storePath"));
|
||||
if (store->isValidPath(storePath)) {
|
||||
debug("store path cache hit for '%s'", showPath(path));
|
||||
return storePath;
|
||||
}
|
||||
}
|
||||
} else
|
||||
debug("source path '%s' is uncacheable", showPath(path));
|
||||
|
||||
Activity act(*logger, lvlChatty, actUnknown, fmt("copying '%s' to the store", showPath(path)));
|
||||
|
||||
auto source = sinkToSource([&](Sink & sink) {
|
||||
|
|
@ -25,6 +50,11 @@ StorePath InputAccessor::fetchToStore(
|
|||
? store->computeStorePathFromDump(*source, name, method, htSHA256).first
|
||||
: store->addToStoreFromDump(*source, name, method, htSHA256, repair);
|
||||
|
||||
if (cacheKey)
|
||||
fetchers::getCache()->upsert(
|
||||
*cacheKey,
|
||||
fetchers::Attrs{{"storePath", std::string(storePath.to_string())}});
|
||||
|
||||
return storePath;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue