[
https://issues.apache.org/jira/browse/HBASE-28359?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ray Mattingly reassigned HBASE-28359:
-------------------------------------
Assignee: Ray Mattingly
> Improve quota RateLimiter synchronization
> -----------------------------------------
>
> Key: HBASE-28359
> URL: https://issues.apache.org/jira/browse/HBASE-28359
> Project: HBase
> Issue Type: Improvement
> Reporter: Bryan Beaudreault
> Assignee: Ray Mattingly
> Priority: Major
>
> We've been experiencing RpcThrottlingException with 0ms waitInterval. This
> seems odd and wasteful, since the client side will immediately retry without
> backoff. I think the problem is related to the synchronization of RateLimiter.
> The TimeBasedLimiter checkQuota method does the following:
> {code:java}
> if (!reqSizeLimiter.canExecute(estimateWriteSize + estimateReadSize)) {
> RpcThrottlingException.throwRequestSizeExceeded(
> reqSizeLimiter.waitInterval(estimateWriteSize + estimateReadSize));
> } {code}
> Both canExecute and waitInterval are synchronized, but we're calling them
> independently. So it's possible under high concurrency for canExecute to
> return false, but then waitInterval returns 0 (would have been true)
> I think we should simplify the API to have a single synchronized call:
> {code:java}
> long waitInterval = reqSizeLimiter.tryAcquire(estimateWriteSize +
> estimateReadSize);
> if (waitInterval > 0) {
> RpcThrottlingException.throwRequestSizeExceeded(waitInterval);
> }{code}
--
This message was sent by Atlassian Jira
(v8.20.10#820010)