From 605141cba33beccf71100fdea03c8e9608d4852f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E9=A9=AC=E9=AA=9D?= Date: Mon, 14 Feb 2022 15:43:18 +0800 Subject: [PATCH] fix(traffic-split): failed to match rule when the first rule failed (#6292) Co-authored-by: tangzhenhuang --- apisix/plugins/traffic-split.lua | 1 + t/plugin/traffic-split5.t | 106 +++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+) diff --git a/apisix/plugins/traffic-split.lua b/apisix/plugins/traffic-split.lua index 028cc97f..9ba0997f 100644 --- a/apisix/plugins/traffic-split.lua +++ b/apisix/plugins/traffic-split.lua @@ -238,6 +238,7 @@ function _M.access(conf, ctx) for _, rule in ipairs(conf.rules) do if not rule.match then + match_passed = true weighted_upstreams = rule.weighted_upstreams break end diff --git a/t/plugin/traffic-split5.t b/t/plugin/traffic-split5.t index 9e01ac8f..aee660ba 100644 --- a/t/plugin/traffic-split5.t +++ b/t/plugin/traffic-split5.t @@ -311,3 +311,109 @@ passed } --- response_body 1970, 1970, 1971, 1972, 1972, 1973 + + + +=== TEST 5: set upstream(multiple rules, the first rule has the match attribute and the second rule does not) and add route +--- config + location /t { + content_by_lua_block { + local json = require("toolkit.json") + local t = require("lib.test_admin").test + local data = { + uri = "/hello", + plugins = { + ["traffic-split"] = { + rules = { + { + match = { { + vars = { { "arg_id", "==", "1" } } + } }, + weighted_upstreams = { + { + upstream = { + name = "upstream_A", + type = "roundrobin", + nodes = { + ["127.0.0.1:1970"] = 1 + } + }, + weight = 1 + } + } + }, + { + weighted_upstreams = { + { + upstream = { + name = "upstream_B", + type = "roundrobin", + nodes = { + ["127.0.0.1:1971"] = 1 + } + }, + weight = 1 + }, + { + weight = 1 + } + } + } + } + } + }, + upstream = { + type = "roundrobin", + nodes = { + ["127.0.0.1:1972"] = 1 + } + } + } + local code, body = t('/apisix/admin/routes/1', + ngx.HTTP_PUT, + json.encode(data) + ) + if code >= 300 then + ngx.status = code + end + ngx.say(body) + } + } +--- request +GET /t +--- response_body +passed +--- no_error_log +[error] + + + +=== TEST 6: first rule match failed and the second rule match success +--- config + location /t { + content_by_lua_block { + local http = require "resty.http" + local httpc = http.new() + + local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/hello?id=1" + local ports = {} + local res, err + for i = 1, 2 do + res, err = httpc:request_uri(uri) + local port = tonumber(res.body) + ports[i] = port + end + + local uri = "http://127.0.0.1:" .. ngx.var.server_port .. "/hello?id=2" + for i = 3, 4 do + res, err = httpc:request_uri(uri) + local port = tonumber(res.body) + ports[i] = port + end + table.sort(ports) + + ngx.say(table.concat(ports, ", ")) + } + } +--- response_body +1970, 1970, 1971, 1972