GatewayRuleManager.loadRules()空指针

由于甲方领导要求,将spring版本升级至5.2.9及以上版本,目前升级至5.3.3
连带升级为:
springboot 2.3.0.RELEASE -> 2.4.2
springcloud 2.2.3.RELEASE -> 2020.0.3
springcloudAlibaba 2.2.1.RELEASE ->2021.1
sentinel 1.7.2 ->1.8.1
本次记录为:
项目升级spring-core并升级框架后,原始代码出现不兼容或Sentinel 出现的bug,导致使用

GatewayRuleManager.loadRules(rules)

对流控规则进行更新时,出现空指针的情况

GatewayRuleManager源码第217-244行:

    if (newRuleMap != null && !newRuleMap.isEmpty()) {
        var3 = GatewayRuleManager.CONVERTED_PARAM_RULE_MAP.entrySet().iterator();//218

        while(true) {
            while(var3.hasNext()) {//221
                Entry<String, List<ParamFlowRule>> entry = (Entry)var3.next();
                String resource = (String)entry.getKey();
                if (!newRuleMap.containsKey(resource)) {
                    ParameterMetricStorage.clearParamMetricForResource(resource);
                } else {
                    List<ParamFlowRule> newRuleList = (List)newRuleMap.get(resource);
                    List<ParamFlowRule> oldRuleList = new ArrayList((Collection)entry.getValue());
                    oldRuleList.removeAll(newRuleList);
                    Iterator var8 = oldRuleList.iterator();//230行

                    while(var8.hasNext()) {
                        ParamFlowRule rule = (ParamFlowRule)var8.next();
                        ParameterMetricStorage.getParamMetricForResource(resource).clearForRule(rule);
                    }
                }
            }

            GatewayRuleManager.CONVERTED_PARAM_RULE_MAP.clear();//239
            GatewayRuleManager.CONVERTED_PARAM_RULE_MAP.putAll(newRuleMap);//240
            RecordLog.info("[GatewayRuleManager] Converted internal param rules: " + GatewayRuleManager.CONVERTED_PARAM_RULE_MAP, new Object[0]);
            return;
        }
    }

230行出现空指针.
由于时间关系,并未能对bug进行分析,初步判断为"更新框架后,可能某个框架重写了类的toString()导致某些识别出现了问题"
但GatewayRuleManager源码239.240行源码为:

GatewayRuleManager.CONVERTED_PARAM_RULE_MAP.clear();
GatewayRuleManager.CONVERTED_PARAM_RULE_MAP.putAll(newRuleMap);

GatewayRuleManager最终似乎会将RULE_MAP清空,并putAll新的规则.
因此本次项目中代码修改为:

GatewayRuleManager.loadRules(new HashSet()<>);
GatewayRuleManager.loadRules(rules);

在更新规则前,清空规则,以此跳过221行

while(var3.hasNext()) { 

的判断,直接进入239,240

本次修改并不保证功能完全正常,仅为修改记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值