Uploaded image for project: 'HBase'
  1. HBase
  2. HBASE-25576

Should not use a byte array as a key of HashMap or an element of HashSet

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Open
    • Major
    • Resolution: Unresolved
    • None
    • None
    • None

    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:

      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);
      

      We should fix the existing ones in this Jira.

      Attachments

        Activity

          People

            Unassigned Unassigned
            brfrn169 Toshihiro Suzuki
            Votes:
            0 Vote for this issue
            Watchers:
            7 Start watching this issue

            Dates

              Created:
              Updated: