Details
-
Improvement
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
2.4.11
-
None
Description
The rate calculator should avoid negative values, e.g. if a region is moved from RS1 to RS2, the request count loads in the balancer cache maybe [100,200,0,100,200], then the region load cost calculated by CostFromRegionLoadAsRateFunction#getRegionLoadCost will be (100-200+100+100)/4=25, while the real cost is (100+0+100+200)/4=100.
protected double getRegionLoadCost(Collection<BalancerRegionLoad> regionLoadList) { Iterator<BalancerRegionLoad> iter = regionLoadList.iterator(); if (!iter.hasNext()) { return 0; } double previous = getCostFromRl(iter.next()); if (!iter.hasNext()) { return 0; } double cost = 0; do { double current = getCostFromRl(iter.next()); cost += current - previous; previous = current; } while (iter.hasNext()); return Math.max(0, cost / (regionLoadList.size() - 1)); }
We should change the cost accumulate codes to,
cost += current >= previous ? current - previous : current;