mirror of
https://github.com/coredns/coredns.git
synced 2026-06-15 13:40:11 -04:00
* plugin/cache: allow cache TTLs above default 3600s This change allows the cache plugin to honor configured maximum TTL values above the default 3600s limit. Default behavior remains unchanged This PR fixes 7846 Signed-off-by: Yong Tang <yong.tang.github@outlook.com> * Keep MinimalTTL Signed-off-by: Yong Tang <yong.tang.github@outlook.com> --------- Signed-off-by: Yong Tang <yong.tang.github@outlook.com>
61 lines
1.8 KiB
Go
61 lines
1.8 KiB
Go
package dnsutil
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/coredns/coredns/plugin/pkg/response"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
// MinimalTTL scans the message returns the lowest TTL found taking into the response.Type of the message.
|
|
func MinimalTTL(m *dns.Msg, mt response.Type) time.Duration {
|
|
return MinimalTTLWithMaximum(m, mt, MaximumDefaultTTL)
|
|
}
|
|
|
|
// MinimalTTLWithMaximum scans the DNS message and returns the lowest TTL found,
|
|
// constrained by maximumTTL and the response type.
|
|
func MinimalTTLWithMaximum(m *dns.Msg, mt response.Type, maximumTTL time.Duration) time.Duration {
|
|
if mt != response.NoError && mt != response.NameError && mt != response.NoData {
|
|
return MinimalDefaultTTL
|
|
}
|
|
|
|
// No records or OPT is the only record, return a short ttl as a fail safe.
|
|
if len(m.Answer)+len(m.Ns) == 0 &&
|
|
(len(m.Extra) == 0 || (len(m.Extra) == 1 && m.Extra[0].Header().Rrtype == dns.TypeOPT)) {
|
|
return MinimalDefaultTTL
|
|
}
|
|
|
|
minTTL := maximumTTL
|
|
for _, r := range m.Answer {
|
|
if r.Header().Ttl < uint32(minTTL.Seconds()) {
|
|
minTTL = time.Duration(r.Header().Ttl) * time.Second
|
|
}
|
|
}
|
|
for _, r := range m.Ns {
|
|
if r.Header().Ttl < uint32(minTTL.Seconds()) {
|
|
minTTL = time.Duration(r.Header().Ttl) * time.Second
|
|
}
|
|
}
|
|
|
|
for _, r := range m.Extra {
|
|
if r.Header().Rrtype == dns.TypeOPT {
|
|
// OPT records use TTL field for extended rcode and flags
|
|
continue
|
|
}
|
|
if r.Header().Ttl < uint32(minTTL.Seconds()) {
|
|
minTTL = time.Duration(r.Header().Ttl) * time.Second
|
|
}
|
|
}
|
|
return minTTL
|
|
}
|
|
|
|
const (
|
|
// MinimalDefaultTTL is the absolute lowest TTL we use in CoreDNS.
|
|
MinimalDefaultTTL = 5 * time.Second
|
|
// MaximumDefaultTTL is the maximum TTL was use on RRsets in CoreDNS.
|
|
MaximumDefaultTTL = 1 * time.Hour
|
|
// Deprecated: use MaximumDefaultTTL instead.
|
|
MaximumDefaulTTL = MaximumDefaultTTL
|
|
)
|