Details
-
Sub-task
-
Status: Resolved
-
Critical
-
Resolution: Fixed
-
None
-
Reviewed
Description
What happened
There is no value checking for parameter hbase.server.allocator.buffer.size. This may cause improper calculations and crashes the system like division by 0.
Buggy code
In ByteBuffAllocator.java, there is no value checking for poolBufSize and this variable is directly used to calculate the bufsForTwoMB. When poolBufSize is mistakenly set to 0, the code would cause division by 0 and throw ArithmeticException to crash the system.
public static ByteBuffAllocator create(Configuration conf, boolean reservoirEnabled) { int poolBufSize = conf.getInt(BUFFER_SIZE_KEY, DEFAULT_BUFFER_SIZE); if (reservoirEnabled) { . . . int bufsForTwoMB = (2 * 1024 * 1024) / poolBufSize; . . .
How to reproduce
- set hbase.server.allocator.buffer.size=0
run - org.apache.hadoop.hbase.io.hfile.bucket.TestBucketCacheRefCnt#testInBucketCache
- you should observe the following failure:
java.lang.ArithmeticException: / by zero at org.apache.hadoop.hbase.io.ByteBuffAllocator.create(ByteBuffAllocator.java:174) at org.apache.hadoop.hbase.io.hfile.bucket.TestBucketCacheRefCnt.testInBucketCache(TestBucketCacheRefCnt.java:224) . . .
For an easy reproduction, run the reproduce.sh in the attachment. We are happy to provide a patch if this issue is confirmed.
Attachments
Attachments
Issue Links
- links to