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 28f9adc8a9
commit 769d3f0480
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}
case hasTCP:
return []string{N.NetworkTCP}
default:
case hasUDP:
return []string{N.NetworkUDP}
default:
return nil
}
}

View File

@ -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