hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Guanghao Zhang (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-13888) refill bug from HBASE-13686
Date Fri, 12 Jun 2015 13:09:01 GMT

    [ https://issues.apache.org/jira/browse/HBASE-13888?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14583363#comment-14583363
] 

Guanghao Zhang commented on HBASE-13888:
----------------------------------------

Yeah. I add some ut for RateLimiter in the v2 patch. It will test the refill() and canExecute()
of RateLimiter.  In the previous tests, it always have small limit, i.e. 10 per sec.  It was
hard to trigger "return Math.min(limit, available + delta);" return available+delta. So I
add some ut for refill and bigger limit like 100, 200, 500 in ut.

> 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)

Mime
View raw message