mirror of
https://github.com/caddyserver/caddy.git
synced 2025-01-14 06:46:27 +03:00
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:
parent
3a1e81dbf6
commit
9017557169
2 changed files with 30 additions and 2 deletions
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue