mirror of
https://github.com/fergalmoran/DnsServer.git
synced 2025-12-26 11:28:36 +00:00
DnsServer: added option to control serve stale feature.
This commit is contained in:
@@ -103,6 +103,7 @@ namespace DnsServerCore.Dns
|
|||||||
int _clientTimeout = 4000;
|
int _clientTimeout = 4000;
|
||||||
int _forwarderConcurrency = 2;
|
int _forwarderConcurrency = 2;
|
||||||
int _resolverMaxStackCount = 10;
|
int _resolverMaxStackCount = 10;
|
||||||
|
bool _serveStale = true;
|
||||||
int _cachePrefetchEligibility = 2;
|
int _cachePrefetchEligibility = 2;
|
||||||
int _cachePrefetchTrigger = 9;
|
int _cachePrefetchTrigger = 9;
|
||||||
int _cachePrefetchSampleIntervalInMinutes = 5;
|
int _cachePrefetchSampleIntervalInMinutes = 5;
|
||||||
@@ -1521,10 +1522,14 @@ namespace DnsServerCore.Dns
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
//wait timed out
|
//wait timed out
|
||||||
|
|
||||||
|
if (_serveStale)
|
||||||
|
{
|
||||||
//query cache zone to return stale answer (if available) as per draft-ietf-dnsop-serve-stale-04
|
//query cache zone to return stale answer (if available) as per draft-ietf-dnsop-serve-stale-04
|
||||||
DnsDatagram staleResponse = QueryCache(request, true);
|
DnsDatagram staleResponse = QueryCache(request, true);
|
||||||
if (staleResponse != null)
|
if (staleResponse != null)
|
||||||
return staleResponse;
|
return staleResponse;
|
||||||
|
}
|
||||||
|
|
||||||
//wait till full timeout before responding as ServerFailure
|
//wait till full timeout before responding as ServerFailure
|
||||||
int timeout = Convert.ToInt32(_clientTimeout - (DateTime.UtcNow - resolverWaitStartTime).TotalMilliseconds);
|
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());
|
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
|
//fetch stale record
|
||||||
DnsDatagram staleResponse = QueryCache(request, true);
|
DnsDatagram staleResponse = QueryCache(request, true);
|
||||||
if (staleResponse == null)
|
if (staleResponse == null)
|
||||||
@@ -1649,6 +1656,12 @@ namespace DnsServerCore.Dns
|
|||||||
taskCompletionSource.SetResult(staleResponse);
|
taskCompletionSource.SetResult(staleResponse);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//signal null response to release waiting tasks
|
||||||
|
taskCompletionSource.SetResult(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
_resolverTasks.TryRemove(GetResolverQueryKey(request.Question[0]), out _);
|
_resolverTasks.TryRemove(GetResolverQueryKey(request.Question[0]), out _);
|
||||||
@@ -2523,6 +2536,12 @@ namespace DnsServerCore.Dns
|
|||||||
set { _resolverMaxStackCount = value; }
|
set { _resolverMaxStackCount = value; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool ServeStale
|
||||||
|
{
|
||||||
|
get { return _serveStale; }
|
||||||
|
set { _serveStale = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public int CachePrefetchEligibility
|
public int CachePrefetchEligibility
|
||||||
{
|
{
|
||||||
get { return _cachePrefetchEligibility; }
|
get { return _cachePrefetchEligibility; }
|
||||||
|
|||||||
Reference in New Issue
Block a user