[
https://issues.apache.org/jira/browse/HBASE-2663?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12892573#action_12892573
]
Todd Lipcon commented on HBASE-2663:
------------------------------------
Why not track the blocks through a linked list, drop the "accessTime" member,
and whenever it's accessed, move it to the front of the list? Then when we want
to evict, just scan from the end of the list?
At least we could avoid the complete shallow copy into a LinkedList at
LruBlockCache.java:422 - here we copy the entire PriorityQueue out into a
LinkedList when we call queue.get(), and then we only iterate the first couple
elements of the linked list. Instead, we could just pull elements off the
PrioritiyQueue directly, one by one, evicting until we've evicted enough.
> LRU cache makes needless datastructure copies during eviction
> -------------------------------------------------------------
>
> Key: HBASE-2663
> URL: https://issues.apache.org/jira/browse/HBASE-2663
> Project: HBase
> Issue Type: Improvement
> Components: regionserver
> Reporter: Todd Lipcon
>
> Was browsing the LRU eviction code and came upon some very inefficient code.
> When we do eviction, BlockBucket.free() calls queue.get() which first inserts
> everything from the PriorityQueue<Block> into a LinkedList, then copies that
> entire linked list into an array. We then iterate over usually just a small
> percentage of the array to free some blocks until we have freed the requested
> amount.
> We ought to be able to just pull items out of the PriorityQueue directly and
> avoid all the churn.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.