forked from lix-project/lix
2df9cbeb47
E.g. $ time nix cat-store --store https://cache.nixos.org?local-nar-cache=/tmp/nars \ /nix/store/b0w2hafndl09h64fhb86kw6bmhbmnpm1-blender-2.79/share/icons/hicolor/scalable/apps/blender.svg > /dev/null real 0m4.139s $ time nix cat-store --store https://cache.nixos.org?local-nar-cache=/tmp/nars \ /nix/store/b0w2hafndl09h64fhb86kw6bmhbmnpm1-blender-2.79/share/icons/hicolor/scalable/apps/blender.svg > /dev/null real 0m0.024s (Before, the second call took ~0.220s.) This will use a NAR listing in /tmp/nars/b0w2hafndl09h64fhb86kw6bmhbmnpm1.ls containing all metadata, including the offsets of regular files inside the NAR. Thus, we don't need to read the entire NAR. (We do read the entire listing, but that's generally pretty small. We could use a SQLite DB by borrowing some more code from nixos-channel-scripts/file-cache.hh.) This is primarily useful when Hydra is serving files from an S3 binary cache, in particular when you have giant NARs. E.g. we had some 12 GiB NARs, so accessing individuals files was pretty slow.
29 lines
811 B
C++
29 lines
811 B
C++
#pragma once
|
|
|
|
#include "fs-accessor.hh"
|
|
|
|
namespace nix {
|
|
|
|
/* Return an object that provides access to the contents of a NAR
|
|
file. */
|
|
ref<FSAccessor> makeNarAccessor(ref<const std::string> nar);
|
|
|
|
/* Create a NAR accessor from a NAR listing (in the format produced by
|
|
listNar()). The callback getNarBytes(offset, length) is used by the
|
|
readFile() method of the accessor to get the contents of files
|
|
inside the NAR. */
|
|
typedef std::function<std::string(uint64_t, uint64_t)> GetNarBytes;
|
|
|
|
ref<FSAccessor> makeLazyNarAccessor(
|
|
const std::string & listing,
|
|
GetNarBytes getNarBytes);
|
|
|
|
class JSONPlaceholder;
|
|
|
|
/* Write a JSON representation of the contents of a NAR (except file
|
|
contents). */
|
|
void listNar(JSONPlaceholder & res, ref<FSAccessor> accessor,
|
|
const Path & path, bool recurse);
|
|
|
|
}
|