[ https://issues.apache.org/jira/browse/HBASE-13888?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Guanghao Zhang updated HBASE-13888: ----------------------------------- Description: As I report the RateLimiter fail to limit in HBASE-13686, then [~ashish singhi] fix that problem by support two kinds of RateLimiter: AverageIntervalRateLimiter and FixedIntervalRateLimiter. But in my use of the code, I found a new bug about refill() in AverageIntervalRateLimiter. {code} long delta = (limit * (now - nextRefillTime)) / super.getTimeUnitInMillis(); if (delta > 0) { this.nextRefillTime = now; return Math.min(limit, available + delta); } {code} When delta > 0, refill maybe return available + delta. Then in the canExecute(), avail will add refillAmount again. So the new avail maybe 2 * avail + delta. {code} long refillAmount = refill(limit, avail); if (refillAmount == 0 && avail < amount) { return false; } // check for positive overflow if (avail <= Long.MAX_VALUE - refillAmount) { avail = Math.max(0, Math.min(avail + refillAmount, limit)); } else { avail = Math.max(0, limit); } {code} I will add more unit tests for RateLimiter in the next days. Review Board: https://reviews.apache.org/r/35384/ was: As I report the RateLimiter fail to limit in HBASE-13686, then [~ashish singhi] fix that problem by support two kinds of RateLimiter: AverageIntervalRateLimiter and FixedIntervalRateLimiter. But in my use of the code, I found a new bug about refill() in AverageIntervalRateLimiter. {code} long delta = (limit * (now - nextRefillTime)) / super.getTimeUnitInMillis(); if (delta > 0) { this.nextRefillTime = now; return Math.min(limit, available + delta); } {code} When delta > 0, refill maybe return available + delta. Then in the canExecute(), avail will add refillAmount again. So the new avail maybe 2 * avail + delta. {code} long refillAmount = refill(limit, avail); if (refillAmount == 0 && avail < amount) { return false; } // check for positive overflow if (avail <= Long.MAX_VALUE - refillAmount) { avail = Math.max(0, Math.min(avail + refillAmount, limit)); } else { avail = Math.max(0, limit); } {code} I will add more unit tests for RateLimiter in the next days. > refill bug from HBASE-13686 > --------------------------- > > Key: HBASE-13888 > URL: https://issues.apache.org/jira/browse/HBASE-13888 > Project: HBase > Issue Type: Bug > Affects Versions: 2.0.0 > Reporter: Guanghao Zhang > Assignee: Guanghao Zhang > Attachments: HBASE-13888-v1.patch, HBASE-13888-v2.patch > > > As I report the RateLimiter fail to limit in HBASE-13686, then [~ashish > singhi] fix that problem by support two kinds of RateLimiter: > AverageIntervalRateLimiter and FixedIntervalRateLimiter. But in my use of the > code, I found a new bug about refill() in AverageIntervalRateLimiter. > {code} > long delta = (limit * (now - nextRefillTime)) / > super.getTimeUnitInMillis(); > if (delta > 0) { > this.nextRefillTime = now; > return Math.min(limit, available + delta); > } > {code} > When delta > 0, refill maybe return available + delta. Then in the > canExecute(), avail will add refillAmount again. So the new avail maybe 2 * > avail + delta. > {code} > long refillAmount = refill(limit, avail); > if (refillAmount == 0 && avail < amount) { > return false; > } > // check for positive overflow > if (avail <= Long.MAX_VALUE - refillAmount) { > avail = Math.max(0, Math.min(avail + refillAmount, limit)); > } else { > avail = Math.max(0, limit); > } > {code} > I will add more unit tests for RateLimiter in the next days. > Review Board: https://reviews.apache.org/r/35384/ -- This message was sent by Atlassian JIRA (v6.3.4#6332)