[ 
https://issues.apache.org/jira/browse/HBASE-29479?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Charles Connell updated HBASE-29479:
------------------------------------
    Description: 
When asked for a QuotaLimiter for a given user, the QuotaCache checks if that 
user's quota state is cached. If it is, it returns a QuotaLimiter based on the 
cached information. If not, it inserts default quota state into the cache, and 
returns a default QuotaLimiter. On the next run of the QuotaRefresherChore, it 
looks in the {{hbase:quota}} table for the quota settings for every user in the 
cache. The consequence of this is: from when the QuotaCache is first asked 
about a user, until the next run of QuotaRefresherChore, the QuotaLimiters for 
that user are wrong.

I think it's unacceptable for QuotaCache to return incorrect information. I can 
see from a code comment that it was implemented this was as a performance 
optimization, to avoid doing a Get on the quota table in the query handler 
path. However, the performance consequences of not enforcing quotas can be a 
lot worse that a few Gets.

In this ticket I'm adding logic to QuotaCache so it immediately fetches quota 
information for a user from the quota table any time that user is not in its 
cache.

  was:
When asked for a QuotaLimiter for a given user, the QuotaCache checks if that 
user's quota state is cached. If it is, it returns a QuotaLimiter based on the 
cached information. If not, it inserts default quota state into the cache, and 
returns a default QuotaLimiter. On the next run of the QuotaRefresherChore, it 
looks in the {{hbase:quota}} table for the quota settings for every user in the 
cache. The consequence of this is: from when the QuotaCache is first asked 
about a user, until the next run of QuotaRefresherChore, the QuotaLimiters for 
that user are wrong.

I think it's unacceptable for QuotaCache to return incorrect information. I can 
see from a code comment that it was implemented this was as a performance 
optimization, to avoid doing a Get on the quota table in the query handler 
path. However, the performance consequences of not enforcing quotas can be a 
lot worse that a few Gets.

In this ticket I'm adding logic to QuotaCache so it fetches quota information 
for a user from the quota table any time that user is not in its cache.


> QuotaCache is not correctly populated until runs of QuotaRefresherChore
> -----------------------------------------------------------------------
>
>                 Key: HBASE-29479
>                 URL: https://issues.apache.org/jira/browse/HBASE-29479
>             Project: HBase
>          Issue Type: Improvement
>            Reporter: Charles Connell
>            Assignee: Charles Connell
>            Priority: Minor
>              Labels: pull-request-available
>
> When asked for a QuotaLimiter for a given user, the QuotaCache checks if that 
> user's quota state is cached. If it is, it returns a QuotaLimiter based on 
> the cached information. If not, it inserts default quota state into the 
> cache, and returns a default QuotaLimiter. On the next run of the 
> QuotaRefresherChore, it looks in the {{hbase:quota}} table for the quota 
> settings for every user in the cache. The consequence of this is: from when 
> the QuotaCache is first asked about a user, until the next run of 
> QuotaRefresherChore, the QuotaLimiters for that user are wrong.
> I think it's unacceptable for QuotaCache to return incorrect information. I 
> can see from a code comment that it was implemented this was as a performance 
> optimization, to avoid doing a Get on the quota table in the query handler 
> path. However, the performance consequences of not enforcing quotas can be a 
> lot worse that a few Gets.
> In this ticket I'm adding logic to QuotaCache so it immediately fetches quota 
> information for a user from the quota table any time that user is not in its 
> cache.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to