[ 
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.
{code}
    return refillStrategy.refill(limit, avail) >= amount;
{code}

> 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 right.
> {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
(v6.3.4#6332)

Reply via email to