Do Compress only when need in request.Scrub (#1760)

* Remove Compress by default

Set Compress = true in Scrub only when the message doesn not fit the
advertized buffer. Doing compression is expensive, so try to avoid it.

Master vs this branch
pkg: github.com/coredns/coredns/plugin/cache
BenchmarkCacheResponse-2   	   50000	     24774 ns/op

pkg: github.com/coredns/coredns/plugin/cache
BenchmarkCacheResponse-2   	  100000	     21960 ns/op

* and make it compile
This commit is contained in:
Miek Gieben
2018-05-01 21:04:06 +01:00
committed by GitHub
parent c48531bb35
commit 5735292406
17 changed files with 27 additions and 23 deletions

View File

@@ -180,20 +180,25 @@ const (
ScrubAnswer
)
// Scrub scrubs the reply message so that it will fit the client's buffer. It sets
// reply.Compress to true.
// Scrub uses binary search to find a save cut off point in the additional section.
// Scrub scrubs the reply message so that it will fit the client's buffer. It will first
// check if the reply fits without compression and then *with* compression.
// Scrub will then use binary search to find a save cut off point in the additional section.
// If even *without* the additional section the reply still doesn't fit we
// repeat this process for the answer section. If we scrub the answer section
// we set the TC bit on the reply; indicating the client should retry over TCP.
// Note, the TC bit will be set regardless of protocol, even TCP message will
// get the bit, the client should then retry with pigeons.
func (r *Request) Scrub(reply *dns.Msg) (*dns.Msg, Result) {
reply.Compress = true
size := r.Size()
rl := reply.Len()
reply.Compress = false
rl := reply.Len()
if size >= rl {
return reply, ScrubIgnored
}
reply.Compress = true
rl = reply.Len()
if size >= rl {
return reply, ScrubIgnored
}