Issue Description
Type: bug report
Describe what happened (or what feature you want)
isEqual 比较时直接使用了AbstractList类中equals方法进行比较,这个方法要求集合中对应位置元素都相同才会判断为相同;实际使用时只要俩规则集合拥有相同的元素(元素在集合中位置不一定一一对应),即可认为这俩规则集是相等的。
这个bug在sentinel运行中会带来规则的无效(多余)更新。
Describe what you expected to happen
isEqual 方法判断时不应该要求规则集中每个相同元素在集合中位置一一对应。eg. A[a,b,c] 和 B[c,a.b] 是俩相同规则集。
How to reproduce it (as minimally and precisely as possible)
Tell us your environment
sentinel1.8 jdk1.8
2条答案
按热度按时间htzpubme1#
很细心👍
确实是通过
DynamicSentinelProperty<T>
泛型里的T#equals
比较的,T是List<XxxRule>
即用到了AbstractList#equals
这样A[a,b,c] 和 B[c,a,b]比较会不相等。
推测是否是出于性能和语义的考虑?因为如果规则列表里元素的顺序变了,可否认为它发生过修改的变动,比如删除了又新增;
还有一种情况是,因为List是可以重复的,如果有C[a,b,b,c]这样的,它是否和A[a,b,c]相等?
如果在控制台或者配置中心维护规则时能保证元素顺序性,那么能避免这个问题。
只是一些猜想供参考哈,这样无效更新有可能是个问题,也想知道答案。@sczyh30@jasonjoo2010
wz8daaqr2#
com.alibaba.csp.sentinel.property.DynamicSentinelProperty#isEqual
这里描述是通用的逻辑,具体自定义的实现比如怎么判断两个list是否相等需要自己重写里面的eqaul方法