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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user