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-13686) Fail to limit rate in RateLimiter
Date Wed, 20 May 2015 11:12:00 GMT

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

Guanghao Zhang commented on HBASE-13686:

Assume there is a RateLimiter which limit and avail is Long.MAX_VALUE. Then consume(1). The
avail will be Long.MAX_VALUE - 1. After a long time, canExecute(1) again.  This will refill
again. The delta will be much greater than 1. Then available + delta will be negative.
bq. Why you think so ? the new avail value will be calculated based on this refillAmount in
the canExecute which I thought is ok.
Yeah, your code is ok. But as the below code shows, if refill return the new avail, the code
in canExecute will be very simple to understand. Different refill strategy can refill the
avail by themselves. The canExecute() should not to handle the special case of refillStrategy.
    return refillStrategy.refill(limit, avail) >= amount;

> Fail to limit rate in RateLimiter
> ---------------------------------
>                 Key: HBASE-13686
>                 URL: https://issues.apache.org/jira/browse/HBASE-13686
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 2.0.0, 1.1.0
>            Reporter: Guanghao Zhang
>            Assignee: Ashish Singhi
>             Fix For: 2.0.0, 1.2.0, 1.1.1
>         Attachments: HBASE-13686.patch
> While using the patch in HBASE-11598 , I found that RateLimiter can't to limit the rate
> {code} 
>  /**
>    * given the time interval, are there enough available resources to allow execution?
>    * @param now the current timestamp
>    * @param lastTs the timestamp of the last update
>    * @param amount the number of required resources
>    * @return true if there are enough available resources, otherwise false
>    */
>   public synchronized boolean canExecute(final long now, final long lastTs, final long
amount) {
>     return avail >= amount ? true : refill(now, lastTs) >= amount;
>   }
> {code}
> When avail >= amount, avail can't be refill. But in the next time to call canExecute,
lastTs maybe update. So avail will waste some time to refill. Even we use smaller rate than
the limit, the canExecute will return false. 

This message was sent by Atlassian JIRA

View raw message