HttpServerConnection#StartStreaming(): release CpuBoundWork

so that /v1/events doesn't have to use IoBoundWorkSlot. IoBoundWorkSlot#~IoBoundWorkSlot() will wait for a free semaphore slot which will be almost immediately released by CpuBoundWork#~CpuBoundWork(). Just releasing the already aquired slot in HttpServerConnection#StartStreaming() is more efficient.
This commit is contained in:
Alexander A. Klimov 2024-02-07 10:53:03 +01:00
parent 4b884ea953
commit f880d3b19e
3 changed files with 9 additions and 4 deletions

View File

@ -105,8 +105,6 @@ bool EventsHandler::HandleRequest(
response.result(http::status::ok); response.result(http::status::ok);
response.set(http::field::content_type, "application/json"); response.set(http::field::content_type, "application/json");
IoBoundWorkSlot dontLockTheIoThread (yc);
http::async_write(stream, response, yc); http::async_write(stream, response, yc);
stream.async_flush(yc); stream.async_flush(yc);

View File

@ -12,7 +12,6 @@
#include "base/configtype.hpp" #include "base/configtype.hpp"
#include "base/defer.hpp" #include "base/defer.hpp"
#include "base/exception.hpp" #include "base/exception.hpp"
#include "base/io-engine.hpp"
#include "base/logger.hpp" #include "base/logger.hpp"
#include "base/objectlock.hpp" #include "base/objectlock.hpp"
#include "base/timer.hpp" #include "base/timer.hpp"
@ -119,6 +118,9 @@ void HttpServerConnection::StartStreaming()
m_HasStartedStreaming = true; m_HasStartedStreaming = true;
VERIFY(m_HandlingRequest);
m_HandlingRequest->Done();
HttpServerConnection::Ptr keepAlive (this); HttpServerConnection::Ptr keepAlive (this);
IoEngine::SpawnCoroutine(m_IoStrand, [this, keepAlive](asio::yield_context yc) { IoEngine::SpawnCoroutine(m_IoStrand, [this, keepAlive](asio::yield_context yc) {
@ -432,6 +434,7 @@ bool ProcessRequest(
ApiUser::Ptr& authenticatedUser, ApiUser::Ptr& authenticatedUser,
boost::beast::http::response<boost::beast::http::string_body>& response, boost::beast::http::response<boost::beast::http::string_body>& response,
HttpServerConnection& server, HttpServerConnection& server,
CpuBoundWork*& m_HandlingRequest,
bool& hasStartedStreaming, bool& hasStartedStreaming,
boost::asio::yield_context& yc boost::asio::yield_context& yc
) )
@ -440,6 +443,8 @@ bool ProcessRequest(
try { try {
CpuBoundWork handlingRequest (yc); CpuBoundWork handlingRequest (yc);
Defer resetHandlingRequest ([&m_HandlingRequest] { m_HandlingRequest = nullptr; });
m_HandlingRequest = &handlingRequest;
HttpHandler::ProcessRequest(stream, authenticatedUser, request, response, yc, server); HttpHandler::ProcessRequest(stream, authenticatedUser, request, response, yc, server);
} catch (const std::exception& ex) { } catch (const std::exception& ex) {
@ -553,7 +558,7 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc)
m_Seen = std::numeric_limits<decltype(m_Seen)>::max(); m_Seen = std::numeric_limits<decltype(m_Seen)>::max();
if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, *this, m_HasStartedStreaming, yc)) { if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, *this, m_HandlingRequest, m_HasStartedStreaming, yc)) {
break; break;
} }

View File

@ -4,6 +4,7 @@
#define HTTPSERVERCONNECTION_H #define HTTPSERVERCONNECTION_H
#include "remote/apiuser.hpp" #include "remote/apiuser.hpp"
#include "base/io-engine.hpp"
#include "base/string.hpp" #include "base/string.hpp"
#include "base/tlsstream.hpp" #include "base/tlsstream.hpp"
#include <memory> #include <memory>
@ -40,6 +41,7 @@ private:
boost::asio::io_context::strand m_IoStrand; boost::asio::io_context::strand m_IoStrand;
bool m_ShuttingDown; bool m_ShuttingDown;
bool m_HasStartedStreaming; bool m_HasStartedStreaming;
CpuBoundWork* m_HandlingRequest = nullptr;
boost::asio::deadline_timer m_CheckLivenessTimer; boost::asio::deadline_timer m_CheckLivenessTimer;
HttpServerConnection(const String& identity, bool authenticated, const Shared<AsioTlsStream>::Ptr& stream, boost::asio::io_context& io); HttpServerConnection(const String& identity, bool authenticated, const Shared<AsioTlsStream>::Ptr& stream, boost::asio::io_context& io);