Skip to content

bug: traffic-split err #5607

@xianshun163

Description

@xianshun163

Issue description

the traffic-split make some error, as the error log show

------ some times, the weighted_upstreams value is differrent, if it is like the second, it will not make err

1、weighted_upstreams:[{"upstream_id":"382981255605519758","weight":2},{"upstream":"plugin#upstream#is#empty","weight":1}],
2、weighted_upstreams:[{"upstream_id":"382981255605519758","weight":2},{"weight":1}]

if it like the first, the follow code will make the error:
210 upstream_obj.upstream.vid = i
I have add some log to the source code, you will see it at the error log area

Environment

  • apisix version (cmd: apisix version): 2.10.1
  • OS (cmd: uname -a): CentOS Linux release 7.6.1810 (Core)
  • OpenResty / Nginx version (cmd: nginx -V or openresty -V):nginx version: openresty/1.19.9.1
  • etcd version, if have (cmd: run curl http://127.0.0.1:9090/v1/server_info to get the info from server-info API):"etcd_version":"3.4.0",
  • apisix-dashboard version, if have: 2.10.1
  • the plugin runner version, if the issue is about a plugin runner (cmd: depended on the kind of runner):
  • luarocks version, if the issue is about installation (cmd: luarocks --version):

Steps to reproduce

1、I create a rule like this: the upstream is a simple java app server
curl http://127.0.0.1:9080/apisix/admin/routes/xs-app-r1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
"uri": "/index",
"name": "蓝绿发布",
"host": "local.xsapp.org",
"plugins": {
"traffic-split": {
"rules": [
{
"match": [
{
"vars": [
["http_release","==","new_release"]
]
}
],
"weighted_upstreams": [
{
"upstream_id": "382981255605519758",
"weight": 2
},
{
"weight": 1
}
]
}
]
}
},
"upstream_id": "382981468860712334"
}'

2、I open a global plugin key-auth in the dashboard

3、I test it like this : curl http://127.0.0.1:9080/index -H 'release: new_release' -H 'Host: local.xsapp.org' -H "apikey: key-of-sam"

4、sometimes it work , some time it make a error, as the error log show。

5、And then I go to print some error log in the lua file, you can see it at the error log.

Actual result

as the error log show

Error log

2021/11/25 14:03:47 [warn] 24989#24989: *39085296 [lua] lrucache.lua:92: lrucache(): ----xs---begin to create_obj_fun---,key:table: 0x7f76788384f8, client: 127.0.0.1, server: _, request: "GET /index HTTP/1.1", host: "local.xsapp.org"
2021/11/25 14:03:47 [error] 24989#24989: *39085296 [lua] traffic-split.lua:202: create_obj_fun(): ---xs-- upstream_obj:{"upstream_id":"382981255605519758","weight":2}, client: 127.0.0.1, server: _, request: "GET /index HTTP/1.1", host: "local.xsapp.org"
2021/11/25 14:03:47 [error] 24989#24989: *39085296 [lua] traffic-split.lua:205: create_obj_fun(): -----xs--- upstream_id:382981255605519758, client: 127.0.0.1, server: _, request: "GET /index HTTP/1.1", host: "local.xsapp.org"
2021/11/25 14:03:47 [error] 24989#24989: *39085296 [lua] traffic-split.lua:202: create_obj_fun(): ---xs-- upstream_obj:{"upstream":"plugin#upstream#is#empty","weight":1}, client: 127.0.0.1, server: _, request: "GET /index HTTP/1.1", host: "local.xsapp.org"
2021/11/25 14:03:47 [error] 24989#24989: *39085296 [lua] traffic-split.lua:209: create_obj_fun(): ----xs--- upstream is not null:plugin#upstream#is#empty, client: 127.0.0.1, server: _, request: "GET /index HTTP/1.1", host: "local.xsapp.org"
2021/11/25 14:03:47 [error] 24989#24989: *39085296 lua entry thread aborted: runtime error: /data/apisix-2.10.1/apisix/plugins/traffic-split.lua:210: attempt to index field 'upstream' (a string value)
stack traceback:
coroutine 0:
/data/apisix-2.10.1/apisix/plugins/traffic-split.lua: in function 'create_obj_fun'
/data/apisix-2.10.1/apisix/core/lrucache.lua:93: in function 'lrucache'
/data/apisix-2.10.1/apisix/plugins/traffic-split.lua:268: in function 'phase_func'
/data/apisix-2.10.1/apisix/plugin.lua:683: in function 'run_plugin'
/data/apisix-2.10.1/apisix/init.lua:465: in function 'http_access_phase'
access_by_lua(nginx.conf:264):2: in main chunk, client: 127.0.0.1, server: _, request: "GET /index HTTP/1.1", host: "local.xsapp.org"

--------- this is my traffic-split.lua
198 local function new_rr_obj(weighted_upstreams)
199 local server_list = {}
200 -- core.log.error("---xs--upstream_obj:",core.json.delay_encode(weighted_upstreams,true))
201 for i, upstream_obj in ipairs(weighted_upstreams) do
202 core.log.error("---xs-- upstream_obj:",core.json.delay_encode(upstream_obj,true))
203
204 if upstream_obj.upstream_id then
205 core.log.error("-----xs--- upstream_id:",upstream_obj.upstream_id)
206 server_list[upstream_obj.upstream_id] = upstream_obj.weight
207 elseif upstream_obj.upstream then
208 -- Add a virtual id field to uniquely identify the upstream key.
209 core.log.error("----xs--- upstream is not null:",tostring(upstream_obj.upstream))
210 upstream_obj.upstream.vid = i
211 server_list[upstream_obj.upstream] = upstream_obj.weight
212 else
213 -- If the upstream object has only the weight value, it means
214 -- that the upstream weight value on the default route has been reached.
215 -- Mark empty upstream services in the plugin.
216 core.log.error("----xs--- all null")
217 upstream_obj.upstream = "plugin#upstream#is#empty"
218 server_list[upstream_obj.upstream] = upstream_obj.weight
219
220 end
221 end
222
223 return roundrobin:new(server_list)
224 end

------ some times, the weighted_upstreams value is differrent, if it is like the second, it will not make err
1、weighted_upstreams:[{"upstream_id":"382981255605519758","weight":2},{"upstream":"plugin#upstream#is#empty","weight":1}],
2、weighted_upstreams:[{"upstream_id":"382981255605519758","weight":2},{"weight":1}]
if it like the first, the follow code will make the error:
210 upstream_obj.upstream.vid = i

Expected result

do not make error

Metadata

Metadata

Assignees

No one assigned

    Labels

    checkingcheck first if this issue occurred

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions