HBase
  1. HBase
  2. HBASE-3158

Bloom File Writes Broken if keySize is large

    Details

    • Type: Bug Bug
    • Status: Resolved
    • Priority: Blocker Blocker
    • Resolution: Fixed
    • Affects Version/s: 0.90.0
    • Fix Version/s: 0.90.0
    • Component/s: None
    • Labels:
      None
    • Hadoop Flags:
      Reviewed

      Description

      Yesterday, on our cluster, a region compact() kept crashing at giving this stack trace

      2010-10-25 08:48:28,330 ERROR org.apache.hadoop.hbase.regionserver.CompactSplitThread: Compaction failed for region MailBox_dark_launch_2010_10-04,4b64b600,1286302852538.9183a3b91ebd289bab7724d028cffa69.
      java.lang.IllegalArgumentException: maxValue must be > 0
      at org.apache.hadoop.hbase.util.ByteBloomFilter.sanityCheck(ByteBloomFilter.java:170)
      at org.apache.hadoop.hbase.util.ByteBloomFilter.<init>(ByteBloomFilter.java:156)
      at org.apache.hadoop.hbase.regionserver.StoreFile$Writer.<init>(StoreFile.java:707)
      at org.apache.hadoop.hbase.regionserver.StoreFile.createWriter(StoreFile.java:566)
      at org.apache.hadoop.hbase.regionserver.Store.createWriterInTmp(Store.java:504)
      at org.apache.hadoop.hbase.regionserver.Store.compact(Store.java:817)
      at org.apache.hadoop.hbase.regionserver.Store.compact(Store.java:678)
      at org.apache.hadoop.hbase.regionserver.HRegion.compactStores(HRegion.java:842)
      at org.apache.hadoop.hbase.regionserver.HRegion.compactStores(HRegion.java:793)
      at org.apache.hadoop.hbase.regionserver.CompactSplitThread.run(CompactSplitThread.java:103)

      The problem is that we are oveflowing "int" for "bitSize". The number of keys is about 272M, and we are using about 11 bit per key. So, bitSize ends up being > 2G..

      1. HBASE-3158.patch
        12 kB
        Nicolas Spiegelberg

        Activity

        Hide
        Nicolas Spiegelberg added a comment -

        Two fixes to make:

        1) Catch IllegalArgumentExceptions thrown by the BloomFilter and just continue writing the StoreFile without blooms instead of crashing
        2) ByteBloomFilter.<init>.bitSize should be a long and we should be able to handle large bloom sizes
        3) We cannot handle byteSize > MAX_INT because java doesn't allow you to allocate arrays that large. Throw an IAE in that case

        Show
        Nicolas Spiegelberg added a comment - Two fixes to make: 1) Catch IllegalArgumentExceptions thrown by the BloomFilter and just continue writing the StoreFile without blooms instead of crashing 2) ByteBloomFilter.<init>.bitSize should be a long and we should be able to handle large bloom sizes 3) We cannot handle byteSize > MAX_INT because java doesn't allow you to allocate arrays that large. Throw an IAE in that case
        Hide
        Nicolas Spiegelberg added a comment -

        Also, added "io.storefile.bloom.max.keys" to control the max keys allowed in any bloom

        Show
        Nicolas Spiegelberg added a comment - Also, added "io.storefile.bloom.max.keys" to control the max keys allowed in any bloom
        Hide
        stack added a comment -

        Thanks for the fix Nicolas (I like the BBQ exception).

        Show
        stack added a comment - Thanks for the fix Nicolas (I like the BBQ exception).
        Hide
        Nicolas Spiegelberg added a comment -

        lol. I was trying to debug an assert failure that I had during unit testing. You can obviously take that conditional out

        Show
        Nicolas Spiegelberg added a comment - lol. I was trying to debug an assert failure that I had during unit testing. You can obviously take that conditional out

          People

          • Assignee:
            Nicolas Spiegelberg
            Reporter:
            Nicolas Spiegelberg
          • Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

            Dates

            • Created:
              Updated:
              Resolved:

              Development