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

Toshihiro Suzuki updated HBASE-25576:
-------------------------------------
    Description: 
I sometimes face the code where we use a byte array as a key of HashMap 
(ConcurrentHashMap) or an element of HashSet, which could cause very confusing 
bugs.

The following code is an example where we use a byte array as a key of HashMap:
https://github.com/apache/hbase/blob/326835e8372cc83092e0ec127650438ff153476a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/SequenceIdAccounting.java#L94

In Java, we can't use a byte array as a key of HashMap or an element of HashSet 
directly. One solution for it is to use TreeMap (ConcurrentSkipListMap) or 
TreeSet (ConcurrentSkipListSet) with Bytes.BYTES_COMPARATOR instead of HashMap 
and HashSet as follows:

{code}
Map<byte[], String> map1 = new TreeMap<>(Bytes.BYTES_COMPARATOR);
Map<byte[], String> map2 = new ConcurrentSkipListMap<>(Bytes.BYTES_COMPARATOR);

Set<byte[]> set1 = new TreeSet<>(Bytes.BYTES_COMPARATOR);
Set<byte[]> set2 = new ConcurrentSkipListSet<>(Bytes.BYTES_COMPARATOR);
{code}

We should fix the existing ones in this Jira.


  was:
I sometimes face the code using HashMap (ConcurrentHashMap) or HashSet when 
using byte[] as a key of Map or an element of Set in the HBase code, which 
could cause very confusing bugs.

We should use TreeMap (ConcurrentSkipListMap) or TreeSet 
(ConcurrentSkipListSet) with Bytes.BYTES_COMPARATOR when using byte[] as a key 
of Map or an element of Set as follows:
{code}
Map<byte[], String> map1 = new TreeMap<>(Bytes.BYTES_COMPARATOR);
Map<byte[], String> map2 = new ConcurrentSkipListMap<>(Bytes.BYTES_COMPARATOR);
Set<byte[]> set1 = new TreeSet<>(Bytes.BYTES_COMPARATOR);
Set<byte[]> set2 = new ConcurrentSkipListSet<>(Bytes.BYTES_COMPARATOR);
{code}

We should fix the existing ones in this Jira.


> Should not use a byte array as a key of HashMap or an element of HashSet
> ------------------------------------------------------------------------
>
>                 Key: HBASE-25576
>                 URL: https://issues.apache.org/jira/browse/HBASE-25576
>             Project: HBase
>          Issue Type: Bug
>            Reporter: Toshihiro Suzuki
>            Assignee: Swaroopa Kadam
>            Priority: Major
>              Labels: beginner
>
> I sometimes face the code where we use a byte array as a key of HashMap 
> (ConcurrentHashMap) or an element of HashSet, which could cause very 
> confusing bugs.
> The following code is an example where we use a byte array as a key of 
> HashMap:
> https://github.com/apache/hbase/blob/326835e8372cc83092e0ec127650438ff153476a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/wal/SequenceIdAccounting.java#L94
> In Java, we can't use a byte array as a key of HashMap or an element of 
> HashSet directly. One solution for it is to use TreeMap 
> (ConcurrentSkipListMap) or TreeSet (ConcurrentSkipListSet) with 
> Bytes.BYTES_COMPARATOR instead of HashMap and HashSet as follows:
> {code}
> Map<byte[], String> map1 = new TreeMap<>(Bytes.BYTES_COMPARATOR);
> Map<byte[], String> map2 = new 
> ConcurrentSkipListMap<>(Bytes.BYTES_COMPARATOR);
> Set<byte[]> set1 = new TreeSet<>(Bytes.BYTES_COMPARATOR);
> Set<byte[]> set2 = new ConcurrentSkipListSet<>(Bytes.BYTES_COMPARATOR);
> {code}
> We should fix the existing ones in this Jira.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to