Skip to content

Commit

Permalink
Sum lookup + query time to select the fastest server
Browse files Browse the repository at this point in the history
  • Loading branch information
rs committed Aug 10, 2018
1 parent d75cb7b commit 6d61313
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 23 deletions.
37 changes: 17 additions & 20 deletions client/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"errors"
"net"
"strings"
"sync"
"time"

"github.com/miekg/dns"
Expand All @@ -18,7 +19,7 @@ type Client struct {

// Response stores a DNS response.
type Response struct {
Server string
Server Server
Addr string
Msg *dns.Msg
RTT time.Duration
Expand All @@ -29,12 +30,16 @@ type Responses []Response

// Fastest returns the fastest success response or nil.
func (rs Responses) Fastest() *Response {
var fr Response
for _, r := range rs {
if r.Err == nil {
return &r
if r.Err != nil {
continue
}
if fr.Msg == nil || ((r.RTT + r.Server.LookupRTT) < (fr.RTT + fr.Server.LookupRTT)) {
fr = r
}
}
return nil
return &fr
}

type Tracer struct {
Expand All @@ -58,14 +63,14 @@ func (c *Client) ParallelQuery(m *dns.Msg, servers []Server) Responses {
for _, s := range servers {
for _, addr := range s.Addrs {
cnt++
go func(name, addr string) {
go func(s Server, addr string) {
r := Response{
Server: name,
Server: s,
Addr: addr,
}
r.Msg, r.RTT, r.Err = c.Exchange(m, net.JoinHostPort(addr, "53"))
rc <- r
}(s.Name, addr)
}(s, addr)
}
}
rs := make([]Response, 0, cnt)
Expand Down Expand Up @@ -103,7 +108,7 @@ func (c *Client) RecursiveQuery(m *dns.Msg, tracer Tracer) (r *dns.Msg, rtt time
}
return nil, rtt, errors.New("no response")
}
rtt += fr.RTT
rtt += fr.Server.LookupRTT + fr.RTT

var done bool
var deleg bool
Expand All @@ -129,8 +134,7 @@ func (c *Client) RecursiveQuery(m *dns.Msg, tracer Tracer) (r *dns.Msg, rtt time
}

if deleg {
lrttc := make(chan time.Duration)
lc := 0
wg := &sync.WaitGroup{}
for _, ns := range r.Ns {
ns, ok := ns.(*dns.NS)
if !ok {
Expand All @@ -155,7 +159,7 @@ func (c *Client) RecursiveQuery(m *dns.Msg, tracer Tracer) (r *dns.Msg, rtt time
Addrs: addrs,
}
if !s.HasGlue {
lc++
wg.Add(1)
go func() {
var err error
lm := m.Copy()
Expand All @@ -165,7 +169,7 @@ func (c *Client) RecursiveQuery(m *dns.Msg, tracer Tracer) (r *dns.Msg, rtt time
s.LookupErr = err
}
c.DCache.Add(name, s)
lrttc <- s.LookupRTT
wg.Done()
}()
continue
}
Expand All @@ -176,14 +180,7 @@ func (c *Client) RecursiveQuery(m *dns.Msg, tracer Tracer) (r *dns.Msg, rtt time
break
}
}
var lrtt time.Duration
for ; lc > 0; lc-- {
d := <-lrttc
if lrtt == 0 || lrtt > d {
lrtt = d
}
}
rtt += lrtt
wg.Wait()
}

if tracer.GotDelegateResponses != nil {
Expand Down
7 changes: 4 additions & 3 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,8 @@ func main() {
ln = pr.Msg.Len()
}
rtt := float64(pr.RTT) / float64(time.Millisecond)
fmt.Printf(col(" - %d bytes in %6.2fms on %s(%s)", cDarkGray), ln, rtt, pr.Addr, pr.Server)
lrtt := float64(pr.Server.LookupRTT) / float64(time.Millisecond)
fmt.Printf(col(" - %3d bytes in %6.2fms + %6.2fms on %s(%s)", cDarkGray), ln, rtt, lrtt, pr.Addr, pr.Server.Name)
if pr.Err != nil {
err := pr.Err
if oerr, ok := err.(*net.OpError); ok {
Expand Down Expand Up @@ -146,13 +147,13 @@ func main() {
},
}
r, rtt, err := c.RecursiveQuery(m, t)

if err != nil {
fmt.Printf(col("*** error: %v\n", cRed), err)
os.Exit(1)
}

fmt.Println()
fmt.Printf(col(";; Cold best path RTT: %s\n\n", cGray), rtt)
fmt.Printf(col(";; Cold best path time: %s\n\n", cGray), rtt)
for _, rr := range r.Answer {
fmt.Println(rr)
}
Expand Down

0 comments on commit 6d61313

Please sign in to comment.