From: Remi Gacogne Date: Fri, 2 Oct 2020 13:43:57 +0000 (+0200) Subject: dnsdist: Account for outstanding TCP queries X-Git-Tag: auth-4.5.0-alpha0~14^2~7 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ce6fdb990b763bdf5ed7e9a6ccb7cdd25ed54147;p=thirdparty%2Fpdns.git dnsdist: Account for outstanding TCP queries --- diff --git a/pdns/dnsdistdist/dnsdist-tcp-downstream.cc b/pdns/dnsdistdist/dnsdist-tcp-downstream.cc index 8b19b8d7de..2864c706d6 100644 --- a/pdns/dnsdistdist/dnsdist-tcp-downstream.cc +++ b/pdns/dnsdistdist/dnsdist-tcp-downstream.cc @@ -99,6 +99,10 @@ IOState TCPConnectionToBackend::sendQuery(std::shared_ptrd_pendingResponses[conn->d_currentQuery.d_idstate.origID] = std::move(conn->d_currentQuery); conn->d_currentQuery.d_buffer.clear(); + if (!conn->d_usedForXFR) { + ++conn->d_ds->outstanding; + } + return IOState::Done; } else { @@ -200,6 +204,7 @@ void TCPConnectionToBackend::handleIO(std::shared_ptr& c } if (connectionDied) { + bool reconnected = false; DEBUGLOG("connection died, number of failures is "<d_downstreamFailures<<", retries is "<d_ds->retries); @@ -214,6 +219,9 @@ void TCPConnectionToBackend::handleIO(std::shared_ptr& c /* we need to resend the queries that were in flight, if any */ for (auto& pending : conn->d_pendingResponses) { conn->d_pendingQueries.push_back(std::move(pending.second)); + if (!conn->d_usedForXFR) { + --conn->d_ds->outstanding; + } } conn->d_pendingResponses.clear(); conn->d_currentPos = 0; @@ -383,6 +391,10 @@ void TCPConnectionToBackend::notifyAllQueriesFailed(const struct timeval& now, b { d_connectionDied = true; + if (!d_usedForXFR) { + d_ds->outstanding -= d_pendingResponses.size(); + } + auto& clientConn = d_clientConn; if (!clientConn->active()) { // a client timeout occured, or something like that */ @@ -421,6 +433,11 @@ IOState TCPConnectionToBackend::handleResponse(std::shared_ptrd_usedForXFR) { + --conn->d_ds->outstanding; + } + return IOState::Done; } @@ -454,6 +471,10 @@ IOState TCPConnectionToBackend::handleResponse(std::shared_ptrd_usedForXFR) { + --conn->d_ds->outstanding; + } + auto ids = std::move(it->second.d_idstate); d_pendingResponses.erase(it); DEBUGLOG("passing response to client connection for "<