libstore: turn copyNAR into a generator

Change-Id: Id452f6a03faa1037ff13af0f63e32883966ff40d
This commit is contained in:
eldritch horrors 2024-05-15 17:13:45 +02:00
parent 03db4efab9
commit a5d431a911
6 changed files with 12 additions and 15 deletions

View file

@ -463,7 +463,7 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
command. (We don't trust `addToStoreFromDump` to not command. (We don't trust `addToStoreFromDump` to not
eagerly consume the entire stream it's given, past the eagerly consume the entire stream it's given, past the
length of the Nar. */ length of the Nar. */
copyNAR(from, saved); saved << copyNAR(from);
} else { } else {
/* Incrementally parse the NAR file, stripping the /* Incrementally parse the NAR file, stripping the
metadata, and streaming the sole file we expect into metadata, and streaming the sole file we expect into
@ -884,7 +884,6 @@ static void performOp(TunnelLogger * logger, ref<Store> store,
else { else {
std::unique_ptr<Source> source; std::unique_ptr<Source> source;
StringSink saved;
source = std::make_unique<TunnelSource>(from, to); source = std::make_unique<TunnelSource>(from, to);
logger->startWork(); logger->startWork();

View file

@ -64,7 +64,7 @@ StorePaths Store::importPaths(Source & source, CheckSigsFlag checkSigs)
/* Extract the NAR from the source. */ /* Extract the NAR from the source. */
StringSink saved; StringSink saved;
copyNAR(source, saved); saved << copyNAR(source);
uint32_t magic = readInt(source); uint32_t magic = readInt(source);
if (magic != exportMagic) if (magic != exportMagic)

View file

@ -193,7 +193,7 @@ struct LegacySSHStore : public virtual LegacySSHStoreConfig, public virtual Stor
<< info.sigs << info.sigs
<< renderContentAddress(info.ca); << renderContentAddress(info.ca);
try { try {
copyNAR(source, conn->to); conn->to << copyNAR(source);
} catch (...) { } catch (...) {
conn->good = false; conn->good = false;
throw; throw;
@ -206,7 +206,7 @@ struct LegacySSHStore : public virtual LegacySSHStoreConfig, public virtual Stor
<< ServeProto::Command::ImportPaths << ServeProto::Command::ImportPaths
<< 1; << 1;
try { try {
copyNAR(source, conn->to); conn->to << copyNAR(source);
} catch (...) { } catch (...) {
conn->good = false; conn->good = false;
throw; throw;
@ -233,7 +233,7 @@ struct LegacySSHStore : public virtual LegacySSHStoreConfig, public virtual Stor
conn->to << ServeProto::Command::DumpStorePath << printStorePath(path); conn->to << ServeProto::Command::DumpStorePath << printStorePath(path);
conn->to.flush(); conn->to.flush();
copyNAR(conn->from, sink); sink << copyNAR(conn->from);
} }
std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override std::optional<StorePath> queryPathFromHashPart(const std::string & hashPart) override

View file

@ -469,7 +469,7 @@ void RemoteStore::addToStore(const ValidPathInfo & info, Source & source,
if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 23) { if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 23) {
conn.withFramedSink([&](Sink & sink) { conn.withFramedSink([&](Sink & sink) {
copyNAR(source, sink); sink << copyNAR(source);
}); });
} else { } else {
conn.processStderr(0, &source); conn.processStderr(0, &source);
@ -853,7 +853,7 @@ void RemoteStore::narFromPath(const StorePath & path, Sink & sink)
auto conn(connections->get()); auto conn(connections->get());
conn->to << WorkerProto::Op::NarFromPath << printStorePath(path); conn->to << WorkerProto::Op::NarFromPath << printStorePath(path);
conn->processStderr(); conn->processStderr();
copyNAR(conn->from, sink); sink << copyNAR(conn->from);
} }
ref<FSAccessor> RemoteStore::getFSAccessor() ref<FSAccessor> RemoteStore::getFSAccessor()

View file

@ -413,16 +413,14 @@ void restorePath(const Path & path, Source & source)
} }
void copyNAR(Source & source, Sink & sink) WireFormatGenerator copyNAR(Source & source)
{ {
// FIXME: if 'source' is the output of dumpPath() followed by EOF, // FIXME: if 'source' is the output of dumpPath() followed by EOF,
// we should just forward all data directly without parsing. // we should just forward all data directly without parsing.
ParseSink parseSink; /* null sink; just parse the NAR */ static ParseSink parseSink; /* null sink; just parse the NAR */
TeeSource wrapper { source, sink }; return parseAndCopyDump(parseSink, source);
parseDump(parseSink, wrapper);
} }

View file

@ -122,9 +122,9 @@ void parseDump(ParseSink & sink, Source & source);
void restorePath(const Path & path, Source & source); void restorePath(const Path & path, Source & source);
/** /**
* Read a NAR from 'source' and write it to 'sink'. * Read a NAR from 'source' and return it as a generator.
*/ */
void copyNAR(Source & source, Sink & sink); WireFormatGenerator copyNAR(Source & source);
inline constexpr std::string_view narVersionMagic1 = "nix-archive-1"; inline constexpr std::string_view narVersionMagic1 = "nix-archive-1";