[ 
https://issues.apache.org/jira/browse/HBASE-27993?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

ConfX updated HBASE-27993:
--------------------------
    Description: 
h2. What happened

There is no value checking for parameter 
{{hbase.regionserver.logroll.multiplier}} when {{hbase.wal.provider}} is set to 
{{multiwal}}. This may cause improper calculations and crashes the system like 
division by 0.
h2. Buggy code

In {{AbstractFSWAL.java}}, there is no value checking for {{logRollSize and 
this variable is directly used while calculating the value of maxLogFiles in 
the method calculateMaxLogFiles}}. When logRollSize is mistakenly set to 0, the 
code would cause division by 0 and throw {{ArithmeticException}} to crash the 
system.
{noformat}
     private int calculateMaxLogFiles(Configuration conf, long logRollSize) {
    Pair<Long, MemoryType> globalMemstoreSize = 
MemorySizeUtil.getGlobalMemStoreSize(conf);
    return (int) ((globalMemstoreSize.getFirst() * 2) / logRollSize);
  }{noformat}
h2. How to reproduce

(1) set hbase.regionserver.logroll.multiplier=0.0 and 
hbase.wal.provider=multiwal
(2) run org.apache.hadoop.hbase.wal.TestWALMethods#testGetSplitEditFilesSorted
you should observe the following failure:
{noformat}
java.lang.ArithmeticException: / by zero
        at 
org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.calculateMaxLogFiles(AbstractFSWAL.java:466)
  at 
org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.<init>(AbstractFSWAL.java:594)
        at 
org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.<init>(AsyncFSWAL.java:141) 
       . . .{noformat}
For an easy reproduction, run the reproduce.sh in the attachment.

We are happy to provide a patch if this issue is confirmed.

  was:
h2. What happened

There is no value checking for parameter 
{{hbase.regionserver.logroll.multiplier}} when {{hbase.wal.provider}} is set to 
{{{}multiwal{}}}. This may cause improper calculations and crashes the system 
like division by 0.
h2. Buggy code

In {{{}AbstractFSWAL.java{}}}, there is no value checking for {{{}logRollSize 
}} and this variable is directly used while calculating the value of 
maxLogFiles in the method \{{{}calculateMaxLogFiles{}}}. When \{{logRollSize }} 
is mistakenly set to 0, the code would cause division by 0 and throw 
ArithmeticException to crash the system.
{noformat}
     private int calculateMaxLogFiles(Configuration conf, long logRollSize) {
    Pair<Long, MemoryType> globalMemstoreSize = 
MemorySizeUtil.getGlobalMemStoreSize(conf);
    return (int) ((globalMemstoreSize.getFirst() * 2) / logRollSize);
  }{noformat}
h2. How to reproduce

(1) set hbase.regionserver.logroll.multiplier=0.0 and 
hbase.wal.provider=multiwal
(2) run org.apache.hadoop.hbase.wal.TestWALMethods#testGetSplitEditFilesSorted
you should observe the following failure:
{noformat}
java.lang.ArithmeticException: / by zero
        at 
org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.calculateMaxLogFiles(AbstractFSWAL.java:466)
  at 
org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.<init>(AbstractFSWAL.java:594)
        at 
org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.<init>(AsyncFSWAL.java:141) 
       . . .{noformat}
For an easy reproduction, run the reproduce.sh in the attachment.

We are happy to provide a patch if this issue is confirmed.


> AbstractFSWAL causes ArithmeticException due to improper logRollSize value 
> checking
> -----------------------------------------------------------------------------------
>
>                 Key: HBASE-27993
>                 URL: https://issues.apache.org/jira/browse/HBASE-27993
>             Project: HBase
>          Issue Type: Bug
>            Reporter: ConfX
>            Priority: Critical
>         Attachments: reproduce.sh
>
>
> h2. What happened
> There is no value checking for parameter 
> {{hbase.regionserver.logroll.multiplier}} when {{hbase.wal.provider}} is set 
> to {{multiwal}}. This may cause improper calculations and crashes the system 
> like division by 0.
> h2. Buggy code
> In {{AbstractFSWAL.java}}, there is no value checking for {{logRollSize and 
> this variable is directly used while calculating the value of maxLogFiles in 
> the method calculateMaxLogFiles}}. When logRollSize is mistakenly set to 0, 
> the code would cause division by 0 and throw {{ArithmeticException}} to crash 
> the system.
> {noformat}
>      private int calculateMaxLogFiles(Configuration conf, long logRollSize) {
>     Pair<Long, MemoryType> globalMemstoreSize = 
> MemorySizeUtil.getGlobalMemStoreSize(conf);
>     return (int) ((globalMemstoreSize.getFirst() * 2) / logRollSize);
>   }{noformat}
> h2. How to reproduce
> (1) set hbase.regionserver.logroll.multiplier=0.0 and 
> hbase.wal.provider=multiwal
> (2) run org.apache.hadoop.hbase.wal.TestWALMethods#testGetSplitEditFilesSorted
> you should observe the following failure:
> {noformat}
> java.lang.ArithmeticException: / by zero
>       at 
> org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.calculateMaxLogFiles(AbstractFSWAL.java:466)
>   at 
> org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.<init>(AbstractFSWAL.java:594)
>         at 
> org.apache.hadoop.hbase.regionserver.wal.AsyncFSWAL.<init>(AsyncFSWAL.java:141)
>         . . .{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