Skip to content

Commit

Permalink
Fix and improve TTL handling
Browse files Browse the repository at this point in the history
  • Loading branch information
dhaavi committed Jul 20, 2020
1 parent 813346e commit 8dea8e6
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 6 deletions.
8 changes: 7 additions & 1 deletion resolver/resolve.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ var (
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
// has been blocked by the upstream server.
type BlockedUpstreamError struct {
Expand Down Expand Up @@ -326,7 +332,7 @@ resolveLoop:
// cache if enabled
if !q.NoCaching {
// persist to database
rrCache.Clean(600)
rrCache.Clean(minTTL)
err = rrCache.Save()
if err != nil {
log.Warningf("resolver: failed to cache RR for %s%s: %s", q.FQDN, q.QType.String(), err)
Expand Down
4 changes: 2 additions & 2 deletions resolver/resolver-mdns.go
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,7 @@ func handleMDNSMessages(ctx context.Context, messages chan *dns.Msg) error {

var questionID string
if saveFullRequest {
rrCache.Clean(60)
rrCache.Clean(minMDnsTTL)
err := rrCache.Save()
if err != nil {
log.Warningf("resolver: failed to cache RR %s: %s", rrCache.Domain, err)
Expand Down Expand Up @@ -304,7 +304,7 @@ func handleMDNSMessages(ctx context.Context, messages chan *dns.Msg) error {
Server: mDNSResolver.Server,
ServerScope: mDNSResolver.ServerIPScope,
}
rrCache.Clean(60)
rrCache.Clean(minMDnsTTL)
err := rrCache.Save()
if err != nil {
log.Warningf("resolver: failed to cache RR %s: %s", rrCache.Domain, err)
Expand Down
2 changes: 1 addition & 1 deletion resolver/resolver-tcp.go
Original file line number Diff line number Diff line change
Expand Up @@ -419,7 +419,7 @@ func (mgr *tcpResolverConnMgr) handleQueryResponse(conn *dns.Conn, msg *dns.Msg)

// persist to database
rrCache := inFlight.MakeCacheRecord(msg)
rrCache.Clean(600)
rrCache.Clean(minTTL)
err := rrCache.Save()
if err != nil {
log.Warningf(
Expand Down
7 changes: 5 additions & 2 deletions resolver/rrcache.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,9 +72,12 @@ func (rrCache *RRCache) Clean(minExpires uint32) {
header.Ttl = 17
}

// TTL must be at least minExpires
if lowestTTL < minExpires {
// TTL range limits
switch {
case lowestTTL < minExpires:
lowestTTL = minExpires
case lowestTTL > maxTTL:
lowestTTL = maxTTL
}

// shorten caching
Expand Down

0 comments on commit 8dea8e6

Please sign in to comment.