libstore/binary-cache-store: use correct buffer size for NAR decompression

Due to a leftover from a previous version where the buffer was allocated on the
stack, the change introduced in commit 4ec87742a1
accidentally passes the size of a pointer as the size of the buffer to the
decompressor. Since the former is much smaller (usually 8 bytes instead of 64
kilobytes), this is safe, but leads to considerable overhead; most notably, due
to excessive progress reports, which happen for each chunk. Pass the proper
buffer size instead.

Change-Id: If4bf472d33e21587acb5235a2d99e3cb10914633
This commit is contained in:
alois31 2024-07-21 11:28:23 +02:00
parent 1917e6c765
commit 391088900e
Signed by untrusted user: alois31
GPG key ID: E0F59EA5E5216914

View file

@ -336,12 +336,13 @@ WireFormatGenerator BinaryCacheStore::narFromPath(const StorePath & storePath)
try { try {
auto file = getFile(info->url); auto file = getFile(info->url);
return [](auto info, auto file, auto & stats) -> WireFormatGenerator { return [](auto info, auto file, auto & stats) -> WireFormatGenerator {
std::unique_ptr<char[]> buf(new char[65536]); constexpr size_t buflen = 65536;
auto buf = std::make_unique<char []>(buflen);
size_t total = 0; size_t total = 0;
auto decompressor = makeDecompressionSource(info->compression, *file); auto decompressor = makeDecompressionSource(info->compression, *file);
try { try {
while (true) { while (true) {
const auto len = decompressor->read(buf.get(), sizeof(buf)); const auto len = decompressor->read(buf.get(), buflen);
co_yield std::span{buf.get(), len}; co_yield std::span{buf.get(), len};
total += len; total += len;
} }