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
This commit is contained in:
jebbs 2022-10-12 14:26:41 +08:00
parent 1a2e43a2b6
commit a20ce25d39
2 changed files with 30 additions and 2 deletions

View File

@ -86,8 +86,10 @@ func (s *rttBasedBalancer) Networks() []string {
return []string{N.NetworkTCP, N.NetworkUDP} return []string{N.NetworkTCP, N.NetworkUDP}
case hasTCP: case hasTCP:
return []string{N.NetworkTCP} return []string{N.NetworkTCP}
default: case hasUDP:
return []string{N.NetworkUDP} return []string{N.NetworkUDP}
default:
return nil
} }
} }

View File

@ -53,7 +53,33 @@ func (s *Balancer) Network() []string {
if s.Balancer == nil { if s.Balancer == nil {
return []string{N.NetworkTCP, N.NetworkUDP} 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 // Now implements adapter.OutboundGroup