Merge pull request #8696 from Icinga/feature/improve-redisconnection-write-performance

RedisConnection::WriteRESP: Use one asio::async_write instead of many
This commit is contained in:
Julian Brost 2021-03-26 12:36:44 +01:00 committed by GitHub
commit 180132806f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -139,9 +139,6 @@ namespace icinga
template<class AsyncWriteStream> template<class AsyncWriteStream>
static void WriteRESP(AsyncWriteStream& stream, const Query& query, boost::asio::yield_context& yc); static void WriteRESP(AsyncWriteStream& stream, const Query& query, boost::asio::yield_context& yc);
template<class AsyncWriteStream>
static void WriteInt(AsyncWriteStream& stream, intmax_t i, boost::asio::yield_context& yc);
RedisConnection(boost::asio::io_context& io, String host, int port, String path, String password, int db); RedisConnection(boost::asio::io_context& io, String host, int port, String path, String password, int db);
void Connect(boost::asio::yield_context& yc); void Connect(boost::asio::yield_context& yc);
@ -493,36 +490,16 @@ void RedisConnection::WriteRESP(AsyncWriteStream& stream, const Query& query, bo
{ {
namespace asio = boost::asio; namespace asio = boost::asio;
asio::async_write(stream, asio::const_buffer("*", 1), yc); asio::streambuf writeBuffer;
WriteInt(stream, query.size(), yc); std::ostream msg(&writeBuffer);
asio::async_write(stream, asio::const_buffer("\r\n", 2), yc);
msg << "*" << query.size() << "\r\n";
for (auto& arg : query) { for (auto& arg : query) {
asio::async_write(stream, asio::const_buffer("$", 1), yc); msg << "$" << arg.GetLength() << "\r\n" << arg << "\r\n";
WriteInt(stream, arg.GetLength(), yc);
asio::async_write(stream, asio::const_buffer("\r\n", 2), yc);
asio::async_write(stream, asio::const_buffer(arg.CStr(), arg.GetLength()), yc);
asio::async_write(stream, asio::const_buffer("\r\n", 2), yc);
} }
}
/** asio::async_write(stream, writeBuffer, yc);
* Write a Redis protocol int to stream
*
* @param stream Redis server connection
* @param i Redis protocol int
*/
template<class AsyncWriteStream>
void RedisConnection::WriteInt(AsyncWriteStream& stream, intmax_t i, boost::asio::yield_context& yc)
{
namespace asio = boost::asio;
char buf[21] = {};
sprintf(buf, "%jd", i);
asio::async_write(stream, asio::const_buffer(buf, strlen(buf)), yc);
} }
} }