[ https://issues.apache.org/jira/browse/HBASE-14279?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15356521#comment-15356521 ]
Hiroshi Ikeda commented on HBASE-14279: --------------------------------------- I again re-checked and considered how ConcurrentIndex is used, and I realized that it is enough to just remove ConcurrentIndex at all and use ConcurrentSkipListSet<BlockCacheKey> for BucketCache.blocksByHFile with a lexicographic comparator. Instead of calling {{blocksByHFile.values(hfileName)}}, call {{blocksByHFile.subSet(new BlockCacheKey(hfileName, Long.MIN_VALUE), true, new BlockCacheKey(hfileName, Long.MAX_VALUE, true))}} without necessity of copying its return value. FYI, about hashCode, Doug Lea also committed the same logic of the old JDK's hashCode in his repository. We should be safe even if we accidentally write the almost same code for such a straight logic. > Race condition in ConcurrentIndex > --------------------------------- > > Key: HBASE-14279 > URL: https://issues.apache.org/jira/browse/HBASE-14279 > Project: HBase > Issue Type: Bug > Reporter: Hiroshi Ikeda > Assignee: Heng Chen > Priority: Minor > Attachments: HBASE-14279.patch, HBASE-14279_v2.patch, > HBASE-14279_v3.patch, HBASE-14279_v4.patch, HBASE-14279_v5.patch, > HBASE-14279_v5.patch, HBASE-14279_v6.patch, HBASE-14279_v7.1.patch, > HBASE-14279_v7.patch, LockStripedBag.java > > > {{ConcurrentIndex.put}} and {{remove}} are in race condition. It is possible > to remove a non-empty set, and to add a value to a removed set. Also > {{ConcurrentIndex.values}} is vague in sense that the returned set sometimes > trace the current state and sometimes doesn't. -- This message was sent by Atlassian JIRA (v6.3.4#6332)