mirror of https://github.com/caddyserver/caddy.git
reverse_proxy: Fix random_choose selection policy (#3811)
This commit is contained in:
parent
670b723e38
commit
99b8f44486
|
@ -397,13 +397,18 @@ func leastRequests(upstreams []*Upstream) *Upstream {
|
|||
return nil
|
||||
}
|
||||
var best []*Upstream
|
||||
var bestReqs int
|
||||
var bestReqs int = -1
|
||||
for _, upstream := range upstreams {
|
||||
if upstream == nil {
|
||||
continue
|
||||
}
|
||||
reqs := upstream.NumRequests()
|
||||
if reqs == 0 {
|
||||
return upstream
|
||||
}
|
||||
if reqs <= bestReqs {
|
||||
// If bestReqs was just initialized to -1
|
||||
// we need to append upstream also
|
||||
if reqs <= bestReqs || bestReqs == -1 {
|
||||
bestReqs = reqs
|
||||
best = append(best, upstream)
|
||||
}
|
||||
|
|
|
@ -271,3 +271,54 @@ func TestURIHashPolicy(t *testing.T) {
|
|||
t.Error("Expected uri policy policy host to be nil.")
|
||||
}
|
||||
}
|
||||
|
||||
func TestLeastRequests(t *testing.T) {
|
||||
pool := testPool()
|
||||
pool[0].Dial = "localhost:8080"
|
||||
pool[1].Dial = "localhost:8081"
|
||||
pool[2].Dial = "localhost:8082"
|
||||
pool[0].SetHealthy(true)
|
||||
pool[1].SetHealthy(true)
|
||||
pool[2].SetHealthy(true)
|
||||
pool[0].CountRequest(10)
|
||||
pool[1].CountRequest(20)
|
||||
pool[2].CountRequest(30)
|
||||
|
||||
result := leastRequests(pool)
|
||||
|
||||
if result == nil {
|
||||
t.Error("Least request should not return nil")
|
||||
}
|
||||
|
||||
if result != pool[0] {
|
||||
t.Error("Least request should return pool[0]")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRandomChoicePolicy(t *testing.T) {
|
||||
pool := testPool()
|
||||
pool[0].Dial = "localhost:8080"
|
||||
pool[1].Dial = "localhost:8081"
|
||||
pool[2].Dial = "localhost:8082"
|
||||
pool[0].SetHealthy(false)
|
||||
pool[1].SetHealthy(true)
|
||||
pool[2].SetHealthy(true)
|
||||
pool[0].CountRequest(10)
|
||||
pool[1].CountRequest(20)
|
||||
pool[2].CountRequest(30)
|
||||
|
||||
request := httptest.NewRequest(http.MethodGet, "/test", nil)
|
||||
randomChoicePolicy := new(RandomChoiceSelection)
|
||||
randomChoicePolicy.Choose = 2
|
||||
|
||||
h := randomChoicePolicy.Select(pool, request)
|
||||
|
||||
if h == nil {
|
||||
t.Error("RandomChoicePolicy should not return nil")
|
||||
}
|
||||
|
||||
if h == pool[0] {
|
||||
t.Error("RandomChoicePolicy should not choose pool[0]")
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue