DynamicSentinelProperty类中updateValue方法中使用的isEqual判断会造成规则无效更新吧

jexiocij  于 2022-11-19  发布在  其他
关注(0)|答案(2)|浏览(108)

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

Anything else we need to know?

htzpubme

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

wz8daaqr

wz8daaqr2#

com.alibaba.csp.sentinel.property.DynamicSentinelProperty#isEqual 这里描述是通用的逻辑,具体自定义的实现比如怎么判断两个list是否相等需要自己重写里面的eqaul方法

相关问题