diff --git a/lib/remote/eventshandler.cpp b/lib/remote/eventshandler.cpp index 2cbee92f3..990ff8fd6 100644 --- a/lib/remote/eventshandler.cpp +++ b/lib/remote/eventshandler.cpp @@ -106,8 +106,6 @@ bool EventsHandler::HandleRequest( response.result(http::status::ok); response.set(http::field::content_type, "application/json"); - IoBoundWorkSlot dontLockTheIoThread (yc); - http::async_write(stream, response, yc); stream.async_flush(yc); diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 17e61f160..8c1790d50 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -12,7 +12,6 @@ #include "base/configtype.hpp" #include "base/defer.hpp" #include "base/exception.hpp" -#include "base/io-engine.hpp" #include "base/logger.hpp" #include "base/objectlock.hpp" #include "base/timer.hpp" @@ -105,6 +104,9 @@ void HttpServerConnection::StartStreaming() m_HasStartedStreaming = true; + VERIFY(m_HandlingRequest); + m_HandlingRequest->Done(); + HttpServerConnection::Ptr keepAlive (this); IoEngine::SpawnCoroutine(m_IoStrand, [this, keepAlive](asio::yield_context yc) { @@ -418,6 +420,7 @@ bool ProcessRequest( ApiUser::Ptr& authenticatedUser, boost::beast::http::response& response, HttpServerConnection& server, + CpuBoundWork*& m_HandlingRequest, bool& hasStartedStreaming, const WaitGroup::Ptr& waitGroup, std::chrono::steady_clock::duration& cpuBoundWorkTime, @@ -432,6 +435,9 @@ bool ProcessRequest( CpuBoundWork handlingRequest (yc); cpuBoundWorkTime = std::chrono::steady_clock::now() - start; + Defer resetHandlingRequest ([&m_HandlingRequest] { m_HandlingRequest = nullptr; }); + m_HandlingRequest = &handlingRequest; + HttpHandler::ProcessRequest(waitGroup, stream, authenticatedUser, request, response, yc, server); } catch (const std::exception& ex) { if (hasStartedStreaming) { @@ -549,7 +555,7 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc) m_Seen = std::numeric_limits::max(); - if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, *this, m_HasStartedStreaming, m_WaitGroup, cpuBoundWorkTime, yc)) { + if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, *this, m_HandlingRequest, m_HasStartedStreaming, m_WaitGroup, cpuBoundWorkTime, yc)) { break; } diff --git a/lib/remote/httpserverconnection.hpp b/lib/remote/httpserverconnection.hpp index e4f7d257e..b1b734124 100644 --- a/lib/remote/httpserverconnection.hpp +++ b/lib/remote/httpserverconnection.hpp @@ -4,6 +4,7 @@ #define HTTPSERVERCONNECTION_H #include "remote/apiuser.hpp" +#include "base/io-engine.hpp" #include "base/string.hpp" #include "base/tlsstream.hpp" #include "base/wait-group.hpp" @@ -42,6 +43,7 @@ private: boost::asio::io_context::strand m_IoStrand; bool m_ShuttingDown; bool m_HasStartedStreaming; + CpuBoundWork* m_HandlingRequest = nullptr; boost::asio::deadline_timer m_CheckLivenessTimer; HttpServerConnection(const WaitGroup::Ptr& waitGroup, const String& identity, bool authenticated,