libstore/remote: frame buffers, don't buffer frames

shoving a nar dump directly into a framed sink created a bunch of tiny
frames, each of which requires at least two syscalls to read. this can
lead to immense performance loss when using a daemon; we have seen 15%
in benchmarks on main and even more with async code involved ... oops.

Change-Id: I8529506e3de74d92834d1f4ee228dcaf32eb756c
This commit is contained in:
eldritch horrors
2025-08-01 01:10:50 +02:00
parent 98a27fbfd2
commit d5cfc6f19c
+4 -4
View File
@@ -834,15 +834,15 @@ kj::Promise<Result<void>> RemoteStore::ConnectionHandle::withFramedStream(
std::function<kj::Promise<Result<void>>(AsyncOutputStream & stream)> fun
)
try {
AsyncBufferedOutputStream to(stream);
AsyncFramedOutputStream sink(to);
AsyncFramedOutputStream framed(stream);
AsyncBufferedOutputStream sink(framed);
// NOLINTNEXTLINE(cppcoreguidelines-avoid-capturing-lambda-coroutines)
auto send = [&]() -> kj::Promise<Result<void>> {
try {
TRY_AWAIT(fun(sink));
TRY_AWAIT(sink.finish());
TRY_AWAIT(to.flush());
TRY_AWAIT(sink.flush());
TRY_AWAIT(framed.finish());
co_return result::success();
} catch (...) {
handle.markBad();