/** lwr is only filled out in case 1 was returned, and even when returning 1 for 'success', lwr might contain DNS errors
Never throws!
*/
-static LWResult::Result asyncresolve1(const ComboAddress& ip, const DNSName& domain, int type, bool doTCP, bool sendRDQuery, int EDNS0Level, struct timeval* now, boost::optional<Netmask>& srcmask, boost::optional<const ResolveContext&> context, const std::shared_ptr<std::vector<std::unique_ptr<RemoteLogger>>>& outgoingLoggers, const std::shared_ptr<std::vector<std::unique_ptr<FrameStreamLogger>>>& fstrmLoggers, const std::set<uint16_t>& exportTypes, LWResult *lwr, bool* chained, TCPOutConnectionManager::Connection& connection)
+static LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int type, bool doTCP, bool sendRDQuery, int EDNS0Level, struct timeval* now, boost::optional<Netmask>& srcmask, boost::optional<const ResolveContext&> context, const std::shared_ptr<std::vector<std::unique_ptr<RemoteLogger>>>& outgoingLoggers, const std::shared_ptr<std::vector<std::unique_ptr<FrameStreamLogger>>>& fstrmLoggers, const std::set<uint16_t>& exportTypes, LWResult *lwr, bool* chained, TCPOutConnectionManager::Connection& connection)
{
size_t len;
size_t bufsize=g_outgoingEDNSBufsize;
else {
try {
while (true) {
+ // If we get a new (not re-used) TCP connection that does not
+ // work, we give up. For reused connections, we assume the
+ // peer has closed it on error, so we retry. At some point we
+ // *will* get a new connection, so this loop is not endless.
bool isNew = false;
connection = t_tcp_manager.get(ip);
if (!connection.d_handler) {
}
buf.resize(len);
memcpy(buf.data(), packet.data(), len);
- //handler->close();
ret = LWResult::Result::Success;
break;
}
LWResult::Result asyncresolve(const ComboAddress& ip, const DNSName& domain, int type, bool doTCP, bool sendRDQuery, int EDNS0Level, struct timeval* now, boost::optional<Netmask>& srcmask, boost::optional<const ResolveContext&> context, const std::shared_ptr<std::vector<std::unique_ptr<RemoteLogger>>>& outgoingLoggers, const std::shared_ptr<std::vector<std::unique_ptr<FrameStreamLogger>>>& fstrmLoggers, const std::set<uint16_t>& exportTypes, LWResult *lwr, bool* chained)
{
TCPOutConnectionManager::Connection connection;
- auto ret = asyncresolve1(ip, domain, type,doTCP, sendRDQuery, EDNS0Level, now, srcmask, context, outgoingLoggers, fstrmLoggers, exportTypes, lwr, chained, connection);
+ auto ret = asyncresolve(ip, domain, type,doTCP, sendRDQuery, EDNS0Level, now, srcmask, context, outgoingLoggers, fstrmLoggers, exportTypes, lwr, chained, connection);
if (doTCP) {
if (!lwr->d_validpacket) {
- ret = asyncresolve1(ip, domain, type,doTCP, sendRDQuery, EDNS0Level, now, srcmask, context, outgoingLoggers, fstrmLoggers, exportTypes, lwr, chained, connection);
+ ret = asyncresolve(ip, domain, type,doTCP, sendRDQuery, EDNS0Level, now, srcmask, context, outgoingLoggers, fstrmLoggers, exportTypes, lwr, chained, connection);
}
if (connection.d_handler && lwr->d_validpacket) {
t_tcp_manager.store(ip, connection);
::arg().setSwitch("dot-to-port-853", "Force DoT connection to target port 853 if DoT compiled in")="yes";
::arg().set("dot-to-auth-names", "Use DoT to authoritative servers with these names or suffixes")="";
- ::arg().set("tcpout-maxidle-ms", "Maximum time TCP connections are left idle in milliseconds or 0 if no limit") = "10000";
- ::arg().set("tcpout-maxidle-per-auth", "Maximum number of idle TCP connections to a specific IP per thread, 0 means do not keep idle connections open") = "10";
- ::arg().set("tcpout-max-queries", "Maximum total number of queries per connection, 0 means no limit") = "0";
- ::arg().set("tcpout-maxidle-per-thread", "Maximum number of idle TCP connections per thread") = "100";
+ ::arg().set("tcpout-maxidle-ms", "Time TCP/DoT connections are left idle in milliseconds or 0 if no limit") = "10000";
+ ::arg().set("tcpout-maxidle-per-auth", "Maximum number of idle TCP/DoT connections to a specific IP per thread, 0 means do not keep idle connections open") = "10";
+ ::arg().set("tcpout-max-queries", "Maximum total number of queries per TCP/DoT connection, 0 means no limit") = "0";
+ ::arg().set("tcpout-maxidle-per-thread", "Maximum number of idle TCP/DoT connections per thread") = "100";
::arg().setCmd("help","Provide a helpful message");
::arg().setCmd("version","Print version string");
Enable TCP Fast Open Connect support, if available, on the outgoing connections to authoritative servers. See :ref:`tcp-fast-open-support`.
+``tcpout-maxidle-ms``
+---------------------
+.. versionadded:: 4.6.0
+
+- Integer
+- Default : 10000
+
+Time outgoing TCP/DoT connections are left idle in milliseconds or 0 if no limit. After having been idle for this time, the connection is elegible for closing.
+
+``tcpout-maxidle-per-auth``
+---------------------------
+.. versionadded:: 4.6.0
+
+- Integer
+- Default : 10
+
+Maximum number of idle outgoing TCP/DoT connections to a specific IP per thread, 0 means do not keep idle connections open.
+
+``tcpout-max-queries``
+----------------------
+- Integer
+- Default : 0
+
+Maximum total number of queries per outgoing TCP/DoT connection, 0 means no limit. After this number of queries, the concection is
+closed and a new one will be created if needed.
+
+.. versionadded:: 4.6.0
+
+``tcpout-maxidle-per-thread``
+-----------------------------
+.. versionadded:: 4.6.0
+
+- Integer
+- Default : 0
+
+Maximum number of idle outgoing TCP/DoT connections per thread, 0 means do not keep idle connections open.
+
.. _setting-threads:
``threads``