libstore: make BinaryCacheStore::getFile return a source
this lets us remove the last true remaining uses of makeDecompressionSink. Change-Id: I146ca2bbe1a9ae9a367117a7b8a304b23a63e5e2
This commit is contained in:
parent
df8851f286
commit
5587dbdcf0
6 changed files with 22 additions and 15 deletions
|
@ -67,16 +67,18 @@ void BinaryCacheStore::upsertFile(const std::string & path,
|
|||
upsertFile(path, std::make_shared<std::stringstream>(std::move(data)), mimeType);
|
||||
}
|
||||
|
||||
void BinaryCacheStore::getFile(const std::string & path, Sink & sink)
|
||||
box_ptr<Source> BinaryCacheStore::getFile(const std::string & path)
|
||||
{
|
||||
sink(*getFileContents(path));
|
||||
return make_box_ptr<GeneratorSource>([](std::string data) -> Generator<Bytes> {
|
||||
co_yield std::span{data.data(), data.size()};
|
||||
}(std::move(*getFileContents(path))));
|
||||
}
|
||||
|
||||
std::optional<std::string> BinaryCacheStore::getFileContents(const std::string & path)
|
||||
{
|
||||
StringSink sink;
|
||||
try {
|
||||
getFile(path, sink);
|
||||
return getFile(path)->drain();
|
||||
} catch (NoSuchBinaryCacheFile &) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
@ -334,16 +336,15 @@ void BinaryCacheStore::narFromPath(const StorePath & storePath, Sink & sink)
|
|||
LengthSink narSize;
|
||||
TeeSink tee { sink, narSize };
|
||||
|
||||
auto decompressor = makeDecompressionSink(info->compression, tee);
|
||||
|
||||
try {
|
||||
getFile(info->url, *decompressor);
|
||||
auto file = getFile(info->url);
|
||||
auto decompressor = makeDecompressionSource(info->compression, *file);
|
||||
decompressor->drainInto(tee);
|
||||
} catch (NoSuchBinaryCacheFile & e) {
|
||||
throw SubstituteGone(std::move(e.info()));
|
||||
}
|
||||
|
||||
decompressor->finish();
|
||||
|
||||
stats.narRead++;
|
||||
//stats.narReadCompressedBytes += nar->size(); // FIXME
|
||||
stats.narReadBytes += narSize.length;
|
||||
|
|
|
@ -83,7 +83,7 @@ public:
|
|||
/**
|
||||
* Dump the contents of the specified file to a sink.
|
||||
*/
|
||||
virtual void getFile(const std::string & path, Sink & sink);
|
||||
virtual box_ptr<Source> getFile(const std::string & path);
|
||||
|
||||
virtual std::optional<std::string> getFileContents(const std::string & path);
|
||||
|
||||
|
|
|
@ -150,12 +150,12 @@ protected:
|
|||
|
||||
}
|
||||
|
||||
void getFile(const std::string & path, Sink & sink) override
|
||||
box_ptr<Source> getFile(const std::string & path) override
|
||||
{
|
||||
checkEnabled();
|
||||
auto request(makeRequest(path));
|
||||
try {
|
||||
getFileTransfer()->download(std::move(request))->drainInto(sink);
|
||||
return getFileTransfer()->download(std::move(request));
|
||||
} catch (FileTransferError & e) {
|
||||
if (e.error == FileTransfer::NotFound || e.error == FileTransfer::Forbidden)
|
||||
throw NoSuchBinaryCacheFile("file '%s' does not exist in binary cache '%s'", path, getUri());
|
||||
|
|
|
@ -68,10 +68,10 @@ protected:
|
|||
del.cancel();
|
||||
}
|
||||
|
||||
void getFile(const std::string & path, Sink & sink) override
|
||||
box_ptr<Source> getFile(const std::string & path) override
|
||||
{
|
||||
try {
|
||||
sink << readFileSource(binaryCacheDir + "/" + path);
|
||||
return make_box_ptr<GeneratorSource>(readFileSource(binaryCacheDir + "/" + path));
|
||||
} catch (SysError & e) {
|
||||
if (e.errNo == ENOENT)
|
||||
throw NoSuchBinaryCacheFile("file '%s' does not exist in binary cache", path);
|
||||
|
|
|
@ -455,7 +455,7 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
|
|||
uploadFile(path, istream, mimeType, "");
|
||||
}
|
||||
|
||||
void getFile(const std::string & path, Sink & sink) override
|
||||
box_ptr<Source> getFile(const std::string & path) override
|
||||
{
|
||||
stats.get++;
|
||||
|
||||
|
@ -469,7 +469,11 @@ struct S3BinaryCacheStoreImpl : virtual S3BinaryCacheStoreConfig, public virtual
|
|||
printTalkative("downloaded 's3://%s/%s' (%d bytes) in %d ms",
|
||||
bucketName, path, res.data->size(), res.durationMs);
|
||||
|
||||
sink(*res.data);
|
||||
return make_box_ptr<GeneratorSource>(
|
||||
[](std::string data) -> Generator<Bytes> {
|
||||
co_yield std::span{data.data(), data.size()};
|
||||
}(std::move(*res.data))
|
||||
);
|
||||
} else
|
||||
throw NoSuchBinaryCacheFile("file '%s' does not exist in binary cache '%s'", path, getUri());
|
||||
}
|
||||
|
|
|
@ -294,7 +294,9 @@ Generator<Bytes> readFileSource(const Path & path)
|
|||
AutoCloseFD fd{open(path.c_str(), O_RDONLY | O_CLOEXEC)};
|
||||
if (!fd)
|
||||
throw SysError("opening file '%s'", path);
|
||||
return [](AutoCloseFD fd) -> Generator<Bytes> {
|
||||
co_yield drainFDSource(fd.get());
|
||||
}(std::move(fd));
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in a new issue