RedisConnection#Connect(): get rid of spin lock

Instead of IoEngine::YieldCurrentCoroutine(yc) until m_Queues.FutureResponseActions.empty(), async-wait a CV which is updated along with m_Queues.FutureResponseActions.
This commit is contained in:
Alexander A. Klimov 2025-05-14 12:28:11 +02:00
parent 060d8b185e
commit 2739f7f189
2 changed files with 6 additions and 11 deletions

View File

@ -302,12 +302,6 @@ void RedisConnection::Connect(asio::yield_context& yc)
boost::asio::deadline_timer timer (m_Strand.context()); boost::asio::deadline_timer timer (m_Strand.context());
auto waitForReadLoop ([this, &yc]() {
while (!m_Queues.FutureResponseActions.empty()) {
IoEngine::YieldCurrentCoroutine(yc);
}
});
for (;;) { for (;;) {
try { try {
if (m_Path.IsEmpty()) { if (m_Path.IsEmpty()) {
@ -339,7 +333,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
} }
Handshake(conn, yc); Handshake(conn, yc);
waitForReadLoop(); m_QueuedReads.WaitForClear(yc);
m_TlsConn = std::move(conn); m_TlsConn = std::move(conn);
} else { } else {
Log(m_Parent ? LogNotice : LogInformation, "IcingaDB") Log(m_Parent ? LogNotice : LogInformation, "IcingaDB")
@ -350,7 +344,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
icinga::Connect(conn->next_layer(), m_Host, Convert::ToString(m_Port), yc); icinga::Connect(conn->next_layer(), m_Host, Convert::ToString(m_Port), yc);
Handshake(conn, yc); Handshake(conn, yc);
waitForReadLoop(); m_QueuedReads.WaitForClear(yc);
m_TcpConn = std::move(conn); m_TcpConn = std::move(conn);
} }
} else { } else {
@ -362,7 +356,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
conn->next_layer().async_connect(Unix::endpoint(m_Path.CStr()), yc); conn->next_layer().async_connect(Unix::endpoint(m_Path.CStr()), yc);
Handshake(conn, yc); Handshake(conn, yc);
waitForReadLoop(); m_QueuedReads.WaitForClear(yc);
m_UnixConn = std::move(conn); m_UnixConn = std::move(conn);
} }
@ -394,7 +388,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
void RedisConnection::ReadLoop(asio::yield_context& yc) void RedisConnection::ReadLoop(asio::yield_context& yc)
{ {
for (;;) { for (;;) {
m_QueuedReads.Wait(yc); m_QueuedReads.WaitForSet(yc);
while (!m_Queues.FutureResponseActions.empty()) { while (!m_Queues.FutureResponseActions.empty()) {
auto item (std::move(m_Queues.FutureResponseActions.front())); auto item (std::move(m_Queues.FutureResponseActions.front()));

View File

@ -262,7 +262,8 @@ namespace icinga
std::set<QueryPriority> m_SuppressedQueryKinds; std::set<QueryPriority> m_SuppressedQueryKinds;
// Indicate that there's something to send/receive // Indicate that there's something to send/receive
AsioEvent m_QueuedWrites, m_QueuedReads; AsioEvent m_QueuedWrites;
AsioDualEvent m_QueuedReads;
std::function<void(boost::asio::yield_context& yc)> m_ConnectedCallback; std::function<void(boost::asio::yield_context& yc)> m_ConnectedCallback;