mirror of
https://github.com/nadoo/glider.git
synced 2025-02-24 01:45:39 +08:00
strategy: do not check forwarders whose priority less than current value
This commit is contained in:
parent
b5b7f2998b
commit
e0c07146dc
@ -19,7 +19,7 @@ type Forwarder struct {
|
|||||||
latency int
|
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) {
|
func ForwarderFromURL(s string) (f *Forwarder, err error) {
|
||||||
ss := strings.Split(s, "#")
|
ss := strings.Split(s, "#")
|
||||||
var d Dialer
|
var d Dialer
|
||||||
@ -38,7 +38,7 @@ func ForwarderFromURL(s string) (f *Forwarder, err error) {
|
|||||||
return f, err
|
return f, err
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewForwarder .
|
// NewForwarder returns a new forwarder
|
||||||
func NewForwarder(dialer Dialer) *Forwarder {
|
func NewForwarder(dialer Dialer) *Forwarder {
|
||||||
return &Forwarder{Dialer: dialer, addr: dialer.Addr()}
|
return &Forwarder{Dialer: dialer, addr: dialer.Addr()}
|
||||||
}
|
}
|
||||||
@ -83,18 +83,18 @@ func (f *Forwarder) Failures() uint32 {
|
|||||||
return atomic.LoadUint32(&f.failures)
|
return atomic.LoadUint32(&f.failures)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enable .
|
// Enable the forwarder
|
||||||
func (f *Forwarder) Enable() {
|
func (f *Forwarder) Enable() {
|
||||||
atomic.StoreUint32(&f.disabled, 0)
|
atomic.StoreUint32(&f.disabled, 0)
|
||||||
atomic.StoreUint32(&f.failures, 0)
|
atomic.StoreUint32(&f.failures, 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disable .
|
// Disable the forwarder
|
||||||
func (f *Forwarder) Disable() {
|
func (f *Forwarder) Disable() {
|
||||||
atomic.StoreUint32(&f.disabled, 1)
|
atomic.StoreUint32(&f.disabled, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enabled .
|
// Enabled returns the status of forwarder
|
||||||
func (f *Forwarder) Enabled() bool {
|
func (f *Forwarder) Enabled() bool {
|
||||||
return !isTrue(atomic.LoadUint32(&f.disabled))
|
return !isTrue(atomic.LoadUint32(&f.disabled))
|
||||||
}
|
}
|
||||||
|
@ -77,7 +77,12 @@ type rrDialer struct {
|
|||||||
// newRRDialer returns a new rrDialer
|
// newRRDialer returns a new rrDialer
|
||||||
func newRRDialer(fs []*proxy.Forwarder, website string, interval int) *rrDialer {
|
func newRRDialer(fs []*proxy.Forwarder, website string, interval int) *rrDialer {
|
||||||
rr := &rrDialer{fwdrs: fs}
|
rr := &rrDialer{fwdrs: fs}
|
||||||
|
|
||||||
rr.website = website
|
rr.website = website
|
||||||
|
if strings.IndexByte(rr.website, ':') == -1 {
|
||||||
|
rr.website += ":80"
|
||||||
|
}
|
||||||
|
|
||||||
rr.interval = interval
|
rr.interval = interval
|
||||||
|
|
||||||
sort.Sort(rr.fwdrs)
|
sort.Sort(rr.fwdrs)
|
||||||
@ -143,16 +148,18 @@ func (rr *rrDialer) checkDialer(idx int) {
|
|||||||
retry := 1
|
retry := 1
|
||||||
buf := make([]byte, 4)
|
buf := make([]byte, 4)
|
||||||
|
|
||||||
if strings.IndexByte(rr.website, ':') == -1 {
|
|
||||||
rr.website = rr.website + ":80"
|
|
||||||
}
|
|
||||||
|
|
||||||
d := rr.fwdrs[idx]
|
d := rr.fwdrs[idx]
|
||||||
|
|
||||||
for {
|
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 {
|
if retry > 16 {
|
||||||
retry = 16
|
retry = 16
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user