fix: Temporarily delete marking node alive as false when error occurs

This commit is contained in:
gVisor bot 2022-08-13 17:23:42 +08:00
parent 3e649ae8e8
commit 545af5d11c
3 changed files with 16 additions and 16 deletions

View file

@ -11,7 +11,6 @@ import (
"net/http" "net/http"
"net/netip" "net/netip"
"net/url" "net/url"
"strings"
"time" "time"
"go.uber.org/atomic" "go.uber.org/atomic"
@ -40,11 +39,6 @@ func (p *Proxy) Dial(metadata *C.Metadata) (C.Conn, error) {
// DialContext implements C.ProxyAdapter // DialContext implements C.ProxyAdapter
func (p *Proxy) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) { func (p *Proxy) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.Conn, error) {
conn, err := p.ProxyAdapter.DialContext(ctx, metadata, opts...) conn, err := p.ProxyAdapter.DialContext(ctx, metadata, opts...)
wasCancel := false
if err != nil {
wasCancel = strings.Contains(err.Error(), "operation was canceled")
}
p.alive.Store(err == nil || wasCancel)
return conn, err return conn, err
} }
@ -58,7 +52,6 @@ func (p *Proxy) DialUDP(metadata *C.Metadata) (C.PacketConn, error) {
// ListenPacketContext implements C.ProxyAdapter // ListenPacketContext implements C.ProxyAdapter
func (p *Proxy) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) { func (p *Proxy) ListenPacketContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (C.PacketConn, error) {
pc, err := p.ProxyAdapter.ListenPacketContext(ctx, metadata, opts...) pc, err := p.ProxyAdapter.ListenPacketContext(ctx, metadata, opts...)
p.alive.Store(err == nil)
return pc, err return pc, err
} }

View file

@ -79,17 +79,23 @@ func (f *Fallback) Unwrap(metadata *C.Metadata) C.Proxy {
func (f *Fallback) findAliveProxy(touch bool) C.Proxy { func (f *Fallback) findAliveProxy(touch bool) C.Proxy {
proxies := f.GetProxies(touch) proxies := f.GetProxies(touch)
al := proxies[0] for _, proxy := range proxies {
for i := len(proxies) - 1; i > -1; i-- { if len(f.selected) == 0 {
proxy := proxies[i] if proxy.Alive() {
if proxy.Name() == f.selected && proxy.Alive() {
return proxy return proxy
} }
} else {
if proxy.Name() == f.selected {
if proxy.Alive() { if proxy.Alive() {
al = proxy return proxy
} else {
f.selected = ""
} }
} }
return al }
}
return proxies[0]
} }
func (f *Fallback) Set(name string) error { func (f *Fallback) Set(name string) error {

View file

@ -151,6 +151,7 @@ func (gb *GroupBase) onDialFailed() {
gb.failedTime = time.Now() gb.failedTime = time.Now()
} else { } else {
if time.Since(gb.failedTime) > gb.failedTimeoutInterval() { if time.Since(gb.failedTime) > gb.failedTimeoutInterval() {
gb.failedTimes = 0
return return
} }