[plugin/cache] cache failures (#2720)
* cache failures * use ServerError
This commit is contained in:
parent
58c703f5ef
commit
be8b29cd4d
3 changed files with 46 additions and 8 deletions
5
plugin/cache/cache.go
vendored
5
plugin/cache/cache.go
vendored
|
@ -163,6 +163,9 @@ func (w *ResponseWriter) WriteMsg(res *dns.Msg) error {
|
||||||
var duration time.Duration
|
var duration time.Duration
|
||||||
if mt == response.NameError || mt == response.NoData {
|
if mt == response.NameError || mt == response.NoData {
|
||||||
duration = computeTTL(msgTTL, w.minnttl, w.nttl)
|
duration = computeTTL(msgTTL, w.minnttl, w.nttl)
|
||||||
|
} else if mt == response.ServerError {
|
||||||
|
// use default ttl which is 5s
|
||||||
|
duration = minTTL
|
||||||
} else {
|
} else {
|
||||||
duration = computeTTL(msgTTL, w.minpttl, w.pttl)
|
duration = computeTTL(msgTTL, w.minpttl, w.pttl)
|
||||||
}
|
}
|
||||||
|
@ -206,7 +209,7 @@ func (w *ResponseWriter) set(m *dns.Msg, key uint64, mt response.Type, duration
|
||||||
i := newItem(m, w.now(), duration)
|
i := newItem(m, w.now(), duration)
|
||||||
w.pcache.Add(key, i)
|
w.pcache.Add(key, i)
|
||||||
|
|
||||||
case response.NameError, response.NoData:
|
case response.NameError, response.NoData, response.ServerError:
|
||||||
i := newItem(m, w.now(), duration)
|
i := newItem(m, w.now(), duration)
|
||||||
w.ncache.Add(key, i)
|
w.ncache.Add(key, i)
|
||||||
|
|
||||||
|
|
28
plugin/cache/cache_test.go
vendored
28
plugin/cache/cache_test.go
vendored
|
@ -87,6 +87,34 @@ var cacheTestCases = []cacheTestCase{
|
||||||
},
|
},
|
||||||
shouldCache: true,
|
shouldCache: true,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
RecursionAvailable: true, Authoritative: false,
|
||||||
|
Case: test.Case{
|
||||||
|
Rcode: dns.RcodeServerFailure,
|
||||||
|
Qname: "example.org.", Qtype: dns.TypeA,
|
||||||
|
Ns: []dns.RR{},
|
||||||
|
},
|
||||||
|
in: test.Case{
|
||||||
|
Rcode: dns.RcodeServerFailure,
|
||||||
|
Qname: "example.org.", Qtype: dns.TypeA,
|
||||||
|
Ns: []dns.RR{},
|
||||||
|
},
|
||||||
|
shouldCache: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
RecursionAvailable: true, Authoritative: false,
|
||||||
|
Case: test.Case{
|
||||||
|
Rcode: dns.RcodeNotImplemented,
|
||||||
|
Qname: "example.org.", Qtype: dns.TypeA,
|
||||||
|
Ns: []dns.RR{},
|
||||||
|
},
|
||||||
|
in: test.Case{
|
||||||
|
Rcode: dns.RcodeNotImplemented,
|
||||||
|
Qname: "example.org.", Qtype: dns.TypeA,
|
||||||
|
Ns: []dns.RR{},
|
||||||
|
},
|
||||||
|
shouldCache: true,
|
||||||
|
},
|
||||||
{
|
{
|
||||||
RecursionAvailable: true, Authoritative: true,
|
RecursionAvailable: true, Authoritative: true,
|
||||||
Case: test.Case{
|
Case: test.Case{
|
||||||
|
|
|
@ -15,6 +15,8 @@ const (
|
||||||
NoError Type = iota
|
NoError Type = iota
|
||||||
// NameError is a NXDOMAIN in header, SOA in auth.
|
// NameError is a NXDOMAIN in header, SOA in auth.
|
||||||
NameError
|
NameError
|
||||||
|
// ServerError is a set of errors we want to cache, for now it containers SERVFAIL and NOTIMPL.
|
||||||
|
ServerError
|
||||||
// NoData indicates name found, but not the type: NOERROR in header, SOA in auth.
|
// NoData indicates name found, but not the type: NOERROR in header, SOA in auth.
|
||||||
NoData
|
NoData
|
||||||
// Delegation is a msg with a pointer to another nameserver: NOERROR in header, NS in auth, optionally fluff in additional (not checked).
|
// Delegation is a msg with a pointer to another nameserver: NOERROR in header, NS in auth, optionally fluff in additional (not checked).
|
||||||
|
@ -28,13 +30,14 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
var toString = map[Type]string{
|
var toString = map[Type]string{
|
||||||
NoError: "NOERROR",
|
NoError: "NOERROR",
|
||||||
NameError: "NXDOMAIN",
|
NameError: "NXDOMAIN",
|
||||||
NoData: "NODATA",
|
ServerError: "SERVERERROR",
|
||||||
Delegation: "DELEGATION",
|
NoData: "NODATA",
|
||||||
Meta: "META",
|
Delegation: "DELEGATION",
|
||||||
Update: "UPDATE",
|
Meta: "META",
|
||||||
OtherError: "OTHERERROR",
|
Update: "UPDATE",
|
||||||
|
OtherError: "OTHERERROR",
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t Type) String() string { return toString[t] }
|
func (t Type) String() string { return toString[t] }
|
||||||
|
@ -106,6 +109,10 @@ func Typify(m *dns.Msg, t time.Time) (Type, *dns.OPT) {
|
||||||
return NameError, opt
|
return NameError, opt
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if m.Rcode == dns.RcodeServerFailure || m.Rcode == dns.RcodeNotImplemented {
|
||||||
|
return ServerError, opt
|
||||||
|
}
|
||||||
|
|
||||||
if ns > 0 && m.Rcode == dns.RcodeSuccess {
|
if ns > 0 && m.Rcode == dns.RcodeSuccess {
|
||||||
return Delegation, opt
|
return Delegation, opt
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue