[
https://issues.apache.org/jira/browse/HBASE-10205?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13853585#comment-13853585
]
chunhui shen commented on HBASE-10205:
--------------------------------------
[~arjenroodselaar]
As my understand to remove the synchronization from
BucketAllocator.allocateBlock() and BucketAllocator.freeBlock(), we should add
synchronization for BucketSizeInfo#allocateBlock and
BucketSizeInfo#findAndRemoveCompletelyFreeBucket, it may cause dead lock.
Another solution is catch the ConcurrentModificationException and take a retry
since it happens occasionally
> ConcurrentModificationException in BucketAllocator
> --------------------------------------------------
>
> Key: HBASE-10205
> URL: https://issues.apache.org/jira/browse/HBASE-10205
> Project: HBase
> Issue Type: Bug
> Components: regionserver
> Affects Versions: 0.89-fb
> Reporter: Arjen Roodselaar
> Assignee: Arjen Roodselaar
> Priority: Minor
> Fix For: 0.89-fb, 0.99.0
>
> Attachments: hbase-10205-trunk.patch
>
>
> The BucketCache WriterThread calls BucketCache.freeSpace() upon draining the
> RAM queue containing entries to be cached. freeSpace() in turn calls
> BucketSizeInfo.statistics() through BucketAllocator.getIndexStatistics(),
> which iterates over 'bucketList'. At the same time another WriterThread might
> call BucketAllocator.allocateBlock(), which may call
> BucketSizeInfo.allocateBlock(), add a bucket to 'bucketList' and consequently
> cause a ConcurrentModificationException. Calls to
> BucketAllocator.allocateBlock() are synchronized, but calls to
> BucketAllocator.getIndexStatistics() are not, which allows this race to occur.
--
This message was sent by Atlassian JIRA
(v6.1.4#6159)