Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

bug:多级分流造成的 shdict key 名冲突 #114

Open
moocherabc opened this issue Oct 29, 2019 · 2 comments
Open

bug:多级分流造成的 shdict key 名冲突 #114

moocherabc opened this issue Oct 29, 2019 · 2 comments

Comments

@moocherabc
Copy link

bug:多级分流造成的 shdict key 名冲突

url如: http://api.xxx.com/prod/test/xxx-service/passService/payCallback

uri /prod/test/xxx-service/passService/payCallback

一级策略为: 第二段URL的值对应返回 后端upstream
转发规则: test == 》 up:test dev ==> up:dev

二级策略为: 第一段URL的值对应返回 后端upstream
转发规则: prod == 》 up: pord release ==>release

问题:
当 uri 为: /prod/prod/paytem-service/swiftpassService/payCallback
转发up为: prod 正常

在shat key 过期前访问
uri 为: /release/prod/paytem-service/swiftpassService/payCallback
转发up为: prod 不正常 正确应是 release

原因:

文件: diversion\diversion.lua +356

setUpstream 的时候 key用的是 策略匹配后得出来的值,这里得出来的是: 第一次key是 prod ,第二次key是 release(当前没有set的直接读到缓存))。对应的第一级分流的值为 -1,第二级分流的值为 prod和release(第二次)

文件:diversion\diversion.lua +248
文件:abtesting\utils\cache.lua +118

_M.getUpstream get key 的时候用的是策略匹配出来的值作为key, 第一次是 prod ,第二次应该是 release

因为匹配缓存中的Upstream使用的是for循环进行多级分流匹配,第一级分流(first)get 到了upstream(返回了prod) 第二级分流(second)没有匹配到upstream(release应该是nil)。
但匹配到 first级别的upstream 后就直接返回了,此时的upstream是错误的,正确的应该是 second级别的内容。

解决: 将 分级的 shdict key名进行区分

文件: diversion\diversion.lua
upstreamCache:setUpstream 处,将key名修改成不能使用 ”策略匹配后得出来的值“我这里使用的是:
334行local info下面添加:local shat_key = {idx,"-",info}
注释 upstreamCache:setUpstream(info, -1) 替换添加:upstreamCache:setUpstream(table.concat(shat_key), -1)
注释 upstreamCache:setUpstream(info, upstream) 替换添加:upstreamCache:setUpstream(table.concat(shat_key), upstream)

文件:abtesting\utils\cache.lua +118

113行 local info = usertable[idx] 下面添加: local shat_key = {idx,"-",info}
注释: local ups = cache:get(info) 替换添加: local ups = cache:get(table.concat(shat_key))

不知这样解决是否有问题,目前我还在自行测试 @BG2BKK

@Toifyx
Copy link

Toifyx commented Oct 29, 2019

看起来应该是有这个问题,只有在多级分流规则都一样的情况下。才会出现这个问题~为什么不考虑就用单个分流就行了吧。

@moocherabc
Copy link
Author

他们uri的切割不一样...所以我分出俩个策略来了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants