aboutsummaryrefslogtreecommitdiff
path: root/request
diff options
context:
space:
mode:
authorGravatar Miek Gieben <miek@miek.nl> 2018-05-01 21:04:06 +0100
committerGravatar GitHub <noreply@github.com> 2018-05-01 21:04:06 +0100
commit5735292406caf7d490853cee37f12126a8b7a4dc (patch)
tree119996d193d3cbf893992ad9b9ddfbba4caf342c /request
parentc48531bb35fa1bb5f9e41a00d98794ea1978f01e (diff)
downloadcoredns-5735292406caf7d490853cee37f12126a8b7a4dc.tar.gz
coredns-5735292406caf7d490853cee37f12126a8b7a4dc.tar.zst
coredns-5735292406caf7d490853cee37f12126a8b7a4dc.zip
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
Diffstat (limited to 'request')
-rw-r--r--request/request.go15
1 files changed, 10 insertions, 5 deletions
diff --git a/request/request.go b/request/request.go
index ac5f509f4..c45f6e571 100644
--- a/request/request.go
+++ b/request/request.go
@@ -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()
+
+ reply.Compress = false
rl := reply.Len()
+ if size >= rl {
+ return reply, ScrubIgnored
+ }
+ reply.Compress = true
+ rl = reply.Len()
if size >= rl {
return reply, ScrubIgnored
}