[ 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} > 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)