mirror of
https://github.com/fergalmoran/DnsServer.git
synced 2025-12-22 09:29:50 +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
|
||||||
//query cache zone to return stale answer (if available) as per draft-ietf-dnsop-serve-stale-04
|
|
||||||
DnsDatagram staleResponse = QueryCache(request, true);
|
if (_serveStale)
|
||||||
if (staleResponse != null)
|
{
|
||||||
return staleResponse;
|
//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
|
//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,24 +1634,32 @@ 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());
|
||||||
}
|
}
|
||||||
|
|
||||||
//fetch stale record
|
if (_serveStale)
|
||||||
DnsDatagram staleResponse = QueryCache(request, true);
|
|
||||||
if (staleResponse == null)
|
|
||||||
{
|
{
|
||||||
//no stale record was found; signal null response to release waiting tasks
|
//fetch stale record
|
||||||
taskCompletionSource.SetResult(null);
|
DnsDatagram staleResponse = QueryCache(request, true);
|
||||||
|
if (staleResponse == null)
|
||||||
|
{
|
||||||
|
//no stale record was found; signal null response to release waiting tasks
|
||||||
|
taskCompletionSource.SetResult(null);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//reset expiry for stale records
|
||||||
|
foreach (DnsResourceRecord record in staleResponse.Answer)
|
||||||
|
{
|
||||||
|
if (record.IsStale)
|
||||||
|
record.ResetExpiry(30); //reset expiry by 30 seconds so that resolver tries again only after 30 seconds as per draft-ietf-dnsop-serve-stale-04
|
||||||
|
}
|
||||||
|
|
||||||
|
//signal stale response
|
||||||
|
taskCompletionSource.SetResult(staleResponse);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//reset expiry for stale records
|
//signal null response to release waiting tasks
|
||||||
foreach (DnsResourceRecord record in staleResponse.Answer)
|
taskCompletionSource.SetResult(null);
|
||||||
{
|
|
||||||
if (record.IsStale)
|
|
||||||
record.ResetExpiry(30); //reset expiry by 30 seconds so that resolver tries again only after 30 seconds as per draft-ietf-dnsop-serve-stale-04
|
|
||||||
}
|
|
||||||
|
|
||||||
//signal stale response
|
|
||||||
taskCompletionSource.SetResult(staleResponse);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
@@ -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