From 6f7b66fc7d9f6238ca46c3dd21d4121f1e24cc1a Mon Sep 17 00:00:00 2001 From: Elvin Efendi Date: Fri, 26 Jul 2019 09:35:58 -0400 Subject: [PATCH 1/2] memoize balancer for a request --- rootfs/etc/nginx/lua/balancer.lua | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rootfs/etc/nginx/lua/balancer.lua b/rootfs/etc/nginx/lua/balancer.lua index e9fcb32bc8..4388d4e89a 100644 --- a/rootfs/etc/nginx/lua/balancer.lua +++ b/rootfs/etc/nginx/lua/balancer.lua @@ -190,6 +190,10 @@ local function route_to_alternative_balancer(balancer) end local function get_balancer() + if ngx.ctx.balancer then + return ngx.ctx.balancer + end + local backend_name = ngx.var.proxy_upstream_name local balancer = balancers[backend_name] @@ -201,8 +205,10 @@ local function get_balancer() local alternative_backend_name = balancer.alternative_backends[1] ngx.var.proxy_alternative_upstream_name = alternative_backend_name - return balancers[alternative_backend_name] + balancer = balancers[alternative_backend_name] end + + ngx.ctx.balancer = balancer return balancer end From 8f5fa78e1aa57daa5a0e4392fb37160c5da1e8e3 Mon Sep 17 00:00:00 2001 From: Elvin Efendi Date: Fri, 26 Jul 2019 10:18:31 -0400 Subject: [PATCH 2/2] regression test --- rootfs/etc/nginx/lua/balancer.lua | 3 +- rootfs/etc/nginx/lua/test/balancer_test.lua | 38 +++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/rootfs/etc/nginx/lua/balancer.lua b/rootfs/etc/nginx/lua/balancer.lua index 4388d4e89a..28312c3447 100644 --- a/rootfs/etc/nginx/lua/balancer.lua +++ b/rootfs/etc/nginx/lua/balancer.lua @@ -207,7 +207,7 @@ local function get_balancer() balancer = balancers[alternative_backend_name] end - + ngx.ctx.balancer = balancer return balancer @@ -266,6 +266,7 @@ if _TEST then _M.get_implementation = get_implementation _M.sync_backend = sync_backend _M.route_to_alternative_balancer = route_to_alternative_balancer + _M.get_balancer = get_balancer end return _M diff --git a/rootfs/etc/nginx/lua/test/balancer_test.lua b/rootfs/etc/nginx/lua/test/balancer_test.lua index 379e6fcf64..0bd1cddcf2 100644 --- a/rootfs/etc/nginx/lua/test/balancer_test.lua +++ b/rootfs/etc/nginx/lua/test/balancer_test.lua @@ -86,6 +86,44 @@ describe("Balancer", function() end) end) + describe("get_balancer()", function() + it("always returns the same balancer for given request context", function() + local backend = { + name = "my-dummy-app-6", ["load-balance"] = "ewma", + alternativeBackends = { "my-dummy-canary-app-6" }, + endpoints = { { address = "10.184.7.40", port = "8080", maxFails = 0, failTimeout = 0 } }, + trafficShapingPolicy = { + weight = 0, + header = "", + headerValue = "", + cookie = "" + }, + } + local canary_backend = { + name = "my-dummy-canary-app-6", ["load-balance"] = "ewma", + alternativeBackends = { "my-dummy-canary-app-6" }, + endpoints = { { address = "11.184.7.40", port = "8080", maxFails = 0, failTimeout = 0 } }, + trafficShapingPolicy = { + weight = 5, + header = "", + headerValue = "", + cookie = "" + }, + } + + balancer.sync_backend(backend) + balancer.sync_backend(canary_backend) + + mock_ngx({ var = { proxy_upstream_name = backend.name } }) + + local expected = balancer.get_balancer() + + for i = 1,50,1 do + assert.are.same(expected, balancer.get_balancer()) + end + end) + end) + describe("route_to_alternative_balancer()", function() local backend, _balancer