From e0c07146dc6f0dcf95dd18ee8df423cfa5bc9e3d Mon Sep 17 00:00:00 2001 From: nadoo <287492+nadoo@users.noreply.github.com> Date: Sun, 12 Aug 2018 22:00:12 +0800 Subject: [PATCH] strategy: do not check forwarders whose priority less than current value --- proxy/forwarder.go | 10 +++++----- strategy/strategy.go | 19 +++++++++++++------ 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/proxy/forwarder.go b/proxy/forwarder.go index e974627..8a2e8bc 100644 --- a/proxy/forwarder.go +++ b/proxy/forwarder.go @@ -19,7 +19,7 @@ type Forwarder struct { latency int } -// ForwarderFromURL returns a new forwarder +// ForwarderFromURL parses `forward=` command line and returns a new forwarder func ForwarderFromURL(s string) (f *Forwarder, err error) { ss := strings.Split(s, "#") var d Dialer @@ -38,7 +38,7 @@ func ForwarderFromURL(s string) (f *Forwarder, err error) { return f, err } -// NewForwarder . +// NewForwarder returns a new forwarder func NewForwarder(dialer Dialer) *Forwarder { return &Forwarder{Dialer: dialer, addr: dialer.Addr()} } @@ -83,18 +83,18 @@ func (f *Forwarder) Failures() uint32 { return atomic.LoadUint32(&f.failures) } -// Enable . +// Enable the forwarder func (f *Forwarder) Enable() { atomic.StoreUint32(&f.disabled, 0) atomic.StoreUint32(&f.failures, 0) } -// Disable . +// Disable the forwarder func (f *Forwarder) Disable() { atomic.StoreUint32(&f.disabled, 1) } -// Enabled . +// Enabled returns the status of forwarder func (f *Forwarder) Enabled() bool { return !isTrue(atomic.LoadUint32(&f.disabled)) } diff --git a/strategy/strategy.go b/strategy/strategy.go index 509c267..8c65c03 100644 --- a/strategy/strategy.go +++ b/strategy/strategy.go @@ -77,7 +77,12 @@ type rrDialer struct { // newRRDialer returns a new rrDialer func newRRDialer(fs []*proxy.Forwarder, website string, interval int) *rrDialer { rr := &rrDialer{fwdrs: fs} + rr.website = website + if strings.IndexByte(rr.website, ':') == -1 { + rr.website += ":80" + } + rr.interval = interval sort.Sort(rr.fwdrs) @@ -143,16 +148,18 @@ func (rr *rrDialer) checkDialer(idx int) { retry := 1 buf := make([]byte, 4) - if strings.IndexByte(rr.website, ':') == -1 { - rr.website = rr.website + ":80" - } - d := rr.fwdrs[idx] for { - time.Sleep(time.Duration(rr.interval) * time.Second * time.Duration(retry>>1)) - retry <<= 1 + time.Sleep(time.Duration(rr.interval) * time.Second * time.Duration(retry>>1)) + + // check forwarders whose priority not less than current priority only + if d.Priority < rr.priority { + continue + } + + retry <<= 1 if retry > 16 { retry = 16 }