]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Don't scan for TCP timeouts more than once every second
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 21 Mar 2019 17:45:40 +0000 (18:45 +0100)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 4 Apr 2019 09:54:04 +0000 (11:54 +0200)
pdns/dnsdist-tcp.cc

index 9889583e98bb184c035e5d1a74b4adcc5b395efb..97ca4c73e056080cfcd6948744e6262f74803b1e 100644 (file)
@@ -1026,6 +1026,7 @@ void tcpClientThread(int pipefd)
 
   data.mplexer->addReadFD(pipefd, handleIncomingTCPQuery, &data);
   time_t lastTCPCleanup = time(nullptr);
+  time_t lastTimeoutScan = time(nullptr);
   struct timeval now;
   gettimeofday(&now, 0);
 
@@ -1037,30 +1038,33 @@ void tcpClientThread(int pipefd)
       lastTCPCleanup = now.tv_sec;
     }
 
-    auto expiredReadConns = data.mplexer->getTimeouts(now, false);
-    for(const auto& conn : expiredReadConns) {
-      auto state = boost::any_cast<std::shared_ptr<IncomingTCPConnectionState>>(conn.second);
-      if (conn.first == state->d_ci.fd) {
-        vinfolog("Timeout (read) from remote TCP client %s", state->d_ci.remote.toStringWithPort());
-      }
-      else if (state->d_ds) {
-        vinfolog("Timeout (read) from remote backend %s", state->d_ds->getName());
+    if (now.tv_sec > lastTimeoutScan) {
+      lastTimeoutScan = now.tv_sec;
+      auto expiredReadConns = data.mplexer->getTimeouts(now, false);
+      for(const auto& conn : expiredReadConns) {
+        auto state = boost::any_cast<std::shared_ptr<IncomingTCPConnectionState>>(conn.second);
+        if (conn.first == state->d_ci.fd) {
+          vinfolog("Timeout (read) from remote TCP client %s", state->d_ci.remote.toStringWithPort());
+        }
+        else if (state->d_ds) {
+          vinfolog("Timeout (read) from remote backend %s", state->d_ds->getName());
+        }
+        data.mplexer->removeReadFD(conn.first);
+        state->d_lastIOState = IOState::Done;
       }
-      data.mplexer->removeReadFD(conn.first);
-      state->d_lastIOState = IOState::Done;
-    }
 
-    auto expiredWriteConns = data.mplexer->getTimeouts(now, true);
-    for(const auto& conn : expiredWriteConns) {
-      auto state = boost::any_cast<std::shared_ptr<IncomingTCPConnectionState>>(conn.second);
-      if (conn.first == state->d_ci.fd) {
-        vinfolog("Timeout (write) from remote TCP client %s", state->d_ci.remote.toStringWithPort());
-      }
-      else if (state->d_ds) {
-        vinfolog("Timeout (write) from remote backend %s", state->d_ds->getName());
+      auto expiredWriteConns = data.mplexer->getTimeouts(now, true);
+      for(const auto& conn : expiredWriteConns) {
+        auto state = boost::any_cast<std::shared_ptr<IncomingTCPConnectionState>>(conn.second);
+        if (conn.first == state->d_ci.fd) {
+          vinfolog("Timeout (write) from remote TCP client %s", state->d_ci.remote.toStringWithPort());
+        }
+        else if (state->d_ds) {
+          vinfolog("Timeout (write) from remote backend %s", state->d_ds->getName());
+        }
+        data.mplexer->removeWriteFD(conn.first);
+        state->d_lastIOState = IOState::Done;
       }
-      data.mplexer->removeWriteFD(conn.first);
-      state->d_lastIOState = IOState::Done;
     }
   }
 }