chore: Add max-failed-times
Some checks are pending
Build / build (map[abi:1 goarch:loong64 goos:linux output:loong64-abi1]) (push) Waiting to run
Build / build (map[abi:2 goarch:loong64 goos:linux output:loong64-abi2]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:darwin goversion:1.20 output:amd64-compatible-go120]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:darwin output:amd64-compatible]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:freebsd output:amd64-compatible]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:linux goversion:1.20 output:amd64-compatible-go120 test:test]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:linux output:amd64-compatible test:test]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:windows goversion:1.20 output:amd64-compatible-go120]) (push) Waiting to run
Build / build (map[goamd64:v1 goarch:amd64 goos:windows output:amd64-compatible]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:darwin goversion:1.20 output:amd64-go120]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:darwin output:amd64]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:freebsd output:amd64]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:linux goversion:1.20 output:amd64-go120]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:linux output:amd64]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:windows goversion:1.20 output:amd64-go120]) (push) Waiting to run
Build / build (map[goamd64:v3 goarch:amd64 goos:windows output:amd64]) (push) Waiting to run
Build / build (map[goarch:386 goos:android ndk:i686-linux-android34 output:386]) (push) Waiting to run
Build / build (map[goarch:386 goos:freebsd output:386]) (push) Waiting to run
Build / build (map[goarch:386 goos:linux goversion:1.20 output:386-go120]) (push) Waiting to run
Build / build (map[goarch:386 goos:linux output:386]) (push) Waiting to run
Build / build (map[goarch:386 goos:windows goversion:1.20 output:386-go120]) (push) Waiting to run
Build / build (map[goarch:386 goos:windows output:386]) (push) Waiting to run
Build / build (map[goarch:amd64 goos:android ndk:x86_64-linux-android34 output:amd64]) (push) Waiting to run
Build / build (map[goarch:arm goarm:7 goos:linux output:armv7]) (push) Waiting to run
Build / build (map[goarch:arm goarm:7 goos:windows output:armv7]) (push) Waiting to run
Build / build (map[goarch:arm goos:android ndk:armv7a-linux-androideabi34 output:armv7]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:android ndk:aarch64-linux-android34 output:arm64-v8]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:darwin goversion:1.20 output:arm64-go120]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:darwin output:arm64]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:freebsd output:arm64]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:linux output:arm64]) (push) Waiting to run
Build / build (map[goarch:arm64 goos:windows output:arm64]) (push) Waiting to run
Build / build (map[goarch:mips goos:linux mips:hardfloat output:mips-hardfloat]) (push) Waiting to run
Build / build (map[goarch:mips goos:linux mips:softfloat output:mips-softfloat]) (push) Waiting to run
Build / build (map[goarch:mips64 goos:linux output:mips64]) (push) Waiting to run
Build / build (map[goarch:mips64le goos:linux output:mips64le]) (push) Waiting to run
Build / build (map[goarch:mipsle goos:linux mips:hardfloat output:mipsle-hardfloat]) (push) Waiting to run
Build / build (map[goarch:mipsle goos:linux mips:softfloat output:mipsle-softfloat]) (push) Waiting to run
Build / build (map[goarch:riscv64 goos:linux output:riscv64]) (push) Waiting to run
Build / build (map[goarch:s390x goos:linux output:s390x]) (push) Waiting to run
Build / Upload-Prerelease (push) Blocked by required conditions
Build / Upload-Release (push) Blocked by required conditions
Build / Docker (push) Blocked by required conditions
Trigger CMFA Update / trigger-CMFA-update (push) Waiting to run

This commit is contained in:
xishang0128 2024-03-07 03:35:11 +08:00
parent 823f59b5c7
commit 04886761a2
No known key found for this signature in database
GPG key ID: 44A1E10B5ADF68CB
7 changed files with 30 additions and 18 deletions

View file

@ -164,6 +164,8 @@ func NewFallback(option *GroupCommonOption, providers []provider.ProxyProvider)
option.Filter,
option.ExcludeFilter,
option.ExcludeType,
option.TestTimeout,
option.MaxFailedTimes,
providers,
}),
disableUDP: option.DisableUDP,

