strategy: do not check forwarders whose priority less than current value

This commit is contained in:
nadoo 2018-08-12 22:00:12 +08:00
parent b5b7f2998b
commit e0c07146dc
2 changed files with 18 additions and 11 deletions

View File

@ -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))
}

View File

@ -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
}