mirror of
https://github.com/Icinga/icinga2.git
synced 2025-09-23 17:57:54 +02:00
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:
parent
4b884ea953
commit
f880d3b19e
@ -105,8 +105,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);
|
||||
|
||||
|
@ -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"
|
||||
@ -119,6 +118,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) {
|
||||
@ -432,6 +434,7 @@ bool ProcessRequest(
|
||||
ApiUser::Ptr& authenticatedUser,
|
||||
boost::beast::http::response<boost::beast::http::string_body>& response,
|
||||
HttpServerConnection& server,
|
||||
CpuBoundWork*& m_HandlingRequest,
|
||||
bool& hasStartedStreaming,
|
||||
boost::asio::yield_context& yc
|
||||
)
|
||||
@ -440,6 +443,8 @@ bool ProcessRequest(
|
||||
|
||||
try {
|
||||
CpuBoundWork handlingRequest (yc);
|
||||
Defer resetHandlingRequest ([&m_HandlingRequest] { m_HandlingRequest = nullptr; });
|
||||
m_HandlingRequest = &handlingRequest;
|
||||
|
||||
HttpHandler::ProcessRequest(stream, authenticatedUser, request, response, yc, server);
|
||||
} 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();
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -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 <memory>
|
||||
@ -40,6 +41,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 String& identity, bool authenticated, const Shared<AsioTlsStream>::Ptr& stream, boost::asio::io_context& io);
|
||||
|
Loading…
x
Reference in New Issue
Block a user