View file

@ -31,14 +31,18 @@ type GroupBase struct {
failedTesting atomic.Bool
proxies [][]C.Proxy
versions []atomic.Uint32
TestTimeout int
maxFailedTimes int
}
type GroupBaseOption struct {
outbound.BaseOption
filter string
excludeFilter string
excludeType string
providers []provider.ProxyProvider
filter string
excludeFilter string
excludeType string
TestTimeout int
maxFailedTimes int
providers []provider.ProxyProvider
}
func NewGroupBase(opt GroupBaseOption) *GroupBase {
@ -66,6 +70,15 @@ func NewGroupBase(opt GroupBaseOption) *GroupBase {
excludeTypeArray: excludeTypeArray,
providers: opt.providers,
failedTesting: atomic.NewBool(false),
TestTimeout: opt.TestTimeout,
maxFailedTimes: opt.maxFailedTimes,
}
if gb.TestTimeout == 0 {
gb.TestTimeout = 5000
}
if gb.maxFailedTimes == 0 {
gb.maxFailedTimes = 5
}
gb.proxies = make([][]C.Proxy, len(opt.providers))
@ -240,13 +253,13 @@ func (gb *GroupBase) onDialFailed(adapterType C.AdapterType, err error) {
log.Debugln("ProxyGroup: %s first failed", gb.Name())
gb.failedTime = time.Now()
} else {
if time.Since(gb.failedTime) > gb.failedTimeoutInterval() {
if time.Since(gb.failedTime) > time.Duration(gb.TestTimeout)*time.Millisecond {
gb.failedTimes = 0
return
}
log.Debugln("ProxyGroup: %s failed count: %d", gb.Name(), gb.failedTimes)
if gb.failedTimes >= gb.maxFailedTimes() {
if gb.failedTimes >= gb.maxFailedTimes {
log.Warnln("because %s failed multiple times, active health check", gb.Name())
gb.healthCheck()
}
@ -275,20 +288,8 @@ func (gb *GroupBase) healthCheck() {
gb.failedTimes = 0
}
func (gb *GroupBase) failedIntervalTime() int64 {
return 5 * time.Second.Milliseconds()
}
func (gb *GroupBase) onDialSuccess() {
if !gb.failedTesting.Load() {
gb.failedTimes = 0
}
}
func (gb *GroupBase) maxFailedTimes() int {
return 5
}
func (gb *GroupBase) failedTimeoutInterval() time.Duration {
return 5 * time.Second
}

View file

@ -266,6 +266,8 @@ func NewLoadBalance(option *GroupCommonOption, providers []provider.ProxyProvide
option.Filter,
option.ExcludeFilter,
option.ExcludeType,
option.TestTimeout,
option.MaxFailedTimes,
providers,
}),
strategyFn: strategyFn,

View file

@ -29,6 +29,7 @@ type GroupCommonOption struct {
URL string `group:"url,omitempty"`
Interval int `group:"interval,omitempty"`
TestTimeout int `group:"timeout,omitempty"`
MaxFailedTimes int `group:"max-failed-times,omitempty"`
Lazy bool `group:"lazy,omitempty"`
DisableUDP bool `group:"disable-udp,omitempty"`
Filter string `group:"filter,omitempty"`

View file

@ -160,6 +160,8 @@ func NewRelay(option *GroupCommonOption, providers []provider.ProxyProvider) *Re
"",
"",
"",
5000,
5,
providers,
}),
Hidden: option.Hidden,

View file

@ -114,6 +114,8 @@ func NewSelector(option *GroupCommonOption, providers []provider.ProxyProvider)
option.Filter,
option.ExcludeFilter,
option.ExcludeType,
option.TestTimeout,
option.MaxFailedTimes,
providers,
}),
selected: "COMPATIBLE",

View file

@ -235,6 +235,8 @@ func NewURLTest(option *GroupCommonOption, providers []provider.ProxyProvider, o
option.Filter,
option.ExcludeFilter,
option.ExcludeType,
option.TestTimeout,
option.MaxFailedTimes,
providers,
}),
fastSingle: singledo.NewSingle[C.Proxy](time.Second * 10),