mirror of
https://github.com/caddyserver/caddy.git
synced 2025-01-28 04:45:56 +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
|
index := hash(s) % poolLen
|
||||||
for i := uint32(0); i < poolLen; i++ {
|
for i := uint32(0); i < poolLen; i++ {
|
||||||
index += i
|
upstream := pool[(index+i)%poolLen]
|
||||||
upstream := pool[index%poolLen]
|
|
||||||
if upstream.Available() {
|
if upstream.Available() {
|
||||||
return upstream
|
return upstream
|
||||||
}
|
}
|
||||||
|
|
|
@ -198,6 +198,35 @@ func TestIPHashPolicy(t *testing.T) {
|
||||||
if h != nil {
|
if h != nil {
|
||||||
t.Error("Expected ip hash policy host to be 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) {
|
func TestFirstPolicy(t *testing.T) {
|
||||||
|
|
Loading…
Reference in a new issue