Skip to content

Commit

Permalink
improvement related to performance
Browse files Browse the repository at this point in the history
  • Loading branch information
caffix committed Jul 24, 2024
1 parent c8a3796 commit 5f20179
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 40 deletions.
11 changes: 5 additions & 6 deletions rate.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,10 @@ import (
)

const (
maxQPSPerNameserver = 100
numIntervalSeconds = 10
maxQPSPerNameserver = 250
numIntervalSeconds = 2
rateUpdateInterval = numIntervalSeconds * time.Second
maxTimeoutPercentage = 0.2
maxTimeoutPercentage = 0.5
)

type rateTrack struct {
Expand Down Expand Up @@ -129,13 +129,12 @@ func (rt *rateTrack) update() {
}
// timeouts in excess of maxTimeoutPercentage indicate a need to slow down
if float64(rt.timeout)/float64(rt.success+rt.timeout) > maxTimeoutPercentage {
p := float64(rt.success) / float64(rt.success+rt.timeout)
rt.qps = int(float64(rt.qps) * p)
rt.qps -= 1
if rt.qps <= 0 {
rt.qps = 1
}
} else {
rt.qps = rt.qps + 10
rt.qps += 1
}
// update the QPS rate limiter and reset counters
rt.rate = ratelimit.New(rt.qps)
Expand Down
36 changes: 4 additions & 32 deletions selector.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,53 +41,25 @@ func newRandomSelector() *randomSelector {

// GetResolver performs random selection on the pool of resolvers.
func (r *randomSelector) GetResolver() *resolver {
max := r.maxQPS()
if max == -1 {
return nil
}
sel := rand.Intn(max)

r.Lock()
defer r.Unlock()

var cur int
var chosen *resolver
sel := rand.Intn(len(r.list) + 1)
loop:
for _, res := range r.list {
for _, res := range r.list[sel:] {
select {
case <-res.done:
continue loop
default:
}

cur += res.qps
if sel < cur {
chosen = res
break
}
chosen = res
break
}
return chosen
}

func (r *randomSelector) maxQPS() int {
r.Lock()
defer r.Unlock()

if len(r.list) == 0 {
return -1
}

var max int
for _, res := range r.list {
select {
case <-res.done:
default:
max += res.qps
}
}
return max
}

func (r *randomSelector) LookupResolver(addr string) *resolver {
r.Lock()
defer r.Unlock()
Expand Down
4 changes: 2 additions & 2 deletions walk.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ func (r *Resolvers) NsecTraversal(ctx context.Context, domain string) ([]*dns.NS
found = false
var nsec *dns.NSEC

nsec, err = r.searchGap(ctx, next, domain)
nsec, err = r.searchGap(ctx, next)
if err == nil {
if _, yes := names[nsec.NextDomain]; yes {
break
Expand All @@ -49,7 +49,7 @@ func (r *Resolvers) NsecTraversal(ctx context.Context, domain string) ([]*dns.NS
return results, err
}

func (r *Resolvers) searchGap(ctx context.Context, name, domain string) (*dns.NSEC, error) {
func (r *Resolvers) searchGap(ctx context.Context, name string) (*dns.NSEC, error) {
for i := 0; i < maxQueryAttempts; i++ {
resp, err := r.QueryBlocking(ctx, WalkMsg(name, dns.TypeNSEC))
if err != nil || resp.Rcode == dns.RcodeNameError {
Expand Down

0 comments on commit 5f20179

Please sign in to comment.