From: Remi Gacogne Date: Fri, 29 Mar 2024 14:08:29 +0000 (+0100) Subject: dnsdist: Release failed TCP backend connections more quickly X-Git-Tag: rec-5.1.0-alpha1~72^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F14004%2Fhead;p=thirdparty%2Fpdns.git dnsdist: Release failed TCP backend connections more quickly After a timeout we cannot reuse the TCP connection to the backend anyway, so let's release it immediately. --- diff --git a/pdns/dnsdistdist/dnsdist-tcp-downstream.cc b/pdns/dnsdistdist/dnsdist-tcp-downstream.cc index 684c46fcee..e72d9ac180 100644 --- a/pdns/dnsdistdist/dnsdist-tcp-downstream.cc +++ b/pdns/dnsdistdist/dnsdist-tcp-downstream.cc @@ -146,6 +146,13 @@ void TCPConnectionToBackend::release(){ if (d_ioState) { d_ioState.reset(); } + + auto shared = std::dynamic_pointer_cast(shared_from_this()); + if (!willBeReusable(true)) { + /* remove ourselves from the connection cache, this might mean that our + reference count drops to zero after that, so we need to be careful */ + t_downstreamTCPConnectionsManager.removeDownstreamConnection(shared); + } } static uint32_t getSerialFromRawSOAContent(const std::vector& raw) diff --git a/pdns/dnsdistdist/test-dnsdisttcp_cc.cc b/pdns/dnsdistdist/test-dnsdisttcp_cc.cc index 3566d61c50..a27029361b 100644 --- a/pdns/dnsdistdist/test-dnsdisttcp_cc.cc +++ b/pdns/dnsdistdist/test-dnsdisttcp_cc.cc @@ -3620,8 +3620,8 @@ BOOST_FIXTURE_TEST_CASE(test_IncomingConnectionOOOR_BackendOOOR, TestFixture) g_tcpRecvTimeout = 2; /* we need to clear them now, otherwise we end up with dangling pointers to the steps via the TLS context, etc */ - /* we have one connection to clear, no proxy protocol */ - BOOST_CHECK_EQUAL(IncomingTCPConnectionState::clearAllDownstreamConnections(), 1U); + /* we have no connection to clear, because there was a timeout! */ + BOOST_CHECK_EQUAL(IncomingTCPConnectionState::clearAllDownstreamConnections(), 0U); } {