From 41c925f390e4b572ea633e5f39cd6fee81a3a2bf Mon Sep 17 00:00:00 2001 From: Elvin Efendi Date: Tue, 13 Nov 2018 15:44:57 +0400 Subject: [PATCH 1/2] bugfix: set canary attributes when initializing balancer --- rootfs/etc/nginx/lua/balancer/chash.lua | 2 ++ rootfs/etc/nginx/lua/balancer/ewma.lua | 2 ++ rootfs/etc/nginx/lua/balancer/round_robin.lua | 2 ++ rootfs/etc/nginx/lua/balancer/sticky.lua | 2 ++ 4 files changed, 8 insertions(+) diff --git a/rootfs/etc/nginx/lua/balancer/chash.lua b/rootfs/etc/nginx/lua/balancer/chash.lua index d9108a8b3..ffd9f54e0 100644 --- a/rootfs/etc/nginx/lua/balancer/chash.lua +++ b/rootfs/etc/nginx/lua/balancer/chash.lua @@ -9,6 +9,8 @@ function _M.new(self, backend) local o = { instance = self.factory:new(nodes), hash_by = backend["upstream-hash-by"], + traffic_shaping_policy = backend.trafficShapingPolicy, + alternative_backends = backend.alternativeBackends, } setmetatable(o, self) self.__index = self diff --git a/rootfs/etc/nginx/lua/balancer/ewma.lua b/rootfs/etc/nginx/lua/balancer/ewma.lua index 8e4512000..0ab4e6544 100644 --- a/rootfs/etc/nginx/lua/balancer/ewma.lua +++ b/rootfs/etc/nginx/lua/balancer/ewma.lua @@ -120,6 +120,8 @@ end function _M.new(self, backend) local o = { peers = backend.endpoints, + traffic_shaping_policy = backend.trafficShapingPolicy, + alternative_backends = backend.alternativeBackends, } setmetatable(o, self) self.__index = self diff --git a/rootfs/etc/nginx/lua/balancer/round_robin.lua b/rootfs/etc/nginx/lua/balancer/round_robin.lua index db6c8e7dd..46641363e 100644 --- a/rootfs/etc/nginx/lua/balancer/round_robin.lua +++ b/rootfs/etc/nginx/lua/balancer/round_robin.lua @@ -8,6 +8,8 @@ function _M.new(self, backend) local nodes = util.get_nodes(backend.endpoints) local o = { instance = self.factory:new(nodes), + traffic_shaping_policy = backend.trafficShapingPolicy, + alternative_backends = backend.alternativeBackends, } setmetatable(o, self) self.__index = self diff --git a/rootfs/etc/nginx/lua/balancer/sticky.lua b/rootfs/etc/nginx/lua/balancer/sticky.lua index c61cef446..de9a557bc 100644 --- a/rootfs/etc/nginx/lua/balancer/sticky.lua +++ b/rootfs/etc/nginx/lua/balancer/sticky.lua @@ -18,6 +18,8 @@ function _M.new(self, backend) cookie_expires = backend["sessionAffinityConfig"]["cookieSessionAffinity"]["expires"], cookie_max_age = backend["sessionAffinityConfig"]["cookieSessionAffinity"]["maxage"], digest_func = digest_func, + traffic_shaping_policy = backend.trafficShapingPolicy, + alternative_backends = backend.alternativeBackends, } setmetatable(o, self) self.__index = self From 764740a09afb108200f82813be80aa8e394ace1b Mon Sep 17 00:00:00 2001 From: Elvin Efendi Date: Tue, 13 Nov 2018 16:03:26 +0400 Subject: [PATCH 2/2] be more defensive when deciding alternative balancer --- rootfs/etc/nginx/lua/balancer.lua | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/rootfs/etc/nginx/lua/balancer.lua b/rootfs/etc/nginx/lua/balancer.lua index 2d88f8f79..4fcf035ff 100644 --- a/rootfs/etc/nginx/lua/balancer.lua +++ b/rootfs/etc/nginx/lua/balancer.lua @@ -133,9 +133,25 @@ local function route_to_alternative_balancer(balancer) end -- TODO: support traffic shaping for n > 1 alternative backends - local alternative_balancer = balancers[balancer.alternative_backends[1]] + local backend_name = balancer.alternative_backends[1] + if not backend_name then + ngx.log(ngx.ERR, "empty alternative backend") + return false + end - local clean_target_header = util.replace_special_char(alternative_balancer.traffic_shaping_policy.header, "-", "_") + local alternative_balancer = balancers[backend_name] + if not alternative_balancer then + ngx.log(ngx.ERR, "no alternative balancer for backend: " .. tostring(backend_name)) + return false + end + + local traffic_shaping_policy = alternative_balancer.traffic_shaping_policy + if not traffic_shaping_policy then + ngx.log(ngx.ERR, "traffic shaping policy is not set for balanacer of backend: " .. tostring(backend_name)) + return false + end + + local clean_target_header = util.replace_special_char(traffic_shaping_policy.header, "-", "_") local header = ngx.var["http_" .. clean_target_header] if header then @@ -146,7 +162,7 @@ local function route_to_alternative_balancer(balancer) end end - local clean_target_cookie = util.replace_special_char(alternative_balancer.traffic_shaping_policy.cookie, "-", "_") + local clean_target_cookie = util.replace_special_char(traffic_shaping_policy.cookie, "-", "_") local cookie = ngx.var["cookie_" .. clean_target_cookie] if cookie then @@ -157,7 +173,7 @@ local function route_to_alternative_balancer(balancer) end end - if math.random(100) <= alternative_balancer.traffic_shaping_policy.weight then + if math.random(100) <= traffic_shaping_policy.weight then return true end