ConfX created HBASE-27989:
-----------------------------

             Summary: ByteBuffAllocator causes ArithmeticException due to 
improper poolBufSize value checking
                 Key: HBASE-27989
                 URL: https://issues.apache.org/jira/browse/HBASE-27989
             Project: HBase
          Issue Type: Bug
            Reporter: ConfX
         Attachments: reproduce.sh

h3. 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.
h3. 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.
{noformat}
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;
    . . .{noformat}
h3. 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:

{noformat}
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)
    . . .{noformat}
For an easy reproduction, run the reproduce.sh in the attachment. We are happy 
to provide a patch if this issue is confirmed.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to