commit e7f390e6b57411eeb07c7c2c4d56d68868cfea57 Author: Yu Li Date: Thu Feb 25 14:19:52 2016 +0800 HBASE-15324 Jitter may cause desiredMaxFileSize overflow in ConstantSizeRegionSplitPolicy and trigger unexpected split diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ConstantSizeRegionSplitPolicy.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ConstantSizeRegionSplitPolicy.java index 66ef712..9884246 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ConstantSizeRegionSplitPolicy.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ConstantSizeRegionSplitPolicy.java @@ -53,7 +53,14 @@ public class ConstantSizeRegionSplitPolicy extends RegionSplitPolicy { HConstants.DEFAULT_MAX_FILE_SIZE); } double jitter = conf.getDouble("hbase.hregion.max.filesize.jitter", 0.25D); - this.desiredMaxFileSize += (long)(desiredMaxFileSize * (RANDOM.nextFloat() - 0.5D) * jitter); + double jitterRate = (RANDOM.nextFloat() - 0.5D) * jitter; + long jitterValue = (long) (this.desiredMaxFileSize * jitterRate); + // make sure the long value won't overflow after jitter + if (jitterRate > -1E-6 && jitterValue > (Long.MAX_VALUE - this.desiredMaxFileSize)) { + this.desiredMaxFileSize = Long.MAX_VALUE; + } else { + this.desiredMaxFileSize += jitterValue; + } } @Override