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)