Bryan Beaudreault created HBASE-28359: -----------------------------------------
Summary: Improve quota RateLimiter synchronization Key: HBASE-28359 URL: https://issues.apache.org/jira/browse/HBASE-28359 Project: HBase Issue Type: Improvement Reporter: Bryan Beaudreault 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)