From a20ce25d39df422f3825e6d04938d341ce94c9d8 Mon Sep 17 00:00:00 2001 From: jebbs Date: Wed, 12 Oct 2022 14:26:41 +0800 Subject: [PATCH] fix & improve efficiency of outbound.Balancer.Network() * call balancer.Balancer.Networks() only we needed * fix fallback networks not considered * fix balancer.Balancer.Networks() not return nil --- balancer/balancer.go | 4 +++- outbound/balancer.go | 28 +++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/balancer/balancer.go b/balancer/balancer.go index 1df7840b..3f96dc26 100644 --- a/balancer/balancer.go +++ b/balancer/balancer.go @@ -86,8 +86,10 @@ func (s *rttBasedBalancer) Networks() []string { return []string{N.NetworkTCP, N.NetworkUDP} case hasTCP: return []string{N.NetworkTCP} - default: + case hasUDP: return []string{N.NetworkUDP} + default: + return nil } } diff --git a/outbound/balancer.go b/outbound/balancer.go index b7931192..60b4b48a 100644 --- a/outbound/balancer.go +++ b/outbound/balancer.go @@ -53,7 +53,33 @@ func (s *Balancer) Network() []string { if s.Balancer == nil { return []string{N.NetworkTCP, N.NetworkUDP} } - return s.Balancer.Networks() + fallbackNetworks := s.fallback.Network() + fallbackTCP := common.Contains(fallbackNetworks, N.NetworkTCP) + fallbackUDP := common.Contains(fallbackNetworks, N.NetworkUDP) + if fallbackTCP && fallbackUDP { + // fallback supports all network, we don't need to ask s.Balancer, + // we know it can fallback to s.fallback for all networks even if + // no outbound is available + return fallbackNetworks + } + + // ask s.Balancer for available networks + networks := s.Balancer.Networks() + switch { + case fallbackTCP: + if !common.Contains(networks, N.NetworkUDP) { + return fallbackNetworks + } + return []string{N.NetworkTCP, N.NetworkUDP} + case fallbackUDP: + if !common.Contains(networks, N.NetworkTCP) { + return fallbackNetworks + } + return []string{N.NetworkTCP, N.NetworkUDP} + default: + // fallback supports no network, return the networks from s.Balancer + return networks + } } // Now implements adapter.OutboundGroup