Skip to content

Commit 09eaa19

Browse files
Add debug output to find bug in PerfdataWriterConnection
1 parent 9f46abc commit 09eaa19

5 files changed

Lines changed: 33 additions & 1 deletion

File tree

Containerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ RUN --mount=type=bind,source=.,target=/icinga2,readonly \
128128
-DICINGA2_WITH_LIVESTATUS=OFF && \
129129
make -j$([ "$MAKE_JOBS" = auto ] && nproc || echo "$MAKE_JOBS") && \
130130
if [ "${ICINGA2_BUILD_TESTING}" = ON ]; then \
131-
ctest -j$([ "$MAKE_JOBS" = auto ] && nproc || echo "$MAKE_JOBS") --output-on-failure; \
131+
ctest -j$([ "$MAKE_JOBS" = auto ] && nproc || echo "$MAKE_JOBS") --verbose; \
132132
fi && \
133133
make install DESTDIR=/icinga2-install
134134

lib/base/tcpsocket.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ void Connect(Socket& socket, const String& node, const String& service, boost::a
8383

8484
break;
8585
} catch (const std::exception& ex) {
86+
Log(LogDebug, "Connect") << "Execption: " << ex.what();
8687
auto se (dynamic_cast<const boost::system::system_error*>(&ex));
8788

8889
if ((se && se->code() == boost::asio::error::operation_aborted) || ++current == result.end()) {

lib/perfdata/perfdatawriterconnection.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ void PerfdataWriterConnection::Disconnect()
6969
std::promise<void> promise;
7070

7171
IoEngine::SpawnCoroutine(m_Strand, [&](boost::asio::yield_context yc) {
72+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Disconnect::1";
7273
try {
7374
/* Cancel any outstanding operations of the other coroutine.
7475
* Since we're on the same strand we're hopefully guaranteed that all cancellations
@@ -85,9 +86,12 @@ void PerfdataWriterConnection::Disconnect()
8586
);
8687
m_ReconnectTimer.cancel();
8788

89+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Disconnect::3";
8890
Disconnect(std::move(yc));
91+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Disconnect::4";
8992
promise.set_value();
9093
} catch (const std::exception& ex) {
94+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Disconnect::5";
9195
promise.set_exception(std::current_exception());
9296
}
9397
});
@@ -130,12 +134,16 @@ void PerfdataWriterConnection::EnsureConnected(const boost::asio::yield_context&
130134

131135
std::visit(
132136
[&](auto& stream) {
137+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::EnsureConnected::1";
133138
::Connect(stream->lowest_layer(), m_Host, m_Port, yc);
139+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::EnsureConnected::2";
134140

135141
if constexpr (std::is_same_v<std::decay_t<decltype(stream)>, Shared<AsioTlsStream>::Ptr>) {
142+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::EnsureConnected::3";
136143
using type = boost::asio::ssl::stream_base::handshake_type;
137144

138145
stream->next_layer().async_handshake(type::client, yc);
146+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::EnsureConnected::4";
139147

140148
if (m_VerifyPeerCertificate) {
141149
if (!stream->next_layer().IsVerifyOK()) {

lib/perfdata/perfdatawriterconnection.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,28 @@ class PerfdataWriterConnection final : public Object
6161
template<typename Buffer>
6262
auto Send(Buffer&& buf)
6363
{
64+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::1";
6465
if (m_Stopped) {
66+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::1.1";
6567
BOOST_THROW_EXCEPTION(Stopped{});
6668
}
69+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::2";
6770

6871
using RetType = decltype(WriteMessage(std::declval<Buffer>(), std::declval<boost::asio::yield_context>()));
6972
std::promise<RetType> promise;
7073

7174
IoEngine::SpawnCoroutine(m_Strand, [&](boost::asio::yield_context yc) {
75+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::3";
76+
7277
while (true) {
7378
try {
79+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::5";
7480
EnsureConnected(yc);
81+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::6";
7582

7683
if constexpr (std::is_void_v<RetType>) {
7784
WriteMessage(std::forward<Buffer>(buf), yc);
85+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::7";
7886
promise.set_value();
7987
} else {
8088
promise.set_value(WriteMessage(std::forward<Buffer>(buf), yc));
@@ -83,7 +91,9 @@ class PerfdataWriterConnection final : public Object
8391
m_RetryTimeout = InitialRetryWait;
8492
return;
8593
} catch (const std::exception& ex) {
94+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::8";
8695
if (m_Stopped) {
96+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::8.1";
8797
promise.set_exception(std::make_exception_ptr(Stopped{}));
8898
return;
8999
}
@@ -96,8 +106,11 @@ class PerfdataWriterConnection final : public Object
96106
m_Connected = false;
97107

98108
try {
109+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::9";
99110
BackoffWait(yc);
111+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::10";
100112
} catch (const std::exception&) {
113+
Log(LogDebug, m_LogFacility) << "PerfdataWriterConnection::Send::11";
101114
promise.set_exception(std::make_exception_ptr(Stopped{}));
102115
return;
103116
}

test/perfdata-perfdatawriterconnection.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,29 @@ BOOST_AUTO_TEST_CASE(finish_during_timeout)
130130
*/
131131
BOOST_AUTO_TEST_CASE(stuck_in_handshake)
132132
{
133+
Logger::SetConsoleLogSeverity(LogDebug);
134+
Logger::EnableConsoleLog();
135+
Log(LogDebug, "stuck_in_handshake") << "1";
133136
std::promise<void> p;
134137
TestThread timeoutThread{[&]() {
138+
Log(LogDebug, "stuck_in_handshake") << "2";
135139
Accept();
140+
Log(LogDebug, "stuck_in_handshake") << "3";
136141
auto f = p.get_future();
137142
GetConnection().CancelAfterTimeout(f, 50ms);
143+
Log(LogDebug, "stuck_in_handshake") << "4";
138144
BOOST_REQUIRE(f.wait_for(0ms) == std::future_status::timeout);
145+
Log(LogDebug, "stuck_in_handshake") << "5";
139146
}};
140147

148+
Log(LogDebug, "stuck_in_handshake") << "6";
141149
BOOST_REQUIRE_THROW(
142150
GetConnection().Send(boost::asio::const_buffer{"foobar", 7}), PerfdataWriterConnection::Stopped
143151
);
152+
Log(LogDebug, "stuck_in_handshake") << "7";
144153

145154
REQUIRE_JOINS_WITHIN(timeoutThread, 1s);
155+
Log(LogDebug, "stuck_in_handshake") << "8";
146156
}
147157

148158
/* When the disconnect timeout runs out while sending something to a slow or blocking server, we

0 commit comments

Comments
 (0)