From: Remi Gacogne Date: Fri, 19 Aug 2016 09:33:12 +0000 (+0200) Subject: rec: Add a `asyncConnect` option to `protobufServer()` X-Git-Tag: rec-4.0.2~6^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F4288%2Fhead;p=thirdparty%2Fpdns.git rec: Add a `asyncConnect` option to `protobufServer()` --- diff --git a/docs/markdown/recursor/settings.md b/docs/markdown/recursor/settings.md index 792c376d5b..89ebcdfb07 100644 --- a/docs/markdown/recursor/settings.md +++ b/docs/markdown/recursor/settings.md @@ -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. diff --git a/pdns/rec-lua-conf.cc b/pdns/rec-lua-conf.cc index 73822342e1..3136545098 100644 --- a/pdns/rec-lua-conf.cc +++ b/pdns/rec-lua-conf.cc @@ -246,11 +246,11 @@ void loadRecursorLuaConfig(const std::string& fname) }); #if HAVE_PROTOBUF - Lua.writeFunction("protobufServer", [&lci](const string& server_, const boost::optional timeout, const boost::optional maxQueuedEntries, const boost::optional reconnectWaitTime, const boost::optional maskV4, boost::optional maskV6) { + Lua.writeFunction("protobufServer", [&lci](const string& server_, const boost::optional timeout, const boost::optional maxQueuedEntries, const boost::optional reconnectWaitTime, const boost::optional maskV4, boost::optional maskV6, boost::optional asyncConnect) { try { ComboAddress server(server_); if (!lci.protobufServer) { - lci.protobufServer = std::make_shared(server, timeout ? *timeout : 2, maxQueuedEntries ? *maxQueuedEntries : 100, reconnectWaitTime ? *reconnectWaitTime : 1); + lci.protobufServer = std::make_shared(server, timeout ? *timeout : 2, maxQueuedEntries ? *maxQueuedEntries : 100, reconnectWaitTime ? *reconnectWaitTime : 1, asyncConnect ? *asyncConnect : false); if (maskV4) { lci.protobufMaskV4 = *maskV4; } diff --git a/pdns/remote_logger.cc b/pdns/remote_logger.cc index b1e18ed996..39844ab465 100644 --- a/pdns/remote_logger.cc +++ b/pdns/remote_logger.cc @@ -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(); } - diff --git a/pdns/remote_logger.hh b/pdns/remote_logger.hh index 02c95f86fe..1e0abcd37f 100644 --- a/pdns/remote_logger.hh +++ b/pdns/remote_logger.hh @@ -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 d_exiting{false}; + bool d_asyncConnect{false}; + std::thread d_thread; };