[ https://issues.apache.org/jira/browse/HBASE-28359?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Bryan Beaudreault resolved HBASE-28359. --------------------------------------- Fix Version/s: 2.6.0 3.0.0-beta-2 Resolution: Fixed Pushed to branch-2.6+. Thanks for the contribution [~rmdmattingly]! > 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 > Labels: pull-request-available > Fix For: 2.6.0, 3.0.0-beta-2 > > > 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)