Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
f147fb47bb | |||
b6dfdcd5ef |
@ -172,40 +172,43 @@ func (m measurement) String() string {
|
||||
}
|
||||
|
||||
func (s *Server) probeUpstreamLatency() {
|
||||
upstreams := s.upstreams()
|
||||
results := make([]measurement, len(upstreams))
|
||||
var wg sync.WaitGroup
|
||||
for idx, u := range upstreams {
|
||||
wg.Add(1)
|
||||
go func(idx int, u string) {
|
||||
defer wg.Done()
|
||||
// resolve a most-definitely cached record
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion("google.ch.", dns.TypeA)
|
||||
start := time.Now()
|
||||
_, _, err := s.client.Exchange(m, u)
|
||||
rtt := time.Since(start)
|
||||
if err != nil {
|
||||
// including unresponsive upstreams in results makes the update
|
||||
// code simpler:
|
||||
results[idx] = measurement{u, time.Duration(math.MaxInt64)}
|
||||
return
|
||||
}
|
||||
results[idx] = measurement{u, rtt}
|
||||
}(idx, u)
|
||||
if !s.once {
|
||||
s.once = true
|
||||
upstreams := s.upstreams()
|
||||
results := make([]measurement, len(upstreams))
|
||||
var wg sync.WaitGroup
|
||||
for idx, u := range upstreams {
|
||||
wg.Add(1)
|
||||
go func(idx int, u string) {
|
||||
defer wg.Done()
|
||||
// resolve a most-definitely cached record
|
||||
m := new(dns.Msg)
|
||||
m.SetQuestion("google.ch.", dns.TypeA)
|
||||
start := time.Now()
|
||||
_, _, err := s.client.Exchange(m, u)
|
||||
rtt := time.Since(start)
|
||||
if err != nil {
|
||||
// including unresponsive upstreams in results makes the update
|
||||
// code simpler:
|
||||
results[idx] = measurement{u, time.Duration(math.MaxInt64)}
|
||||
return
|
||||
}
|
||||
results[idx] = measurement{u, rtt}
|
||||
}(idx, u)
|
||||
}
|
||||
wg.Wait()
|
||||
// Re-order by resolving latency:
|
||||
sort.Slice(results, func(i, j int) bool {
|
||||
return results[i].rtt < results[j].rtt
|
||||
})
|
||||
log.Printf("probe results: %v %v", s.once, results)
|
||||
for idx, result := range results {
|
||||
upstreams[idx] = result.upstream
|
||||
}
|
||||
s.upstreamMu.Lock()
|
||||
defer s.upstreamMu.Unlock()
|
||||
s.upstream = upstreams
|
||||
}
|
||||
wg.Wait()
|
||||
// Re-order by resolving latency:
|
||||
sort.Slice(results, func(i, j int) bool {
|
||||
return results[i].rtt < results[j].rtt
|
||||
})
|
||||
log.Printf("probe results: %v", results)
|
||||
for idx, result := range results {
|
||||
upstreams[idx] = result.upstream
|
||||
}
|
||||
s.upstreamMu.Lock()
|
||||
defer s.upstreamMu.Unlock()
|
||||
s.upstream = upstreams
|
||||
}
|
||||
|
||||
func (s *Server) hostByName(n lcHostname) (string, bool) {
|
||||
@ -477,7 +480,6 @@ func (s *Server) handleInternal(w dns.ResponseWriter, r *dns.Msg) {
|
||||
if err == errEmpty {
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.RecursionAvailable = true
|
||||
w.WriteMsg(m)
|
||||
return
|
||||
}
|
||||
@ -486,7 +488,6 @@ func (s *Server) handleInternal(w dns.ResponseWriter, r *dns.Msg) {
|
||||
if rr != nil {
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.RecursionAvailable = true
|
||||
m.Answer = append(m.Answer, rr)
|
||||
w.WriteMsg(m)
|
||||
return
|
||||
@ -494,7 +495,6 @@ func (s *Server) handleInternal(w dns.ResponseWriter, r *dns.Msg) {
|
||||
// Send an authoritative NXDOMAIN for local:
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.RecursionAvailable = true
|
||||
m.SetRcode(r, dns.RcodeNameError)
|
||||
w.WriteMsg(m)
|
||||
}
|
||||
@ -582,7 +582,6 @@ func (s *Server) subnameHandler(hostname lcHostname) func(w dns.ResponseWriter,
|
||||
if err == errEmpty {
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.RecursionAvailable = true
|
||||
w.WriteMsg(m)
|
||||
return
|
||||
}
|
||||
@ -592,7 +591,6 @@ func (s *Server) subnameHandler(hostname lcHostname) func(w dns.ResponseWriter,
|
||||
s.promInc("local", r)
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.RecursionAvailable = true
|
||||
m.Answer = append(m.Answer, rr)
|
||||
w.WriteMsg(m)
|
||||
return
|
||||
@ -603,7 +601,6 @@ func (s *Server) subnameHandler(hostname lcHostname) func(w dns.ResponseWriter,
|
||||
s.promInc("local", r)
|
||||
m := new(dns.Msg)
|
||||
m.SetReply(r)
|
||||
m.RecursionAvailable = true
|
||||
m.SetRcode(r, dns.RcodeNameError)
|
||||
w.WriteMsg(m)
|
||||
return
|
||||
|
Reference in New Issue
Block a user