]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Add configuration items for remote logger's "stalled write timeout" 17528/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 18 Jun 2026 13:43:13 +0000 (15:43 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 18 Jun 2026 13:43:13 +0000 (15:43 +0200)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsdistdist/dnsdist-configuration-yaml.cc
pdns/dnsdistdist/dnsdist-lua-bindings-protobuf.cc
pdns/dnsdistdist/dnsdist-settings-definitions.yml
pdns/dnsdistdist/docs/reference/protobuf.rst

index d0722dad0bae878f02473a98bf9949c245278917..94379737e0504065d9740dfdf6e0808c32e3ee26 100644 (file)
@@ -1943,12 +1943,12 @@ void registerProtobufLogger(const ProtobufLoggerConfiguration& config)
     std::vector<std::shared_ptr<RemoteLoggerInterface>> loggers;
     loggers.reserve(config.connection_count);
     for (uint64_t i = 0; i < config.connection_count; i++) {
-      loggers.push_back(std::make_shared<RemoteLogger>(ComboAddress(std::string(config.address)), config.timeout, config.max_queued_entries * 100, config.reconnect_wait_time, dnsdist::configuration::yaml::s_inClientMode, RemoteLogger::FrameSize::Two));
+      loggers.push_back(std::make_shared<RemoteLogger>(ComboAddress(std::string(config.address)), config.timeout, config.max_queued_entries * 100, config.reconnect_wait_time, dnsdist::configuration::yaml::s_inClientMode, RemoteLogger::FrameSize::Two, config.stalled_write_timeout));
     }
     object = std::shared_ptr<RemoteLoggerInterface>(std::make_shared<RemoteLoggerPool>(std::move(loggers)));
   }
   else {
-    object = std::shared_ptr<RemoteLoggerInterface>(std::make_shared<RemoteLogger>(ComboAddress(std::string(config.address)), config.timeout, config.max_queued_entries * 100, config.reconnect_wait_time, dnsdist::configuration::yaml::s_inClientMode, RemoteLogger::FrameSize::Two));
+    object = std::shared_ptr<RemoteLoggerInterface>(std::make_shared<RemoteLogger>(ComboAddress(std::string(config.address)), config.timeout, config.max_queued_entries * 100, config.reconnect_wait_time, dnsdist::configuration::yaml::s_inClientMode, RemoteLogger::FrameSize::Two, config.stalled_write_timeout));
   }
   dnsdist::configuration::yaml::registerType<RemoteLoggerInterface>(object, config.name);
 #endif
index 7ce6e6dcb995128d9fb7a995f6767062f96a2c83..9cfbead089a6a3385522c70f50fc5a3905ecb719 100644 (file)
@@ -121,7 +121,7 @@ void setupLuaBindingsProtoBuf(LuaContext& luaCtx, bool client, bool configCheck)
   });
 
   /* RemoteLogger */
-  luaCtx.writeFunction("newRemoteLogger", [client, configCheck](const std::string& remote, std::optional<uint16_t> timeout, std::optional<uint64_t> maxQueuedEntries, std::optional<uint8_t> reconnectWaitTime, std::optional<uint64_t> connectionCount) {
+  luaCtx.writeFunction("newRemoteLogger", [client, configCheck](const std::string& remote, std::optional<uint16_t> timeout, std::optional<uint64_t> maxQueuedEntries, std::optional<uint8_t> reconnectWaitTime, std::optional<uint64_t> connectionCount, std::optional<uint32_t> stalledWriteTimeout) {
     if (client || configCheck) {
       return std::shared_ptr<RemoteLoggerInterface>(nullptr);
     }
@@ -130,7 +130,7 @@ void setupLuaBindingsProtoBuf(LuaContext& luaCtx, bool client, bool configCheck)
       std::vector<std::shared_ptr<RemoteLoggerInterface>> loggers;
       loggers.reserve(count);
       for (uint64_t i = 0; i < count; i++) {
-        loggers.push_back(std::make_shared<RemoteLogger>(ComboAddress(remote), timeout ? *timeout : 2, maxQueuedEntries ? (*maxQueuedEntries * 100) : 10000, reconnectWaitTime ? *reconnectWaitTime : 1, client, RemoteLogger::FrameSize::Two));
+        loggers.push_back(std::make_shared<RemoteLogger>(ComboAddress(remote), timeout ? *timeout : 2, maxQueuedEntries ? (*maxQueuedEntries * 100) : 10000, reconnectWaitTime ? *reconnectWaitTime : 1, client, RemoteLogger::FrameSize::Two, stalledWriteTimeout ? *stalledWriteTimeout : 5));
       }
       return std::shared_ptr<RemoteLoggerInterface>(new RemoteLoggerPool(std::move(loggers)));
     }
index 6c42bba0eb14e265e2bb12a3507ac9ea72d6b598..800979044d1a47afd932a9f0afb43d098a66283f 100644 (file)
@@ -225,6 +225,11 @@ protobuf_logger:
       type: "u64"
       default: 1
       description: "Number of connections to open to the endpoint"
+    - name: "stalled_write_timeout"
+      type: "u32"
+      default: 5
+      description: "If we have been unable to write or buffer data on our side of the TCP socket for that long, in seconds, consider that the remote endpoint has died and reconnect"
+      version_added: "2.2.0"
 
 dnstap_logger:
   description: "Endpoint to send queries and/or responses data to, using the dnstap format"
index 00addb682d425f1d66495d7baa2c64638ce77fd5..c2b0ab9b888bf0b953aad58b80462d3a4f9dbffe 100644 (file)
@@ -1,11 +1,14 @@
 Protobuf Logging Reference
 ==========================
 
-.. function:: newRemoteLogger(address [, timeout=2[, maxQueuedEntries=100[, reconnectWaitTime=1[, connectionCount=1]]]])
+.. function:: newRemoteLogger(address [, timeout=2[, maxQueuedEntries=100[, reconnectWaitTime=1[, connectionCount=1, stalledWriteTimeout=5]]]])
 
   .. versionchanged:: 2.0.0
     Added the optional ``connectionCount`` parameter.
 
+  .. versionchanged:: 2.2.0
+    Added the optional ``stalledWriteTimeout`` parameter.
+
   Create a Remote Logger object, to use with :func:`RemoteLogAction` and :func:`RemoteLogResponseAction`.
 
   :param string address: An IP:PORT combination where the logger is listening
@@ -13,6 +16,7 @@ Protobuf Logging Reference
   :param int maxQueuedEntries: Queue this many messages before dropping new ones (e.g. when the remote listener closes the connection)
   :param int reconnectWaitTime: Time in seconds between reconnection attempts
   :param int connectionCount: Number of connections to open to the socket
+  :param int stalledWriteTimeout: If we have been unable to write or buffer data on our side of the TCP socket for that long, in seconds, consider that the remote endpoint has died and reconnect
 
 .. class:: DNSDistProtoBufMessage