summaryrefslogtreecommitdiff
path: root/modules/caddyhttp/reverseproxy/selectionpolicies_test.go
diff options
context:
space:
mode:
authorMatt Holt <mholt@users.noreply.github.com>2022-04-27 10:39:22 -0600
committerGitHub <noreply@github.com>2022-04-27 10:39:22 -0600
commit40b193fb791e241dec630a37167aac576375bc96 (patch)
treebeca42bed9143a1f52a5a44e5a5dd512ab6bae1a /modules/caddyhttp/reverseproxy/selectionpolicies_test.go
parentd543ad1ffd81e12476378fd1bfe2e8afbf562506 (diff)
reverseproxy: Improve hashing LB policies with HRW (#4724)
* reverseproxy: Improve hashing LB policies with HRW Previously, if a list of upstreams changed, hash-based LB policies would be greatly affected because the hash relied on the position of upstreams in the pool. Highest Random Weight or "rendezvous" hashing is apparently robust to pool changes. It runs in O(n) instead of O(log n), but n is very small usually. * Fix bug and update tests
Diffstat (limited to 'modules/caddyhttp/reverseproxy/selectionpolicies_test.go')
-rw-r--r--modules/caddyhttp/reverseproxy/selectionpolicies_test.go58
1 files changed, 29 insertions, 29 deletions
diff --git a/modules/caddyhttp/reverseproxy/selectionpolicies_test.go b/modules/caddyhttp/reverseproxy/selectionpolicies_test.go
index 7175f77..aa001e4 100644
--- a/modules/caddyhttp/reverseproxy/selectionpolicies_test.go
+++ b/modules/caddyhttp/reverseproxy/selectionpolicies_test.go
@@ -22,9 +22,9 @@ import (
func testPool() UpstreamPool {
return UpstreamPool{
- {Host: new(Host)},
- {Host: new(Host)},
- {Host: new(Host)},
+ {Host: new(Host), Dial: "0.0.0.1"},
+ {Host: new(Host), Dial: "0.0.0.2"},
+ {Host: new(Host), Dial: "0.0.0.3"},
}
}
@@ -95,13 +95,13 @@ func TestIPHashPolicy(t *testing.T) {
// We should be able to predict where every request is routed.
req.RemoteAddr = "172.0.0.1:80"
h := ipHash.Select(pool, req, nil)
- if h != pool[1] {
- t.Error("Expected ip hash policy host to be the second host.")
+ if h != pool[0] {
+ t.Error("Expected ip hash policy host to be the first host.")
}
req.RemoteAddr = "172.0.0.2:80"
h = ipHash.Select(pool, req, nil)
- if h != pool[1] {
- t.Error("Expected ip hash policy host to be the second host.")
+ if h != pool[0] {
+ t.Error("Expected ip hash policy host to be the first host.")
}
req.RemoteAddr = "172.0.0.3:80"
h = ipHash.Select(pool, req, nil)
@@ -117,13 +117,13 @@ func TestIPHashPolicy(t *testing.T) {
// we should get the same results without a port
req.RemoteAddr = "172.0.0.1"
h = ipHash.Select(pool, req, nil)
- if h != pool[1] {
- t.Error("Expected ip hash policy host to be the second host.")
+ if h != pool[0] {
+ t.Error("Expected ip hash policy host to be the first host.")
}
req.RemoteAddr = "172.0.0.2"
h = ipHash.Select(pool, req, nil)
- if h != pool[1] {
- t.Error("Expected ip hash policy host to be the second host.")
+ if h != pool[0] {
+ t.Error("Expected ip hash policy host to be the first host.")
}
req.RemoteAddr = "172.0.0.3"
h = ipHash.Select(pool, req, nil)
@@ -138,7 +138,7 @@ func TestIPHashPolicy(t *testing.T) {
// we should get a healthy host if the original host is unhealthy and a
// healthy host is available
- req.RemoteAddr = "172.0.0.1"
+ req.RemoteAddr = "172.0.0.4"
pool[1].setHealthy(false)
h = ipHash.Select(pool, req, nil)
if h != pool[2] {
@@ -147,16 +147,16 @@ func TestIPHashPolicy(t *testing.T) {
req.RemoteAddr = "172.0.0.2"
h = ipHash.Select(pool, req, nil)
- if h != pool[2] {
- t.Error("Expected ip hash policy host to be the third host.")
+ if h != pool[0] {
+ t.Error("Expected ip hash policy host to be the first host.")
}
pool[1].setHealthy(true)
req.RemoteAddr = "172.0.0.3"
pool[2].setHealthy(false)
h = ipHash.Select(pool, req, nil)
- if h != pool[0] {
- t.Error("Expected ip hash policy host to be the first host.")
+ if h != pool[1] {
+ t.Error("Expected ip hash policy host to be the second host.")
}
req.RemoteAddr = "172.0.0.4"
h = ipHash.Select(pool, req, nil)
@@ -167,29 +167,29 @@ func TestIPHashPolicy(t *testing.T) {
// We should be able to resize the host pool and still be able to predict
// where a req will be routed with the same IP's used above
pool = UpstreamPool{
- {Host: new(Host)},
- {Host: new(Host)},
+ {Host: new(Host), Dial: "0.0.0.2"},
+ {Host: new(Host), Dial: "0.0.0.3"},
}
req.RemoteAddr = "172.0.0.1:80"
h = ipHash.Select(pool, req, nil)
- if h != pool[0] {
- t.Error("Expected ip hash policy host to be the first host.")
- }
- req.RemoteAddr = "172.0.0.2:80"
- h = ipHash.Select(pool, req, nil)
if h != pool[1] {
t.Error("Expected ip hash policy host to be the second host.")
}
- req.RemoteAddr = "172.0.0.3:80"
+ req.RemoteAddr = "172.0.0.2:80"
h = ipHash.Select(pool, req, nil)
if h != pool[0] {
t.Error("Expected ip hash policy host to be the first host.")
}
- req.RemoteAddr = "172.0.0.4:80"
+ req.RemoteAddr = "172.0.0.3:80"
h = ipHash.Select(pool, req, nil)
if h != pool[1] {
t.Error("Expected ip hash policy host to be the second host.")
}
+ req.RemoteAddr = "172.0.0.4:80"
+ h = ipHash.Select(pool, req, nil)
+ if h != pool[0] {
+ t.Error("Expected ip hash policy host to be the first host.")
+ }
// We should get nil when there are no healthy hosts
pool[0].setHealthy(false)
@@ -252,14 +252,14 @@ func TestURIHashPolicy(t *testing.T) {
request := httptest.NewRequest(http.MethodGet, "/test", nil)
h := uriPolicy.Select(pool, request, nil)
- if h != pool[0] {
- t.Error("Expected uri policy host to be the first host.")
+ if h != pool[2] {
+ t.Error("Expected uri policy host to be the third host.")
}
- pool[0].setHealthy(false)
+ pool[2].setHealthy(false)
h = uriPolicy.Select(pool, request, nil)
if h != pool[1] {
- t.Error("Expected uri policy host to be the first host.")
+ t.Error("Expected uri policy host to be the second host.")
}
request = httptest.NewRequest(http.MethodGet, "/test_2", nil)