forwarder: set status to disabled when dialing fails MaxFailures times

This commit is contained in:
nadoo 2018-08-12 21:40:22 +08:00
parent e1c318990b
commit b5b7f2998b
3 changed files with 16 additions and 11 deletions

View File

@ -45,7 +45,9 @@ func confInit() {
flag.StringSliceUniqVar(&conf.Forward, "forward", nil, "forward url, format: SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS[,SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS]") flag.StringSliceUniqVar(&conf.Forward, "forward", nil, "forward url, format: SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS[,SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS]")
flag.StringVar(&conf.StrategyConfig.Strategy, "strategy", "rr", "forward strategy, default: rr") flag.StringVar(&conf.StrategyConfig.Strategy, "strategy", "rr", "forward strategy, default: rr")
flag.StringVar(&conf.StrategyConfig.CheckWebSite, "checkwebsite", "www.apple.com", "proxy check HTTP(NOT HTTPS) website address, format: HOST[:PORT], default port: 80") flag.StringVar(&conf.StrategyConfig.CheckWebSite, "checkwebsite", "www.apple.com", "proxy check HTTP(NOT HTTPS) website address, format: HOST[:PORT], default port: 80")
// TODO: change to checkinterval
flag.IntVar(&conf.StrategyConfig.CheckInterval, "checkduration", 30, "proxy check interval(seconds)") flag.IntVar(&conf.StrategyConfig.CheckInterval, "checkduration", 30, "proxy check interval(seconds)")
flag.IntVar(&conf.StrategyConfig.MaxFailures, "maxfailures", 3, "max failures to change status to disabled")
flag.StringSliceUniqVar(&conf.RuleFile, "rulefile", nil, "rule file path") flag.StringSliceUniqVar(&conf.RuleFile, "rulefile", nil, "rule file path")
flag.StringVar(&conf.RulesDir, "rules-dir", "", "rule file folder") flag.StringVar(&conf.RulesDir, "rules-dir", "", "rule file folder")
@ -143,6 +145,7 @@ func NewRuleConfFromFile(ruleFile string) (*RuleConf, error) {
f.StringSliceUniqVar(&p.Forward, "forward", nil, "forward url, format: SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS[,SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS]") f.StringSliceUniqVar(&p.Forward, "forward", nil, "forward url, format: SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS[,SCHEME://[USER|METHOD:PASSWORD@][HOST]:PORT?PARAMS]")
f.StringVar(&p.StrategyConfig.Strategy, "strategy", "rr", "forward strategy, default: rr") f.StringVar(&p.StrategyConfig.Strategy, "strategy", "rr", "forward strategy, default: rr")
f.StringVar(&p.StrategyConfig.CheckWebSite, "checkwebsite", "www.apple.com", "proxy check HTTP(NOT HTTPS) website address, format: HOST[:PORT], default port: 80") f.StringVar(&p.StrategyConfig.CheckWebSite, "checkwebsite", "www.apple.com", "proxy check HTTP(NOT HTTPS) website address, format: HOST[:PORT], default port: 80")
// TODO: change to checkinterval
f.IntVar(&p.StrategyConfig.CheckInterval, "checkduration", 30, "proxy check interval(seconds)") f.IntVar(&p.StrategyConfig.CheckInterval, "checkduration", 30, "proxy check interval(seconds)")
f.StringSliceUniqVar(&p.DNSServers, "dnsserver", nil, "remote dns server") f.StringSliceUniqVar(&p.DNSServers, "dnsserver", nil, "remote dns server")

View File

@ -6,8 +6,6 @@ import (
"strconv" "strconv"
"strings" "strings"
"sync/atomic" "sync/atomic"
"github.com/nadoo/glider/common/log"
) )
// Forwarder is a forwarder // Forwarder is a forwarder
@ -17,6 +15,7 @@ type Forwarder struct {
addr string addr string
disabled uint32 disabled uint32
failures uint32 failures uint32
MaxFailures uint32 //maxfailures to set to Disabled
latency int latency int
} }
@ -68,11 +67,12 @@ func (f *Forwarder) Addr() string {
// Dial . // Dial .
func (f *Forwarder) Dial(network, addr string) (c net.Conn, err error) { func (f *Forwarder) Dial(network, addr string) (c net.Conn, err error) {
c, err = f.Dialer.Dial(network, addr) c, err = f.Dialer.Dial(network, addr)
// TODO: proxy timeout, target timeout?
if err != nil { if err != nil {
atomic.AddUint32(&f.failures, 1) atomic.AddUint32(&f.failures, 1)
log.F("forward dial failed, %d, addr: %s", f.failures, f.addr) }
if f.Failures() >= f.MaxFailures {
f.Disable()
} }
return c, err return c, err
@ -86,6 +86,7 @@ func (f *Forwarder) Failures() uint32 {
// Enable . // Enable .
func (f *Forwarder) Enable() { func (f *Forwarder) Enable() {
atomic.StoreUint32(&f.disabled, 0) atomic.StoreUint32(&f.disabled, 0)
atomic.StoreUint32(&f.failures, 0)
} }
// Disable . // Disable .

View File

@ -17,6 +17,7 @@ type Config struct {
Strategy string Strategy string
CheckWebSite string CheckWebSite string
CheckInterval int CheckInterval int
MaxFailures int
} }
// NewDialer returns a new strategy dialer // NewDialer returns a new strategy dialer
@ -28,6 +29,7 @@ func NewDialer(s []string, c *Config) proxy.Dialer {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
fwdr.MaxFailures = uint32(c.MaxFailures)
fwdrs = append(fwdrs, fwdr) fwdrs = append(fwdrs, fwdr)
} }
@ -82,7 +84,6 @@ func newRRDialer(fs []*proxy.Forwarder, website string, interval int) *rrDialer
rr.priority = rr.fwdrs[0].Priority rr.priority = rr.fwdrs[0].Priority
for k := range rr.fwdrs { for k := range rr.fwdrs {
log.F("k: %d, %s, priority: %d", k, rr.fwdrs[k].Addr(), rr.fwdrs[k].Priority)
go rr.checkDialer(k) go rr.checkDialer(k)
} }