summaryrefslogtreecommitdiff
path: root/net-analyzer/icinga2/files
diff options
context:
space:
mode:
authorV3n3RiX <venerix@koprulu.sector>2025-04-11 08:43:59 +0100
committerV3n3RiX <venerix@koprulu.sector>2025-04-11 08:43:59 +0100
commitbb59556b3302a941db4630613c604644d5f7a617 (patch)
tree42e60b7ae227b0fe3af52dfac08d59653066a2db /net-analyzer/icinga2/files
parent3cd09a18bad26aad2645241b868755cfdf41b6ae (diff)
gentoo auto-resync : 11:04:2025 - 08:43:58HEADmaster
Diffstat (limited to 'net-analyzer/icinga2/files')
-rw-r--r--net-analyzer/icinga2/files/icinga2-2.14.5-boost-1.87.patch380
1 files changed, 380 insertions, 0 deletions
diff --git a/net-analyzer/icinga2/files/icinga2-2.14.5-boost-1.87.patch b/net-analyzer/icinga2/files/icinga2-2.14.5-boost-1.87.patch
new file mode 100644
index 000000000000..1c208f983a84
--- /dev/null
+++ b/net-analyzer/icinga2/files/icinga2-2.14.5-boost-1.87.patch
@@ -0,0 +1,380 @@
+https://bugs.gentoo.org/946671
+https://github.com/Icinga/icinga2/pull/10278
+
+From 69e4f295a6bd5cdafb295379b207ab611c8501a6 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Alexander=20Aleksandrovi=C4=8D=20Klimov?=
+ <al2klimov@gmail.com>
+Date: Tue, 7 Jan 2025 15:53:20 +0100
+Subject: [PATCH 2/5] Don't use boost::asio::ip::tcp::resolver::query
+
+It was removed in Boost 1.87.
+---
+ lib/base/tcpsocket.hpp | 6 ++----
+ lib/remote/apilistener.cpp | 4 +---
+ 2 files changed, 3 insertions(+), 7 deletions(-)
+
+diff --git a/lib/base/tcpsocket.hpp b/lib/base/tcpsocket.hpp
+index 471ad8d2394..1cf1a235010 100644
+--- a/lib/base/tcpsocket.hpp
++++ b/lib/base/tcpsocket.hpp
+@@ -41,8 +41,7 @@ void Connect(Socket& socket, const String& node, const String& service)
+ using boost::asio::ip::tcp;
+
+ tcp::resolver resolver (IoEngine::Get().GetIoContext());
+- tcp::resolver::query query (node, service);
+- auto result (resolver.resolve(query));
++ auto result (resolver.resolve(node.CStr(), service.CStr()));
+ auto current (result.begin());
+
+ for (;;) {
+@@ -72,8 +71,7 @@ void Connect(Socket& socket, const String& node, const String& service, boost::a
+ using boost::asio::ip::tcp;
+
+ tcp::resolver resolver (IoEngine::Get().GetIoContext());
+- tcp::resolver::query query (node, service);
+- auto result (resolver.async_resolve(query, yc));
++ auto result (resolver.async_resolve(node.CStr(), service.CStr(), yc));
+ auto current (result.begin());
+
+ for (;;) {
+diff --git a/lib/remote/apilistener.cpp b/lib/remote/apilistener.cpp
+index 519469aafa4..7ef3acddda7 100644
+--- a/lib/remote/apilistener.cpp
++++ b/lib/remote/apilistener.cpp
+@@ -439,9 +439,7 @@ bool ApiListener::AddListener(const String& node, const String& service)
+
+ try {
+ tcp::resolver resolver (io);
+- tcp::resolver::query query (node, service, tcp::resolver::query::passive);
+-
+- auto result (resolver.resolve(query));
++ auto result (resolver.resolve(node.CStr(), service.CStr(), tcp::resolver::passive));
+ auto current (result.begin());
+
+ for (;;) {
+
+From 6e1bafad83a1d5cbd646a947575b29f00c23d130 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Alexander=20Aleksandrovi=C4=8D=20Klimov?=
+ <alexander.klimov@icinga.com>
+Date: Tue, 7 Jan 2025 17:53:42 +0100
+Subject: [PATCH 3/5] Don't use boost::asio::io_context::strand method removed
+ in Boost 1.87
+
+---
+ lib/remote/jsonrpcconnection.cpp | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/lib/remote/jsonrpcconnection.cpp b/lib/remote/jsonrpcconnection.cpp
+index d49c0b359a0..8e95325feb3 100644
+--- a/lib/remote/jsonrpcconnection.cpp
++++ b/lib/remote/jsonrpcconnection.cpp
+@@ -212,7 +212,7 @@ void JsonRpcConnection::SendMessage(const Dictionary::Ptr& message)
+
+ Ptr keepAlive (this);
+
+- m_IoStrand.post([this, keepAlive, message]() { SendMessageInternal(message); });
++ boost::asio::post(m_IoStrand, [this, keepAlive, message] { SendMessageInternal(message); });
+ }
+
+ void JsonRpcConnection::SendRawMessage(const String& message)
+@@ -223,7 +223,7 @@ void JsonRpcConnection::SendRawMessage(const String& message)
+
+ Ptr keepAlive (this);
+
+- m_IoStrand.post([this, keepAlive, message]() {
++ boost::asio::post(m_IoStrand, [this, keepAlive, message] {
+ if (m_ShuttingDown) {
+ return;
+ }
+
+From 5e058f46289f603338d02ad61524886d6cc3e26a Mon Sep 17 00:00:00 2001
+From: "Alexander A. Klimov" <alexander.klimov@icinga.com>
+Date: Fri, 7 Mar 2025 16:22:50 +0100
+Subject: [PATCH 4/5] In a coroutine, re-throw everything ex. std::exception
+ (and inheritors)
+
+not just boost::coroutines::detail::forced_unwind.
+
+This is needed because as of Boost 1.87, boost::asio::spawn() uses Fiber, not Coroutine v1.
+https://github.com/boostorg/asio/commit/df973a85ed69f021
+
+This is safe because every actual exception shall inherit from std::exception. Except forced_unwind and its Fiber equivalent, so that `catch(const std::exception&)` doesn't catch them and only them.
+---
+ lib/base/io-engine.hpp | 13 ++++++----
+ lib/icingadb/redisconnection.cpp | 41 ++++----------------------------
+ lib/icingadb/redisconnection.hpp | 8 ++-----
+ 3 files changed, 14 insertions(+), 48 deletions(-)
+
+diff --git a/lib/base/io-engine.hpp b/lib/base/io-engine.hpp
+index 0350d45b83d..55a06fb6a67 100644
+--- a/lib/base/io-engine.hpp
++++ b/lib/base/io-engine.hpp
+@@ -106,14 +106,17 @@ class IoEngine
+
+ try {
+ f(yc);
+- } catch (const boost::coroutines::detail::forced_unwind &) {
+- // Required for proper stack unwinding when coroutines are destroyed.
+- // https://github.com/boostorg/coroutine/issues/39
+- throw;
+ } catch (const std::exception& ex) {
+ Log(LogCritical, "IoEngine") << "Exception in coroutine: " << DiagnosticInformation(ex);
+ } catch (...) {
+- Log(LogCritical, "IoEngine", "Exception in coroutine!");
++ try {
++ Log(LogCritical, "IoEngine", "Exception in coroutine!");
++ } catch (...) {
++ }
++
++ // Required for proper stack unwinding when coroutines are destroyed.
++ // https://github.com/boostorg/coroutine/issues/39
++ throw;
+ }
+ },
+ boost::coroutines::attributes(GetCoroutineStackSize()) // Set a pre-defined stack size.
+diff --git a/lib/icingadb/redisconnection.cpp b/lib/icingadb/redisconnection.cpp
+index a6b82187dd0..c1f73f5a0e6 100644
+--- a/lib/icingadb/redisconnection.cpp
++++ b/lib/icingadb/redisconnection.cpp
+@@ -377,8 +377,6 @@ void RedisConnection::Connect(asio::yield_context& yc)
+ }
+
+ break;
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+ } catch (const std::exception& ex) {
+ Log(LogCritical, "IcingaDB")
+ << "Cannot connect to " << m_Host << ":" << m_Port << ": " << ex.what();
+@@ -408,17 +406,10 @@ void RedisConnection::ReadLoop(asio::yield_context& yc)
+ for (auto i (item.Amount); i; --i) {
+ ReadOne(yc);
+ }
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+ } catch (const std::exception& ex) {
+ Log(LogCritical, "IcingaDB")
+ << "Error during receiving the response to a query which has been fired and forgotten: " << ex.what();
+
+- continue;
+- } catch (...) {
+- Log(LogCritical, "IcingaDB")
+- << "Error during receiving the response to a query which has been fired and forgotten";
+-
+ continue;
+ }
+
+@@ -432,9 +423,7 @@ void RedisConnection::ReadLoop(asio::yield_context& yc)
+
+ try {
+ reply = ReadOne(yc);
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+- } catch (...) {
++ } catch (const std::exception&) {
+ promise.set_exception(std::current_exception());
+
+ continue;
+@@ -455,9 +444,7 @@ void RedisConnection::ReadLoop(asio::yield_context& yc)
+ for (auto i (item.Amount); i; --i) {
+ try {
+ replies.emplace_back(ReadOne(yc));
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+- } catch (...) {
++ } catch (const std::exception&) {
+ promise.set_exception(std::current_exception());
+ break;
+ }
+@@ -551,19 +538,11 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection:
+
+ try {
+ WriteOne(item, yc);
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+ } catch (const std::exception& ex) {
+ Log msg (LogCritical, "IcingaDB", "Error during sending query");
+ LogQuery(item, msg);
+ msg << " which has been fired and forgotten: " << ex.what();
+
+- return;
+- } catch (...) {
+- Log msg (LogCritical, "IcingaDB", "Error during sending query");
+- LogQuery(item, msg);
+- msg << " which has been fired and forgotten";
+-
+ return;
+ }
+
+@@ -587,19 +566,11 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection:
+ WriteOne(query, yc);
+ ++i;
+ }
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+ } catch (const std::exception& ex) {
+ Log msg (LogCritical, "IcingaDB", "Error during sending query");
+ LogQuery(item[i], msg);
+ msg << " which has been fired and forgotten: " << ex.what();
+
+- return;
+- } catch (...) {
+- Log msg (LogCritical, "IcingaDB", "Error during sending query");
+- LogQuery(item[i], msg);
+- msg << " which has been fired and forgotten";
+-
+ return;
+ }
+
+@@ -618,9 +589,7 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection:
+
+ try {
+ WriteOne(item.first, yc);
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+- } catch (...) {
++ } catch (const std::exception&) {
+ item.second.set_exception(std::current_exception());
+
+ return;
+@@ -645,9 +614,7 @@ void RedisConnection::WriteItem(boost::asio::yield_context& yc, RedisConnection:
+ for (auto& query : item.first) {
+ WriteOne(query, yc);
+ }
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+- } catch (...) {
++ } catch (const std::exception&) {
+ item.second.set_exception(std::current_exception());
+
+ return;
+diff --git a/lib/icingadb/redisconnection.hpp b/lib/icingadb/redisconnection.hpp
+index 3f963f3d37d..acc6e43810c 100644
+--- a/lib/icingadb/redisconnection.hpp
++++ b/lib/icingadb/redisconnection.hpp
+@@ -389,9 +389,7 @@ RedisConnection::Reply RedisConnection::ReadOne(StreamPtr& stream, boost::asio::
+
+ try {
+ return ReadRESP(*strm, yc);
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+- } catch (...) {
++ } catch (const std::exception&) {
+ if (m_Connecting.exchange(false)) {
+ m_Connected.store(false);
+ stream = nullptr;
+@@ -427,9 +425,7 @@ void RedisConnection::WriteOne(StreamPtr& stream, RedisConnection::Query& query,
+ try {
+ WriteRESP(*strm, query, yc);
+ strm->async_flush(yc);
+- } catch (const boost::coroutines::detail::forced_unwind&) {
+- throw;
+- } catch (...) {
++ } catch (const std::exception&) {
+ if (m_Connecting.exchange(false)) {
+ m_Connected.store(false);
+ stream = nullptr;
+
+From 62221b2d60078dda09463a0d5ed96f1fdbacdaf0 Mon Sep 17 00:00:00 2001
+From: "Alexander A. Klimov" <alexander.klimov@icinga.com>
+Date: Fri, 7 Mar 2025 15:47:37 +0100
+Subject: [PATCH 5/5] Don't use removed boost::asio::spawn() overload if Boost
+ >= v1.87
+
+---
+ lib/base/io-engine.hpp | 13 +++++++++++++
+ test/base-io-engine.cpp | 10 +++++-----
+ 2 files changed, 18 insertions(+), 5 deletions(-)
+
+diff --git a/lib/base/io-engine.hpp b/lib/base/io-engine.hpp
+index 55a06fb6a67..2083b62f87d 100644
+--- a/lib/base/io-engine.hpp
++++ b/lib/base/io-engine.hpp
+@@ -16,11 +16,16 @@
+ #include <utility>
+ #include <vector>
+ #include <stdexcept>
++#include <boost/context/fixedsize_stack.hpp>
+ #include <boost/exception/all.hpp>
+ #include <boost/asio/deadline_timer.hpp>
+ #include <boost/asio/io_context.hpp>
+ #include <boost/asio/spawn.hpp>
+
++#if BOOST_VERSION >= 108700
++# include <boost/asio/detached.hpp>
++#endif // BOOST_VERSION >= 108700
++
+ namespace icinga
+ {
+
+@@ -102,6 +107,10 @@ class IoEngine
+ static void SpawnCoroutine(Handler& h, Function f) {
+
+ boost::asio::spawn(h,
++#if BOOST_VERSION >= 108700
++ std::allocator_arg,
++ boost::context::fixedsize_stack(GetCoroutineStackSize()),
++#endif // BOOST_VERSION >= 108700
+ [f](boost::asio::yield_context yc) {
+
+ try {
+@@ -119,7 +128,11 @@ class IoEngine
+ throw;
+ }
+ },
++#if BOOST_VERSION >= 108700
++ boost::asio::detached
++#else // BOOST_VERSION >= 108700
+ boost::coroutines::attributes(GetCoroutineStackSize()) // Set a pre-defined stack size.
++#endif // BOOST_VERSION >= 108700
+ );
+ }
+
+diff --git a/test/base-io-engine.cpp b/test/base-io-engine.cpp
+index 869688b1a67..3a251b1b421 100644
+--- a/test/base-io-engine.cpp
++++ b/test/base-io-engine.cpp
+@@ -17,7 +17,7 @@ BOOST_AUTO_TEST_CASE(timeout_run)
+ boost::asio::io_context::strand strand (io);
+ int called = 0;
+
+- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
+ boost::asio::deadline_timer timer (io);
+
+ Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
+@@ -44,7 +44,7 @@ BOOST_AUTO_TEST_CASE(timeout_cancelled)
+ boost::asio::io_context::strand strand (io);
+ int called = 0;
+
+- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
+ boost::asio::deadline_timer timer (io);
+ Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
+
+@@ -71,7 +71,7 @@ BOOST_AUTO_TEST_CASE(timeout_scope)
+ boost::asio::io_context::strand strand (io);
+ int called = 0;
+
+- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
+ boost::asio::deadline_timer timer (io);
+
+ {
+@@ -100,7 +100,7 @@ BOOST_AUTO_TEST_CASE(timeout_due_cancelled)
+ boost::asio::io_context::strand strand (io);
+ int called = 0;
+
+- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
+ boost::asio::deadline_timer timer (io);
+ Timeout timeout (strand, boost::posix_time::millisec(300), [&called] { ++called; });
+
+@@ -131,7 +131,7 @@ BOOST_AUTO_TEST_CASE(timeout_due_scope)
+ boost::asio::io_context::strand strand (io);
+ int called = 0;
+
+- boost::asio::spawn(strand, [&](boost::asio::yield_context yc) {
++ IoEngine::SpawnCoroutine(strand, [&](boost::asio::yield_context yc) {
+ boost::asio::deadline_timer timer (io);
+
+ {