reverseproxy: fix hash selection policy (#4137)

* caddyhttp: reverseproxy: fix hash selection policy

Fixes: #4135
Test: go test './...' -count=1

* caddyhttp: reverseproxy: add test to catch #4135

If you revert the last commit, the test will fail.
This commit is contained in:
Simão Gomes Viana 2021-04-29 18:52:22 +02:00 committed by GitHub
parent 3a1e81dbf6
commit 9017557169
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 30 additions and 2 deletions

View file

@ -523,8 +523,7 @@ func hostByHashing(pool []*Upstream, s string) *Upstream {
}
index := hash(s) % poolLen
for i := uint32(0); i < poolLen; i++ {
index += i
upstream := pool[index%poolLen]
upstream := pool[(index+i)%poolLen]
if upstream.Available() {
return upstream
}

View file

@ -198,6 +198,35 @@ func TestIPHashPolicy(t *testing.T) {
if h != nil {
t.Error("Expected ip hash policy host to be nil.")
}
// Reproduce #4135
pool = UpstreamPool{
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
{Host: new(upstreamHost)},
}
pool[0].SetHealthy(false)
pool[1].SetHealthy(false)
pool[2].SetHealthy(false)
pool[3].SetHealthy(false)
pool[4].SetHealthy(false)
pool[5].SetHealthy(false)
pool[6].SetHealthy(false)
pool[7].SetHealthy(false)
pool[8].SetHealthy(true)
// We should get a result back when there is one healthy host left.
h = ipHash.Select(pool, req, nil)
if h == nil {
// If it is nil, it means we missed a host even though one is available
t.Error("Expected ip hash policy host to not be nil, but it is nil.")
}
}
func TestFirstPolicy(t *testing.T) {