aboutsummaryrefslogtreecommitdiff
path: root/plugin
diff options
context:
space:
mode:
Diffstat (limited to 'plugin')
-rw-r--r--plugin/forward/connect.go22
-rw-r--r--plugin/forward/proxy.go3
2 files changed, 24 insertions, 1 deletions
diff --git a/plugin/forward/connect.go b/plugin/forward/connect.go
index 6f9897550..13631ca89 100644
--- a/plugin/forward/connect.go
+++ b/plugin/forward/connect.go
@@ -7,6 +7,7 @@ package forward
import (
"io"
"strconv"
+ "sync/atomic"
"time"
"github.com/coredns/coredns/request"
@@ -15,6 +16,19 @@ import (
"golang.org/x/net/context"
)
+func (p *Proxy) readTimeout() time.Duration {
+ rtt := time.Duration(atomic.LoadInt64(&p.avgRtt))
+ if rtt < timeout/2 {
+ return 2 * rtt
+ }
+ return timeout
+}
+
+func (p *Proxy) updateRtt(newRtt time.Duration) {
+ rtt := time.Duration(atomic.LoadInt64(&p.avgRtt))
+ atomic.AddInt64(&p.avgRtt, int64((newRtt-rtt)/rttCount))
+}
+
func (p *Proxy) connect(ctx context.Context, state request.Request, forceTCP, metric bool) (*dns.Msg, error) {
start := time.Now()
@@ -35,6 +49,7 @@ func (p *Proxy) connect(ctx context.Context, state request.Request, forceTCP, me
}
conn.SetWriteDeadline(time.Now().Add(timeout))
+ reqTime := time.Now()
if err := conn.WriteMsg(state.Req); err != nil {
conn.Close() // not giving it back
if err == io.EOF && cached {
@@ -43,9 +58,10 @@ func (p *Proxy) connect(ctx context.Context, state request.Request, forceTCP, me
return nil, err
}
- conn.SetReadDeadline(time.Now().Add(timeout))
+ conn.SetReadDeadline(time.Now().Add(p.readTimeout()))
ret, err := conn.ReadMsg()
if err != nil {
+ p.updateRtt(timeout)
conn.Close() // not giving it back
if err == io.EOF && cached {
return nil, errCachedClosed
@@ -53,6 +69,8 @@ func (p *Proxy) connect(ctx context.Context, state request.Request, forceTCP, me
return nil, err
}
+ p.updateRtt(time.Since(reqTime))
+
p.Yield(conn)
if metric {
@@ -68,3 +86,5 @@ func (p *Proxy) connect(ctx context.Context, state request.Request, forceTCP, me
return ret, nil
}
+
+const rttCount = 4
diff --git a/plugin/forward/proxy.go b/plugin/forward/proxy.go
index 02d3512cb..55f285359 100644
--- a/plugin/forward/proxy.go
+++ b/plugin/forward/proxy.go
@@ -22,6 +22,8 @@ type Proxy struct {
// health checking
probe *up.Probe
fails uint32
+
+ avgRtt int64
}
// NewProxy returns a new proxy.
@@ -31,6 +33,7 @@ func NewProxy(addr string, tlsConfig *tls.Config) *Proxy {
fails: 0,
probe: up.New(),
transport: newTransport(addr, tlsConfig),
+ avgRtt: int64(timeout / 2),
}
p.client = dnsClient(tlsConfig)
return p