mirror of
https://github.com/Icinga/icinga2.git
synced 2025-07-23 13:45:04 +02:00
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:
commit
180132806f
@ -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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user