]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
rec: Add a `asyncConnect` option to `protobufServer()` 4288/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 19 Aug 2016 09:33:12 +0000 (11:33 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Fri, 19 Aug 2016 15:30:32 +0000 (17:30 +0200)
docs/markdown/recursor/settings.md
pdns/rec-lua-conf.cc
pdns/remote_logger.cc
pdns/remote_logger.hh

index 792c376d5bf18c2fbf73c9b1d71e6c1e63d86261..89ebcdfb072e2437cf9990508eaebfc8eed0770a 100644 (file)
@@ -511,7 +511,7 @@ to detect and act on infected hosts.
 Protobuf export to a server is enabled using the `protobufServer()` directive:
 
 ```
-protobufServer("192.0.2.1:4242" [[[[[, timeout], maxQueuedEntries], reconnectWaitTime], maskV4], maskV6])
+protobufServer("192.0.2.1:4242" [[[[[[, timeout], maxQueuedEntries], reconnectWaitTime], maskV4], maskV6], asynConnect])
 ```
 
 The optional parameters are:
@@ -521,6 +521,8 @@ The optional parameters are:
 * reconnectWaitTime = how long to wait, in seconds, between two reconnection attempts, default to 1
 * maskV4 = network mask to apply to the client IPv4 addresses, for anonymization purpose. The default of 32 means no anonymization
 * maskV6 = same as maskV4, but for IPv6. Default to 128
+* asyncConnect = if set to false (default) the first connection to the server during startup will block up to `timeout` seconds,
+otherwise the connection is done in a separate thread.
 
 The protocol buffers message types can be found in the [`dnsmessage.proto`](https://github.com/PowerDNS/pdns/blob/master/pdns/dnsmessage.proto) file.
 
index 73822342e17c9f267d5b5c29cfececda2a64dbd0..313654509871afd613b536f28431ff32be55d103 100644 (file)
@@ -246,11 +246,11 @@ void loadRecursorLuaConfig(const std::string& fname)
     });
 
 #if HAVE_PROTOBUF
-  Lua.writeFunction("protobufServer", [&lci](const string& server_, const boost::optional<uint16_t> timeout, const boost::optional<uint64_t> maxQueuedEntries, const boost::optional<uint8_t> reconnectWaitTime, const boost::optional<uint8_t> maskV4, boost::optional<uint8_t> maskV6) {
+  Lua.writeFunction("protobufServer", [&lci](const string& server_, const boost::optional<uint16_t> timeout, const boost::optional<uint64_t> maxQueuedEntries, const boost::optional<uint8_t> reconnectWaitTime, const boost::optional<uint8_t> maskV4, boost::optional<uint8_t> maskV6, boost::optional<bool> asyncConnect) {
       try {
        ComboAddress server(server_);
         if (!lci.protobufServer) {
-          lci.protobufServer = std::make_shared<RemoteLogger>(server, timeout ? *timeout : 2, maxQueuedEntries ? *maxQueuedEntries : 100, reconnectWaitTime ? *reconnectWaitTime : 1);
+          lci.protobufServer = std::make_shared<RemoteLogger>(server, timeout ? *timeout : 2, maxQueuedEntries ? *maxQueuedEntries : 100, reconnectWaitTime ? *reconnectWaitTime : 1, asyncConnect ? *asyncConnect : false);
           if (maskV4) {
             lci.protobufMaskV4 = *maskV4;
           }
index b1e18ed99616ae6033a66eea0e5d5689061a4141..39844ab465ddecf6bbb60f1382b090afd9e65762 100644 (file)
@@ -58,6 +58,10 @@ bool RemoteLogger::sendData(const char* buffer, size_t bufferSize)
 
 void RemoteLogger::worker()
 {
+  if (d_asyncConnect) {
+    reconnect();
+  }
+
   while(true) {
     std::string data;
     {
@@ -101,9 +105,11 @@ void RemoteLogger::queueData(const std::string& data)
   d_queueCond.notify_one();
 }
 
-RemoteLogger::RemoteLogger(const ComboAddress& remote, uint16_t timeout, uint64_t maxQueuedEntries, uint8_t reconnectWaitTime): d_remote(remote), d_maxQueuedEntries(maxQueuedEntries), d_timeout(timeout), d_reconnectWaitTime(reconnectWaitTime), d_thread(&RemoteLogger::worker, this)
+RemoteLogger::RemoteLogger(const ComboAddress& remote, uint16_t timeout, uint64_t maxQueuedEntries, uint8_t reconnectWaitTime, bool asyncConnect): d_remote(remote), d_maxQueuedEntries(maxQueuedEntries), d_timeout(timeout), d_reconnectWaitTime(reconnectWaitTime), d_asyncConnect(asyncConnect), d_thread(&RemoteLogger::worker, this)
 {
-  reconnect();
+  if (!d_asyncConnect) {
+    reconnect();
+  }
 }
 
 RemoteLogger::~RemoteLogger()
@@ -114,4 +120,3 @@ RemoteLogger::~RemoteLogger()
   d_queueCond.notify_one();
   d_thread.join();
 }
-
index 02c95f86febd52c370f7ca8d4de390b4f97f902e..1e0abcd37f7ac4e62263fce06ebfe42f5f2f762d 100644 (file)
@@ -11,7 +11,7 @@
 class RemoteLogger
 {
 public:
-  RemoteLogger(const ComboAddress& remote, uint16_t timeout=2, uint64_t maxQueuedEntries=100, uint8_t reconnectWaitTime=1);
+  RemoteLogger(const ComboAddress& remote, uint16_t timeout=2, uint64_t maxQueuedEntries=100, uint8_t reconnectWaitTime=1, bool asyncConnect=false);
   ~RemoteLogger();
   void queueData(const std::string& data);
   std::string toString()
@@ -31,6 +31,7 @@ private:
   int d_socket{-1};
   uint16_t d_timeout;
   uint8_t d_reconnectWaitTime;
-  std::thread d_thread;
   std::atomic<bool> d_exiting{false};
+  bool d_asyncConnect{false};
+  std::thread d_thread;
 };