diff --git a/app/router/strategy_leastload.go b/app/router/strategy_leastload.go index a4278a354..9816a63a1 100644 --- a/app/router/strategy_leastload.go +++ b/app/router/strategy_leastload.go @@ -22,6 +22,15 @@ type LeastLoadStrategy struct { ctx context.Context } +func (l *LeastLoadStrategy) GetPrincipleTarget(strings []string) []string { + var ret []string + nodes := l.pickOutbounds(strings) + for _, v := range nodes { + ret = append(ret, v.Tag) + } + return ret +} + // NewLeastLoadStrategy creates a new LeastLoadStrategy with settings func NewLeastLoadStrategy(settings *StrategyLeastLoadConfig) *LeastLoadStrategy { return &LeastLoadStrategy{ @@ -56,8 +65,7 @@ func (l *LeastLoadStrategy) InjectContext(ctx context.Context) { } func (s *LeastLoadStrategy) PickOutbound(candidates []string) string { - qualified := s.getNodes(candidates, time.Duration(s.settings.MaxRTT)) - selects := s.selectLeastLoad(qualified) + selects := s.pickOutbounds(candidates) count := len(selects) if count == 0 { // goes to fallbackTag @@ -66,6 +74,12 @@ func (s *LeastLoadStrategy) PickOutbound(candidates []string) string { return selects[dice.Roll(count)].Tag } +func (s *LeastLoadStrategy) pickOutbounds(candidates []string) []*node { + qualified := s.getNodes(candidates, time.Duration(s.settings.MaxRTT)) + selects := s.selectLeastLoad(qualified) + return selects +} + // selectLeastLoad selects nodes according to Baselines and Expected Count. // // The strategy always improves network response speed, not matter which mode below is configured. diff --git a/app/router/strategy_leastping.go b/app/router/strategy_leastping.go index d9ba6b453..e48a1c8a9 100644 --- a/app/router/strategy_leastping.go +++ b/app/router/strategy_leastping.go @@ -17,6 +17,10 @@ type LeastPingStrategy struct { observatory extension.Observatory } +func (l *LeastPingStrategy) GetPrincipleTarget(strings []string) []string { + return []string{l.PickOutbound(strings)} +} + func (l *LeastPingStrategy) InjectContext(ctx context.Context) { l.ctx = ctx } diff --git a/app/router/strategy_random.go b/app/router/strategy_random.go index 24808a993..8a508ab2b 100644 --- a/app/router/strategy_random.go +++ b/app/router/strategy_random.go @@ -7,6 +7,10 @@ import ( // RandomStrategy represents a random balancing strategy type RandomStrategy struct{} +func (s *RandomStrategy) GetPrincipleTarget(strings []string) []string { + return strings +} + func (s *RandomStrategy) PickOutbound(candidates []string) string { count := len(candidates) if count == 0 {