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