DnsServer: added option to control serve stale feature.

This commit is contained in:
Shreyas Zare
2020-12-19 12:36:58 +05:30
parent e5ec73c7c3
commit 32243d30e1

View File

@@ -103,6 +103,7 @@ namespace DnsServerCore.Dns
int _clientTimeout = 4000;
int _forwarderConcurrency = 2;
int _resolverMaxStackCount = 10;
bool _serveStale = true;
int _cachePrefetchEligibility = 2;
int _cachePrefetchTrigger = 9;
int _cachePrefetchSampleIntervalInMinutes = 5;
@@ -1521,10 +1522,14 @@ namespace DnsServerCore.Dns
else
{
//wait timed out
if (_serveStale)
{
//query cache zone to return stale answer (if available) as per draft-ietf-dnsop-serve-stale-04
DnsDatagram staleResponse = QueryCache(request, true);
if (staleResponse != null)
return staleResponse;
}
//wait till full timeout before responding as ServerFailure
int timeout = Convert.ToInt32(_clientTimeout - (DateTime.UtcNow - resolverWaitStartTime).TotalMilliseconds);
@@ -1629,6 +1634,8 @@ namespace DnsServerCore.Dns
log.Write("DNS Server recursive resolution failed for QNAME: " + request.Question[0].Name + "; QTYPE: " + request.Question[0].Type.ToString() + "; QCLASS: " + request.Question[0].Class.ToString() + (nameServers == null ? "" : "; Name Servers: " + nameServers) + ";\r\n" + ex.ToString());
}
if (_serveStale)
{
//fetch stale record
DnsDatagram staleResponse = QueryCache(request, true);
if (staleResponse == null)
@@ -1649,6 +1656,12 @@ namespace DnsServerCore.Dns
taskCompletionSource.SetResult(staleResponse);
}
}
else
{
//signal null response to release waiting tasks
taskCompletionSource.SetResult(null);
}
}
finally
{
_resolverTasks.TryRemove(GetResolverQueryKey(request.Question[0]), out _);
@@ -2523,6 +2536,12 @@ namespace DnsServerCore.Dns
set { _resolverMaxStackCount = value; }
}
public bool ServeStale
{
get { return _serveStale; }
set { _serveStale = value; }
}
public int CachePrefetchEligibility
{
get { return _cachePrefetchEligibility; }