From b19946f6af75a00bb1f3d094a903224541a70fcd Mon Sep 17 00:00:00 2001 From: Francis Lavoie Date: Fri, 5 May 2023 22:53:48 -0400 Subject: [PATCH] reverseproxy: Optimize base case for least_conn and random_choose policies (#5487) When only a single request has the least amount of requests, there's no need to compute a random number, because the modulo of 1 will always be 0 anyways. --- modules/caddyhttp/reverseproxy/selectionpolicies.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/caddyhttp/reverseproxy/selectionpolicies.go b/modules/caddyhttp/reverseproxy/selectionpolicies.go index a2985f19..35fb143a 100644 --- a/modules/caddyhttp/reverseproxy/selectionpolicies.go +++ b/modules/caddyhttp/reverseproxy/selectionpolicies.go @@ -187,7 +187,7 @@ func (LeastConnSelection) Select(pool UpstreamPool, _ *http.Request, _ http.Resp // sample: https://en.wikipedia.org/wiki/Reservoir_sampling if numReqs == leastReqs { count++ - if (weakrand.Int() % count) == 0 { //nolint:gosec + if count > 1 || (weakrand.Int()%count) == 0 { //nolint:gosec bestHost = host } } @@ -707,6 +707,9 @@ func leastRequests(upstreams []*Upstream) *Upstream { if len(best) == 0 { return nil } + if len(best) == 1 { + return best[0] + } return best[weakrand.Intn(len(best))] //nolint:gosec }