Fix and improve TTL handling

This commit is contained in:
Daniel 2020-07-20 16:40:47 +02:00
parent 813346e829
commit 8dea8e6c46
4 changed files with 15 additions and 6 deletions

View file

@ -45,6 +45,12 @@ var (
ErrNoCompliance = fmt.Errorf("%w: no compliant resolvers for this query", ErrBlocked) ErrNoCompliance = fmt.Errorf("%w: no compliant resolvers for this query", ErrBlocked)
) )
const (
minTTL = 60 // 1 Minute
minMDnsTTL = 60 // 1 Minute
maxTTL = 24 * 60 * 60 // 24 hours
)
// BlockedUpstreamError is returned when a DNS request // BlockedUpstreamError is returned when a DNS request
// has been blocked by the upstream server. // has been blocked by the upstream server.
type BlockedUpstreamError struct { type BlockedUpstreamError struct {
@ -326,7 +332,7 @@ resolveLoop:
// cache if enabled // cache if enabled
if !q.NoCaching { if !q.NoCaching {
// persist to database // persist to database
rrCache.Clean(600) rrCache.Clean(minTTL)
err = rrCache.Save() err = rrCache.Save()
if err != nil { if err != nil {
log.Warningf("resolver: failed to cache RR for %s%s: %s", q.FQDN, q.QType.String(), err) log.Warningf("resolver: failed to cache RR for %s%s: %s", q.FQDN, q.QType.String(), err)

View file

@ -276,7 +276,7 @@ func handleMDNSMessages(ctx context.Context, messages chan *dns.Msg) error {
var questionID string var questionID string
if saveFullRequest { if saveFullRequest {
rrCache.Clean(60) rrCache.Clean(minMDnsTTL)
err := rrCache.Save() err := rrCache.Save()
if err != nil { if err != nil {
log.Warningf("resolver: failed to cache RR %s: %s", rrCache.Domain, err) log.Warningf("resolver: failed to cache RR %s: %s", rrCache.Domain, err)
@ -304,7 +304,7 @@ func handleMDNSMessages(ctx context.Context, messages chan *dns.Msg) error {
Server: mDNSResolver.Server, Server: mDNSResolver.Server,
ServerScope: mDNSResolver.ServerIPScope, ServerScope: mDNSResolver.ServerIPScope,
} }
rrCache.Clean(60) rrCache.Clean(minMDnsTTL)
err := rrCache.Save() err := rrCache.Save()
if err != nil { if err != nil {
log.Warningf("resolver: failed to cache RR %s: %s", rrCache.Domain, err) log.Warningf("resolver: failed to cache RR %s: %s", rrCache.Domain, err)

View file

@ -419,7 +419,7 @@ func (mgr *tcpResolverConnMgr) handleQueryResponse(conn *dns.Conn, msg *dns.Msg)
// persist to database // persist to database
rrCache := inFlight.MakeCacheRecord(msg) rrCache := inFlight.MakeCacheRecord(msg)
rrCache.Clean(600) rrCache.Clean(minTTL)
err := rrCache.Save() err := rrCache.Save()
if err != nil { if err != nil {
log.Warningf( log.Warningf(

View file

@ -72,9 +72,12 @@ func (rrCache *RRCache) Clean(minExpires uint32) {
header.Ttl = 17 header.Ttl = 17
} }
// TTL must be at least minExpires // TTL range limits
if lowestTTL < minExpires { switch {
case lowestTTL < minExpires:
lowestTTL = minExpires lowestTTL = minExpires
case lowestTTL > maxTTL:
lowestTTL = maxTTL
} }
// shorten caching // shorten caching