From 659bb9e03af59cc5580198caed6145ec9c063465 Mon Sep 17 00:00:00 2001 From: "Alexander A. Klimov" Date: Tue, 20 Feb 2024 12:41:41 +0100 Subject: [PATCH] [Refactor] CpuBoundWork#CpuBoundWork(): require an io_context::strand --- lib/base/io-engine.cpp | 2 +- lib/base/io-engine.hpp | 3 ++- lib/remote/httpserverconnection.cpp | 7 ++++--- lib/remote/jsonrpcconnection.cpp | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/base/io-engine.cpp b/lib/base/io-engine.cpp index b8908a313..aa20a1052 100644 --- a/lib/base/io-engine.cpp +++ b/lib/base/io-engine.cpp @@ -16,7 +16,7 @@ using namespace icinga; -CpuBoundWork::CpuBoundWork(boost::asio::yield_context yc) +CpuBoundWork::CpuBoundWork(boost::asio::yield_context yc, boost::asio::io_context::strand&) : m_Done(false) { auto& ioEngine (IoEngine::Get()); diff --git a/lib/base/io-engine.hpp b/lib/base/io-engine.hpp index 4fe34debf..c215b0a30 100644 --- a/lib/base/io-engine.hpp +++ b/lib/base/io-engine.hpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #if BOOST_VERSION >= 108700 @@ -37,7 +38,7 @@ namespace icinga class CpuBoundWork { public: - CpuBoundWork(boost::asio::yield_context yc); + CpuBoundWork(boost::asio::yield_context yc, boost::asio::io_context::strand&); CpuBoundWork(const CpuBoundWork&) = delete; CpuBoundWork(CpuBoundWork&&) = delete; CpuBoundWork& operator=(const CpuBoundWork&) = delete; diff --git a/lib/remote/httpserverconnection.cpp b/lib/remote/httpserverconnection.cpp index 8c1790d50..6c5fe6590 100644 --- a/lib/remote/httpserverconnection.cpp +++ b/lib/remote/httpserverconnection.cpp @@ -424,7 +424,8 @@ bool ProcessRequest( bool& hasStartedStreaming, const WaitGroup::Ptr& waitGroup, std::chrono::steady_clock::duration& cpuBoundWorkTime, - boost::asio::yield_context& yc + boost::asio::yield_context& yc, + boost::asio::io_context::strand& strand ) { namespace http = boost::beast::http; @@ -432,7 +433,7 @@ bool ProcessRequest( try { // Cache the elapsed time to acquire a CPU semaphore used to detect extremely heavy workloads. auto start (std::chrono::steady_clock::now()); - CpuBoundWork handlingRequest (yc); + CpuBoundWork handlingRequest (yc, strand); cpuBoundWorkTime = std::chrono::steady_clock::now() - start; Defer resetHandlingRequest ([&m_HandlingRequest] { m_HandlingRequest = nullptr; }); @@ -555,7 +556,7 @@ void HttpServerConnection::ProcessMessages(boost::asio::yield_context yc) m_Seen = std::numeric_limits::max(); - if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, *this, m_HandlingRequest, m_HasStartedStreaming, m_WaitGroup, cpuBoundWorkTime, yc)) { + if (!ProcessRequest(*m_Stream, request, authenticatedUser, response, *this, m_HandlingRequest, m_HasStartedStreaming, m_WaitGroup, cpuBoundWorkTime, yc, m_IoStrand)) { break; } diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp index a84f98d9f..252fce2e5 100644 --- a/lib/remote/jsonrpcconnection.cpp +++ b/lib/remote/jsonrpcconnection.cpp @@ -91,7 +91,7 @@ void JsonRpcConnection::HandleIncomingMessages(boost::asio::yield_context yc) auto start (ch::steady_clock::now()); try { - CpuBoundWork handleMessage (yc); + CpuBoundWork handleMessage (yc, m_IoStrand); // Cache the elapsed time to acquire a CPU semaphore used to detect extremely heavy workloads. cpuBoundDuration = ch::steady_clock::now() - start;