From e0c4dff32a4e3c2537f1946ff43711cd5b3e7b78 Mon Sep 17 00:00:00 2001 From: Konstantin Osipov <kostja@tarantool.org> Date: Sun, 19 Jul 2015 00:03:53 +0300 Subject: [PATCH] iproto: fix a performance bug (saves up to 10% CPU) When selecting the next buffer to flush, take into account not just its size, but how much of it has already been flushed. This saves a couple syscalls per connection per event loop. --- src/iproto.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/iproto.cc b/src/iproto.cc index 81eec84641..5488b5cb96 100644 --- a/src/iproto.cc +++ b/src/iproto.cc @@ -548,7 +548,8 @@ iproto_session_on_input(struct ev_io *watcher, static inline struct iobuf * iproto_session_output_iobuf(struct iproto_session *session) { - if (obuf_size(&session->iobuf[1]->out)) + if (obuf_size(&session->iobuf[1]->out) && + obuf_size(&session->iobuf[1]->out) > con->write_pos.size) return session->iobuf[1]; /* * Don't try to write from a newer buffer if an older one @@ -557,7 +558,8 @@ iproto_session_output_iobuf(struct iproto_session *session) * pieces of replies from both buffers. */ if (ibuf_size(&session->iobuf[1]->in) == 0 && - obuf_size(&session->iobuf[0]->out)) + obuf_size(&session->iobuf[0]->out) + obuf_size(&session->iobuf[0]->out) > con->write_pos.size) return session->iobuf[0]; return NULL; } -- GitLab