debug 调试日志 dns解析ip在变化
tail -f /usr/local/apisix/logs/error.log | grep "dns resolver domain: www.test.com to"
2021/08/30 10:45:36 [info] 18176#18176: *51148 [lua] resolver.lua:43: parse_domain(): dns resolver domain: www.test.com to 127.0.0.1, client: 192.168.33.133, server: _, request: "GET / HTTP/1.1", host: "192.168.33.133:9080"
2021/08/30 10:45:37 [info] 18176#18176: *51161 [lua] resolver.lua:43: parse_domain(): dns resolver domain: www.test.com to 192.168.33.101, client: 192.168.33.133, server: _, request: "GET / HTTP/1.1", host: "192.168.33.133:9080"
2021/08/30 10:45:37 [info] 18176#18176: *51174 [lua] resolver.lua:43: parse_domain(): dns resolver domain: www.test.com to 127.0.0.1, client: 192.168.33.133, server: _, request: "GET / HTTP/1.1", host: "192.168.33.133:9080"
2021/08/30 10:45:38 [info] 18176#18176: *51186 [lua] resolver.lua:43: parse_domain(): dns resolver domain: www.test.com to 192.168.33.101, client: 192.168.33.133, server: _, request: "GET / HTTP/1.1", host: "192.168.33.133:9080"
2021/08/30 10:45:38 [info] 18176#18176: *51200 [lua] resolver.lua:43: parse_domain(): dns resolver domain: www.test.com to 127.0.0.1, client: 192.168.33.133, server: _, request: "GET / HTTP/1.1", host: "192.168.33.133:9080"
2021/08/30 10:45:39 [info] 18176#18176: *51215 [lua] resolver.lua:43: parse_domain(): dns resolver domain: www.test.com to 192.168.33.101, client: 192.168.33.133, server: _, request: "GET / HTTP/1.1", host: "192.168.33.133:9080"
Issue description
apisix2.8 dns解析IP变化导致栈溢出复现过程
现象:
服务器500错误
错误日志堆栈 :
问题出现状况:
生产环境 cname 对应IP会不定时发生变化
复现过程:
apisix 上游服务目标节点配置假cname www.test.com
本机使用 dnsmasq 循环修改 www.test.com 对应的解析IP 127.0.0.1 / 192.168.33.101 (2个即可复现) 并持续访问
等待一段时间会出现即可复现堆栈、并且内存即将打满
相关代码:
parse_domain_in_route.lua
Environment
apisix version):2.8uname -a):nginx -Voropenresty -V):curl http://127.0.0.1:9090/v1/server_infoto get the info from server-info API):luarocks --version):Steps to reproduce
复现过程:
apisix 上游服务目标节点配置假cname www.test.com
本机使用 dnsmasq 循环修改 www.test.com 对应的解析IP 127.0.0.1 / 192.168.33.101 (2个即可复现) 并持续访问
等待一段时间会出现即可复现堆栈、并且内存即将打满
Actual result
apisix 500错误 table拷贝递归栈溢出
Error log
2021/08/30 09:52:15 [error] 10780#10780: *35662 lua entry thread aborted: runtime error: stack overflow
stack traceback:
coroutine 0:
[C]: in function 'nkeys'
/usr/local/apisix/apisix/core/table.lua:108: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
/usr/local/apisix/apisix/core/table.lua:111: in function '_deepcopy'
..., client: 192.168.33.133, server: _, request: "GET / HTTP/1.1", host: "192.168.33.133:9080"