]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Keep trying if the first connection to the remote logger failed 5770/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 5 Oct 2017 09:53:51 +0000 (11:53 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 5 Oct 2017 13:32:19 +0000 (15:32 +0200)
Instead of waiting to have a message to send, causing some messages
to be lost in some cases because we would detect the failure too
late in the process.

pdns/remote_logger.cc
pdns/remote_logger.hh

index 07ab13e13319db2dbe699e886057db1d74b373d8..9844cc132a953a75d80ecbae4730d2e3c342ce87 100644 (file)
@@ -14,6 +14,7 @@ bool RemoteLogger::reconnect()
     close(d_socket);
     d_socket = -1;
   }
+  d_connected = false;
   try {
     d_socket = SSocket(d_remote.sin4.sin_family, SOCK_STREAM, 0);
     setNonBlocking(d_socket);
@@ -27,13 +28,21 @@ bool RemoteLogger::reconnect()
 #endif
     return false;
   }
+  d_connected = true;
   return true;
 }
 
+void RemoteLogger::busyReconnectLoop()
+{
+  while (!reconnect()) {
+    sleep(d_reconnectWaitTime);
+  }
+}
+
 void RemoteLogger::worker()
 {
   if (d_asyncConnect) {
-    reconnect();
+    busyReconnectLoop();
   }
 
   while(true) {
@@ -48,6 +57,10 @@ void RemoteLogger::worker()
       d_writeQueue.pop();
     }
 
+    if (!d_connected) {
+      busyReconnectLoop();
+    }
+
     try {
       uint16_t len = static_cast<uint16_t>(data.length());
       sendSizeAndMsgWithTimeout(d_socket, len, data.c_str(), static_cast<int>(d_timeout), nullptr, nullptr, 0, 0, 0);
@@ -58,9 +71,7 @@ void RemoteLogger::worker()
 #else
       vinfolog("Error sending data to remote logger (%s): %s", d_remote.toStringWithPort(), e.what());
 #endif
-      while (!reconnect()) {
-        sleep(d_reconnectWaitTime);
-      }
+      busyReconnectLoop();
     }
   }
 }
@@ -90,6 +101,7 @@ RemoteLogger::~RemoteLogger()
   if (d_socket >= 0) {
     close(d_socket);
     d_socket = -1;
+    d_connected = false;
   }
   d_queueCond.notify_one();
   d_thread.join();
index 33f0bbaef2c6b6c59be82cb4b1b4d94f08ef9b4e..e4d420243a059832678d808d7db0e1b8cb358a8a 100644 (file)
@@ -42,6 +42,7 @@ public:
     return d_remote.toStringWithPort();
   }
 private:
+  void busyReconnectLoop();
   bool reconnect();
   void worker();
 
@@ -55,5 +56,6 @@ private:
   uint8_t d_reconnectWaitTime;
   std::atomic<bool> d_exiting{false};
   bool d_asyncConnect{false};
+  bool d_connected{false};
   std::thread d_thread;
 };