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

Guanghao Zhang commented on HBASE-13686:
----------------------------------------

bq. we are going to have tons of those objects around if you starting 
configuring it by user.
I thinks this means there will be tons of RateLimiter. So we will have tons of 
RefillStrategy, too.
bq. Or may be what other thing I can think off is to have RateLimiter a 
abstract class and then have other two class AverageIntervalRateLimiter and 
FixdIntervalRateLimiter extending this class.
Good idea. Two name for you: FixedRateLimiter and BurstAllowedRateLimiter. When 
refill by fixed interval, this means the users' request rate must slow than the 
limit. But when refill by every average interval, sometimes the users' burst 
request rate wiil be allowed. The burst request rate which can be allowed is 
(avail + limit) per intervalInMillis. 

> 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