strategy: try to fix #135 #142

This commit is contained in:
nadoo 2020-04-03 20:15:22 +08:00
parent 1789d97f00
commit 1204cf30fd

View File

@ -41,7 +41,7 @@ type Proxy struct {
index uint32 index uint32
priority uint32 priority uint32
nextForwarder func(addr string) *Forwarder next func(addr string) *Forwarder
} }
// NewProxy returns a new strategy proxy. // NewProxy returns a new strategy proxy.
@ -78,19 +78,19 @@ func newProxy(fwdrs []*Forwarder, c *Config) *Proxy {
switch c.Strategy { switch c.Strategy {
case "rr": case "rr":
d.nextForwarder = d.scheduleRR d.next = d.scheduleRR
log.F("[strategy] forward to remote servers in round robin mode.") log.F("[strategy] forward to remote servers in round robin mode.")
case "ha": case "ha":
d.nextForwarder = d.scheduleHA d.next = d.scheduleHA
log.F("[strategy] forward to remote servers in high availability mode.") log.F("[strategy] forward to remote servers in high availability mode.")
case "lha": case "lha":
d.nextForwarder = d.scheduleLHA d.next = d.scheduleLHA
log.F("[strategy] forward to remote servers in latency based high availability mode.") log.F("[strategy] forward to remote servers in latency based high availability mode.")
case "dh": case "dh":
d.nextForwarder = d.scheduleDH d.next = d.scheduleDH
log.F("[strategy] forward to remote servers in destination hashing mode.") log.F("[strategy] forward to remote servers in destination hashing mode.")
default: default:
d.nextForwarder = d.scheduleRR d.next = d.scheduleRR
log.F("[strategy] not supported forward mode '%s', use round robin mode.", c.Strategy) log.F("[strategy] not supported forward mode '%s', use round robin mode.", c.Strategy)
} }
@ -118,7 +118,19 @@ func (p *Proxy) NextDialer(dstAddr string) proxy.Dialer {
p.mu.RLock() p.mu.RLock()
defer p.mu.RUnlock() defer p.mu.RUnlock()
return p.nextForwarder(dstAddr) return p.NextForwarder(dstAddr)
}
// NextDialer returns the next dialer.
func (p *Proxy) NextForwarder(dstAddr string) *Forwarder {
p.mu.RLock()
defer p.mu.RUnlock()
if len(p.available) == 0 {
return p.fwdrs[0]
}
return p.next(dstAddr)
} }
// Priority returns the active priority of dialer. // Priority returns the active priority of dialer.
@ -146,8 +158,7 @@ func (p *Proxy) initAvailable() {
if len(p.available) == 0 { if len(p.available) == 0 {
// no available forwarders, set priority to 0 to check all forwarders in check func // no available forwarders, set priority to 0 to check all forwarders in check func
p.SetPriority(0) p.SetPriority(0)
log.F("[strategy] no available forwarders, just use: %s, please check your settings or network", p.fwdrs[0].Addr()) log.F("[strategy] no available forwarders, just use: %s, please check your config file or network settings", p.fwdrs[0].Addr())
p.available = append(p.available, p.fwdrs[0])
} }
} }
@ -173,9 +184,9 @@ func (p *Proxy) onStatusChanged(fwdr *Forwarder) {
} }
} }
if len(p.available) == 0 { // if len(p.available) == 0 {
p.initAvailable() // p.initAvailable()
} // }
} }
// Check implements the Checker interface. // Check implements the Checker interface.