[
https://issues.apache.org/jira/browse/HBASE-13888?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14584445#comment-14584445
]
Guanghao Zhang commented on HBASE-13888:
----------------------------------------
AverageIntervalRateLimiter and FixedIntervalRateLimiter have different refill
strategy, so the unit tests of them was different.
{code}
assertEquals(200, testCanExecuteByRate(limiter, 200, TimeUnit.SECONDS)); // for
AverageIntervalRateLimiter
assertEquals(100, testCanExecuteByRate(limiter, 200, TimeUnit.SECONDS)); // for
FixedIntervalRateLimiter
{code}
For FixedIntervalRateLimiter, set 60 limit per sec, it will only refill all
limit on 1 sec, 2 sec, and so on.
{code}
// after 0.5 sec, refill should return 0
limiter.setNextRefillTime(limiter.getNextRefillTime() - 500);
assertEquals(0, limiter.refill(limiter.getLimit(), limiter.getAvailable()));
{code}
But for AverageIntervalRateLimiter, set 60 limit per sec, it will refill 1
resource every 1/60 sec.
{code}
// after 0.5 sec, refill should return 30
limiter.setNextRefillTime(limiter.getNextRefillTime() - 500);
assertEquals(30, limiter.refill(limiter.getLimit(),
limiter.getAvailable()));
{code}
> 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)