From b9d8b69889052a9d20bf861c81651bfb7577b016 Mon Sep 17 00:00:00 2001 From: wwqgtxx Date: Sun, 30 Oct 2022 23:08:18 +0800 Subject: [PATCH] fix: lazy check --- adapter/outbound/base.go | 2 +- adapter/outboundgroup/fallback.go | 4 ++-- adapter/outboundgroup/loadbalance.go | 8 ++++---- adapter/outboundgroup/relay.go | 4 ++-- adapter/outboundgroup/selector.go | 4 ++-- adapter/outboundgroup/urltest.go | 4 ++-- adapter/provider/healthcheck.go | 17 ++++++++++++----- adapter/provider/provider.go | 2 +- constant/adapters.go | 2 +- tunnel/tunnel.go | 11 +++++++++-- 10 files changed, 36 insertions(+), 22 deletions(-) diff --git a/adapter/outbound/base.go b/adapter/outbound/base.go index 1112732e76..145a3f97ff 100644 --- a/adapter/outbound/base.go +++ b/adapter/outbound/base.go @@ -90,7 +90,7 @@ func (b *Base) Addr() string { } // Unwrap implements C.ProxyAdapter -func (b *Base) Unwrap(metadata *C.Metadata) C.Proxy { +func (b *Base) Unwrap(metadata *C.Metadata, touch bool) C.Proxy { return nil } diff --git a/adapter/outboundgroup/fallback.go b/adapter/outboundgroup/fallback.go index ea9e13aee9..a433d54da9 100644 --- a/adapter/outboundgroup/fallback.go +++ b/adapter/outboundgroup/fallback.go @@ -72,8 +72,8 @@ func (f *Fallback) MarshalJSON() ([]byte, error) { } // Unwrap implements C.ProxyAdapter -func (f *Fallback) Unwrap(metadata *C.Metadata) C.Proxy { - proxy := f.findAliveProxy(true) +func (f *Fallback) Unwrap(metadata *C.Metadata, touch bool) C.Proxy { + proxy := f.findAliveProxy(touch) return proxy } diff --git a/adapter/outboundgroup/loadbalance.go b/adapter/outboundgroup/loadbalance.go index 83af1e4f23..87d7de7b71 100644 --- a/adapter/outboundgroup/loadbalance.go +++ b/adapter/outboundgroup/loadbalance.go @@ -82,7 +82,7 @@ func jumpHash(key uint64, buckets int32) int32 { // DialContext implements C.ProxyAdapter func (lb *LoadBalance) DialContext(ctx context.Context, metadata *C.Metadata, opts ...dialer.Option) (c C.Conn, err error) { - proxy := lb.Unwrap(metadata) + proxy := lb.Unwrap(metadata, true) defer func() { if err == nil { @@ -105,7 +105,7 @@ func (lb *LoadBalance) ListenPacketContext(ctx context.Context, metadata *C.Meta } }() - proxy := lb.Unwrap(metadata) + proxy := lb.Unwrap(metadata, true) return proxy.ListenPacketContext(ctx, metadata, lb.Base.DialOptions(opts...)...) } @@ -190,8 +190,8 @@ func strategyStickySessions() strategyFn { } // Unwrap implements C.ProxyAdapter -func (lb *LoadBalance) Unwrap(metadata *C.Metadata) C.Proxy { - proxies := lb.GetProxies(true) +func (lb *LoadBalance) Unwrap(metadata *C.Metadata, touch bool) C.Proxy { + proxies := lb.GetProxies(touch) return lb.strategyFn(proxies, metadata) } diff --git a/adapter/outboundgroup/relay.go b/adapter/outboundgroup/relay.go index 79403eaf34..729f413788 100644 --- a/adapter/outboundgroup/relay.go +++ b/adapter/outboundgroup/relay.go @@ -153,11 +153,11 @@ func (r *Relay) proxies(metadata *C.Metadata, touch bool) ([]C.Proxy, []C.Proxy) for n, proxy := range rawProxies { proxies = append(proxies, proxy) chainProxies = append(chainProxies, proxy) - subproxy := proxy.Unwrap(metadata) + subproxy := proxy.Unwrap(metadata, touch) for subproxy != nil { chainProxies = append(chainProxies, subproxy) proxies[n] = subproxy - subproxy = subproxy.Unwrap(metadata) + subproxy = subproxy.Unwrap(metadata, touch) } } diff --git a/adapter/outboundgroup/selector.go b/adapter/outboundgroup/selector.go index dd36eeb736..dcf0770731 100644 --- a/adapter/outboundgroup/selector.go +++ b/adapter/outboundgroup/selector.go @@ -74,8 +74,8 @@ func (s *Selector) Set(name string) error { } // Unwrap implements C.ProxyAdapter -func (s *Selector) Unwrap(*C.Metadata) C.Proxy { - return s.selectedProxy(true) +func (s *Selector) Unwrap(metadata *C.Metadata, touch bool) C.Proxy { + return s.selectedProxy(touch) } func (s *Selector) selectedProxy(touch bool) C.Proxy { diff --git a/adapter/outboundgroup/urltest.go b/adapter/outboundgroup/urltest.go index c4c5e21921..2d0f560f0b 100644 --- a/adapter/outboundgroup/urltest.go +++ b/adapter/outboundgroup/urltest.go @@ -56,8 +56,8 @@ func (u *URLTest) ListenPacketContext(ctx context.Context, metadata *C.Metadata, } // Unwrap implements C.ProxyAdapter -func (u *URLTest) Unwrap(*C.Metadata) C.Proxy { - return u.fast(true) +func (u *URLTest) Unwrap(metadata *C.Metadata, touch bool) C.Proxy { + return u.fast(touch) } func (u *URLTest) fast(touch bool) C.Proxy { diff --git a/adapter/provider/healthcheck.go b/adapter/provider/healthcheck.go index 8e736f6c4e..bf8bcc6a9e 100644 --- a/adapter/provider/healthcheck.go +++ b/adapter/provider/healthcheck.go @@ -35,16 +35,13 @@ func (hc *HealthCheck) process() { go func() { time.Sleep(30 * time.Second) - hc.check() + hc.lazyCheck() }() for { select { case <-ticker.C: - now := time.Now().Unix() - if !hc.lazy || now-hc.lastTouch.Load() < int64(hc.interval) { - hc.check() - } + hc.lazyCheck() case <-hc.done: ticker.Stop() return @@ -52,6 +49,16 @@ func (hc *HealthCheck) process() { } } +func (hc *HealthCheck) lazyCheck() bool { + now := time.Now().Unix() + if !hc.lazy || now-hc.lastTouch.Load() < int64(hc.interval) { + hc.check() + return true + } else { + return false + } +} + func (hc *HealthCheck) setProxy(proxies []C.Proxy) { hc.proxies = proxies } diff --git a/adapter/provider/provider.go b/adapter/provider/provider.go index 96870a4dc5..ebacf29134 100644 --- a/adapter/provider/provider.go +++ b/adapter/provider/provider.go @@ -93,7 +93,7 @@ func (pp *proxySetProvider) setProxies(proxies []C.Proxy) { pp.proxies = proxies pp.healthCheck.setProxy(proxies) if pp.healthCheck.auto() { - defer func() { go pp.healthCheck.check() }() + defer func() { go pp.healthCheck.lazyCheck() }() } } diff --git a/constant/adapters.go b/constant/adapters.go index f1603fd1e6..6333e8e0f3 100644 --- a/constant/adapters.go +++ b/constant/adapters.go @@ -106,7 +106,7 @@ type ProxyAdapter interface { ListenPacketOnStreamConn(c net.Conn, metadata *Metadata) (PacketConn, error) // Unwrap extracts the proxy from a proxy-group. It returns nil when nothing to extract. - Unwrap(metadata *Metadata) Proxy + Unwrap(metadata *Metadata, touch bool) Proxy } type Group interface { diff --git a/tunnel/tunnel.go b/tunnel/tunnel.go index 5473b2c6e5..ddf771b963 100644 --- a/tunnel/tunnel.go +++ b/tunnel/tunnel.go @@ -425,8 +425,15 @@ func match(metadata *C.Metadata) (C.Proxy, C.Rule, error) { continue } - // only unwrap one group, multi-layer nesting will be invalid - if adapter.Type() == C.Pass || (adapter.Unwrap(metadata) != nil && adapter.Unwrap(metadata).Type() == C.Pass) { + // parse multi-layer nesting + passed := false + for adapter := adapter; adapter != nil; adapter = adapter.Unwrap(metadata, false) { + if adapter.Type() == C.Pass { + passed = true + break + } + } + if passed { log.Debugln("%s match Pass rule", adapter.Name()) continue }