Skip to content

Commit ca03f7c

Browse files
Replace strand
1 parent 7eedf73 commit ca03f7c

19 files changed

Lines changed: 54 additions & 53 deletions

lib/base/io-engine.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ using namespace icinga;
2727
* @param yc Needed to asynchronously wait for the condition variable.
2828
* @param strand Where to post the wake-up of the condition variable.
2929
*/
30-
CpuBoundWork::CpuBoundWork(boost::asio::yield_context yc, boost::asio::io_context::strand& strand)
30+
CpuBoundWork::CpuBoundWork(boost::asio::yield_context yc, IoStrand& strand)
3131
: m_Done(false)
3232
{
3333
VERIFY(IoEngine::IsStrandRunningOnThisThread(strand));

lib/base/io-engine.hpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
#include <boost/exception/all.hpp>
2323
#include <boost/asio/deadline_timer.hpp>
2424
#include <boost/asio/io_context.hpp>
25-
#include <boost/asio/io_context_strand.hpp>
2625
#include <boost/asio/spawn.hpp>
2726
#include <boost/asio/steady_timer.hpp>
2827

@@ -33,6 +32,8 @@
3332
namespace icinga
3433
{
3534

35+
using IoStrand = boost::asio::strand<boost::asio::io_context::executor_type>;
36+
3637
/**
3738
* Scope lock for CPU-bound work done in an I/O thread
3839
*
@@ -41,7 +42,7 @@ namespace icinga
4142
class CpuBoundWork
4243
{
4344
public:
44-
CpuBoundWork(boost::asio::yield_context yc, boost::asio::io_context::strand&);
45+
CpuBoundWork(boost::asio::yield_context yc, IoStrand&);
4546
CpuBoundWork(const CpuBoundWork&) = delete;
4647
CpuBoundWork(CpuBoundWork&&) = delete;
4748
CpuBoundWork& operator=(const CpuBoundWork&) = delete;
@@ -112,7 +113,7 @@ class IoEngine
112113
* [^2]: https://bugs.llvm.org/show_bug.cgi?id=19177
113114
* [^3]: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=26461
114115
*/
115-
BOOST_NOINLINE static bool IsStrandRunningOnThisThread(const boost::asio::io_context::strand& strand)
116+
BOOST_NOINLINE static bool IsStrandRunningOnThisThread(const IoStrand& strand)
116117
{
117118
return strand.running_in_this_thread();
118119
}
@@ -175,7 +176,7 @@ class IoEngine
175176

176177
std::atomic_uint_fast32_t m_CpuBoundSemaphore;
177178
std::mutex m_CpuBoundWaitingMutex;
178-
std::vector<std::pair<boost::asio::io_context::strand, Shared<AsioConditionVariable>::Ptr>> m_CpuBoundWaiting;
179+
std::vector<std::pair<IoStrand, Shared<AsioConditionVariable>::Ptr>> m_CpuBoundWaiting;
179180
};
180181

181182
class TerminateIoThread : public std::exception
@@ -255,8 +256,8 @@ class Timeout
255256
* @param onTimeout The callback to invoke when the timeout occurs.
256257
*/
257258
template<class OnTimeout>
258-
Timeout(boost::asio::io_context::strand& strand, const Timer::duration_type& timeoutFromNow, OnTimeout onTimeout)
259-
: m_Timer(strand.context(), timeoutFromNow), m_Cancelled(Shared<Atomic<bool>>::Make(false))
259+
Timeout(IoStrand& strand, const Timer::duration_type& timeoutFromNow, OnTimeout onTimeout)
260+
: m_Timer(strand.get_inner_executor().context(), timeoutFromNow), m_Cancelled(Shared<Atomic<bool>>::Make(false))
260261
{
261262
ASSERT(IoEngine::IsStrandRunningOnThisThread(strand));
262263

lib/base/tlsstream.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ void AsioTlsStream::ForceDisconnect()
133133
* @param strand Asio strand used for other operations on this connection.
134134
* @param yc Yield context for Asio coroutines
135135
*/
136-
void AsioTlsStream::GracefulDisconnect(boost::asio::io_context::strand& strand, boost::asio::yield_context& yc)
136+
void AsioTlsStream::GracefulDisconnect(IoStrand& strand, boost::asio::yield_context& yc)
137137
{
138138
if (!lowest_layer().is_open()) {
139139
// Already disconnected, nothing to do.

lib/base/tlsstream.hpp

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#define TLSSTREAM_H
66

77
#include "base/i2-base.hpp"
8+
#include "base/io-engine.hpp"
89
#include "base/shared.hpp"
910
#include "base/socket.hpp"
1011
#include "base/stream.hpp"
@@ -58,9 +59,10 @@ class SeenStream : public ARS
5859
std::atomic<double*> m_Seen;
5960
};
6061

62+
template<typename Exec>
6163
struct UnbufferedAsioTlsStreamParams
6264
{
63-
boost::asio::io_context& IoContext;
65+
Exec& IoExecutor;
6466
boost::asio::ssl::context& SslContext;
6567
const String& Hostname;
6668
};
@@ -70,9 +72,9 @@ typedef SeenStream<boost::asio::ssl::stream<boost::asio::ip::tcp::socket>> AsioT
7072
class UnbufferedAsioTlsStream : public AsioTcpTlsStream
7173
{
7274
public:
73-
inline
74-
UnbufferedAsioTlsStream(UnbufferedAsioTlsStreamParams& init)
75-
: AsioTcpTlsStream(init.IoContext, init.SslContext), m_Hostname(init.Hostname)
75+
template<typename Exec>
76+
UnbufferedAsioTlsStream(UnbufferedAsioTlsStreamParams<Exec>& init)
77+
: AsioTcpTlsStream(init.IoExecutor, init.SslContext), m_Hostname(init.Hostname)
7678
{
7779
}
7880

@@ -107,18 +109,18 @@ class UnbufferedAsioTlsStream : public AsioTcpTlsStream
107109
class AsioTlsStream : public boost::asio::buffered_stream<UnbufferedAsioTlsStream>
108110
{
109111
public:
110-
inline
111-
AsioTlsStream(boost::asio::io_context& ioContext, boost::asio::ssl::context& sslContext, const String& hostname = String())
112-
: AsioTlsStream(UnbufferedAsioTlsStreamParams{ioContext, sslContext, hostname})
112+
template<typename Exec>
113+
AsioTlsStream(Exec& exec, boost::asio::ssl::context& sslContext, const String& hostname = String())
114+
: AsioTlsStream(UnbufferedAsioTlsStreamParams<Exec>{exec, sslContext, hostname})
113115
{
114116
}
115117

116118
void ForceDisconnect();
117-
void GracefulDisconnect(boost::asio::io_context::strand& strand, boost::asio::yield_context& yc);
119+
void GracefulDisconnect(IoStrand& strand, boost::asio::yield_context& yc);
118120

119121
private:
120-
inline
121-
AsioTlsStream(UnbufferedAsioTlsStreamParams init)
122+
template<typename Exec>
123+
AsioTlsStream(UnbufferedAsioTlsStreamParams<Exec> init)
122124
: buffered_stream(init)
123125
{
124126
}

lib/icingadb/redisconnection.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ RedisConnection::RedisConnection(
4040
bool trackOwnPendingQueries
4141
)
4242
: m_ConnInfo{connInfo},
43-
m_Strand(io),
43+
m_Strand(io.get_executor()),
4444
m_Connecting(false),
4545
m_Connected(false),
4646
m_Started(false),
@@ -285,7 +285,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
285285
{
286286
Defer notConnecting ([this]() { m_Connecting.store(m_Connected.load()); });
287287

288-
boost::asio::deadline_timer timer (m_Strand.context());
288+
boost::asio::deadline_timer timer (m_Strand.get_inner_executor().context());
289289

290290
for (;;) {
291291
try {
@@ -294,7 +294,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
294294
Log(m_Parent ? LogNotice : LogInformation, "IcingaDB")
295295
<< "Trying to connect to Redis server (async, TLS) on host '" << m_ConnInfo->Host << ":" << m_ConnInfo->Port << "'";
296296

297-
auto conn (Shared<AsioTlsStream>::Make(m_Strand.context(), *m_TLSContext, m_ConnInfo->Host));
297+
auto conn (Shared<AsioTlsStream>::Make(m_Strand.get_inner_executor().context(), *m_TLSContext, m_ConnInfo->Host));
298298
auto& tlsConn (conn->next_layer());
299299
auto connectTimeout (MakeTimeout(conn));
300300

@@ -324,7 +324,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
324324
Log(m_Parent ? LogNotice : LogInformation, "IcingaDB")
325325
<< "Trying to connect to Redis server (async) on host '" << m_ConnInfo->Host << ":" << m_ConnInfo->Port << "'";
326326

327-
auto conn (Shared<TcpConn>::Make(m_Strand.context()));
327+
auto conn (Shared<TcpConn>::Make(m_Strand.get_inner_executor().context()));
328328
auto connectTimeout (MakeTimeout(conn));
329329

330330
icinga::Connect(conn->next_layer(), m_ConnInfo->Host, Convert::ToString(m_ConnInfo->Port), yc);
@@ -336,7 +336,7 @@ void RedisConnection::Connect(asio::yield_context& yc)
336336
Log(LogInformation, "IcingaDB")
337337
<< "Trying to connect to Redis server (async) on unix socket path '" << m_ConnInfo->Path << "'";
338338

339-
auto conn (Shared<UnixConn>::Make(m_Strand.context()));
339+
auto conn (Shared<UnixConn>::Make(m_Strand.get_inner_executor().context()));
340340
auto connectTimeout (MakeTimeout(conn));
341341

342342
conn->next_layer().async_connect(Unix::endpoint(m_ConnInfo->Path.CStr()), yc);

lib/icingadb/redisconnection.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include <boost/asio/buffered_stream.hpp>
2020
#include <boost/asio/deadline_timer.hpp>
2121
#include <boost/asio/io_context.hpp>
22-
#include <boost/asio/io_context_strand.hpp>
2322
#include <boost/asio/ip/tcp.hpp>
2423
#include <boost/asio/local/stream_protocol.hpp>
2524
#include <boost/asio/read.hpp>
@@ -289,7 +288,7 @@ struct RedisConnInfo final : SharedObject
289288

290289
RedisConnInfo::ConstPtr m_ConnInfo; // Redis connection info (immutable)
291290

292-
boost::asio::io_context::strand m_Strand;
291+
IoStrand m_Strand;
293292
Shared<TcpConn>::Ptr m_TcpConn;
294293
Shared<UnixConn>::Ptr m_UnixConn;
295294
Shared<AsioTlsStream>::Ptr m_TlsConn;

lib/methods/ifwapichecktask.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,7 @@ void IfwApiCheckTask::ScriptFunc(const Checkable::Ptr& checkable, const CheckRes
436436
}
437437

438438
auto& io (IoEngine::Get().GetIoContext());
439-
auto strand (Shared<asio::io_context::strand>::Make(io));
439+
auto strand (std::make_shared<IoStrand>(io.get_executor()));
440440
Shared<asio::ssl::context>::Ptr ctx;
441441

442442
cr->SetExecutionStart(Utility::GetTime());

lib/otel/otel.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ OTel::OTel(OTelConnInfo& connInfo): OTel{connInfo, IoEngine::Get().GetIoContext(
6262

6363
OTel::OTel(OTelConnInfo& connInfo, boost::asio::io_context& io)
6464
: m_ConnInfo{std::move(connInfo)},
65-
m_Strand{io},
65+
m_Strand{io.get_executor()},
6666
m_ExportAsioCV{io},
6767
m_RetryExportAndConnTimer{io},
6868
m_Exporting{false},
@@ -241,9 +241,9 @@ void OTel::Connect(boost::asio::yield_context& yc)
241241
try {
242242
decltype(m_Stream) stream;
243243
if (m_ConnInfo.EnableTls) {
244-
stream = Shared<AsioTlsStream>::Make(m_Strand.context(), *m_TlsContext, m_ConnInfo.Host);
244+
stream = Shared<AsioTlsStream>::Make(m_Strand.get_inner_executor().context(), *m_TlsContext, m_ConnInfo.Host);
245245
} else {
246-
stream = Shared<AsioTcpStream>::Make(m_Strand.context());
246+
stream = Shared<AsioTcpStream>::Make(m_Strand.get_inner_executor().context());
247247
}
248248

249249
Timeout timeout{m_Strand, boost::posix_time::seconds(10), [this, stream] {

lib/otel/otel.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ class OTel : public SharedObject
111111
const OTelConnInfo m_ConnInfo;
112112
std::optional<AsioTlsOrTcpStream> m_Stream;
113113
Shared<boost::asio::ssl::context>::Ptr m_TlsContext;
114-
boost::asio::io_context::strand m_Strand;
114+
IoStrand m_Strand;
115115

116116
AsioConditionVariable m_ExportAsioCV; // Event to signal when a new export request is available.
117117
// Timer for scheduling retries of failed exports and reconnection attempts.

lib/perfdata/perfdatawriterconnection.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ PerfdataWriterConnection::PerfdataWriterConnection(
4242
m_Host(std::move(host)),
4343
m_Port(std::move(port)),
4444
m_ReconnectTimer(IoEngine::Get().GetIoContext()),
45-
m_Strand(IoEngine::Get().GetIoContext()),
45+
m_Strand(IoEngine::Get().GetIoContext().get_executor()),
4646
m_Stream(MakeStream())
4747
{
4848
}

0 commit comments

Comments
 (0)