From cacdc83cad98a2707591257705a2dd3f951b3095 Mon Sep 17 00:00:00 2001 From: Jihoon Son Date: Wed, 27 Feb 2019 19:07:37 -0800 Subject: [PATCH] Improve error message for integer overflow in compaction task (#7131) * improve error message for integer overflow in compaction task * fix build --- .../druid/java/util/common/Numbers.java | 8 +++++++ .../indexing/common/task/CompactionTask.java | 13 ++++++++++- .../common/task/CompactionTaskTest.java | 22 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/apache/druid/java/util/common/Numbers.java b/core/src/main/java/org/apache/druid/java/util/common/Numbers.java index d3ccf267225..c9d40d7df33 100644 --- a/core/src/main/java/org/apache/druid/java/util/common/Numbers.java +++ b/core/src/main/java/org/apache/druid/java/util/common/Numbers.java @@ -92,6 +92,14 @@ public final class Numbers } } + public static int toIntExact(long value, String error) + { + if ((int) value != value) { + throw new ArithmeticException(error); + } + return (int) value; + } + private Numbers() { } diff --git a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/CompactionTask.java b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/CompactionTask.java index c897de3fc0f..53c3641916f 100644 --- a/indexing-service/src/main/java/org/apache/druid/indexing/common/task/CompactionTask.java +++ b/indexing-service/src/main/java/org/apache/druid/indexing/common/task/CompactionTask.java @@ -54,8 +54,10 @@ import org.apache.druid.indexing.firehose.IngestSegmentFirehoseFactory; import org.apache.druid.java.util.common.IAE; import org.apache.druid.java.util.common.ISE; import org.apache.druid.java.util.common.JodaUtils; +import org.apache.druid.java.util.common.Numbers; import org.apache.druid.java.util.common.Pair; import org.apache.druid.java.util.common.RE; +import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.java.util.common.granularity.Granularities; import org.apache.druid.java.util.common.granularity.Granularity; import org.apache.druid.java.util.common.granularity.GranularityType; @@ -845,7 +847,16 @@ public class CompactionTask extends AbstractTask } final double avgRowsPerByte = totalNumRows / (double) totalSizeBytes; - final int maxRowsPerSegment = Math.toIntExact(Math.round(avgRowsPerByte * nonNullTargetCompactionSizeBytes)); + final long maxRowsPerSegmentLong = Math.round(avgRowsPerByte * nonNullTargetCompactionSizeBytes); + final int maxRowsPerSegment = Numbers.toIntExact( + maxRowsPerSegmentLong, + StringUtils.format( + "Estimated maxRowsPerSegment[%s] is out of integer value range. " + + "Please consider reducing targetCompactionSizeBytes[%s].", + maxRowsPerSegmentLong, + targetCompactionSizeBytes + ) + ); Preconditions.checkState(maxRowsPerSegment > 0, "Negative maxRowsPerSegment[%s]", maxRowsPerSegment); log.info( diff --git a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/CompactionTaskTest.java b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/CompactionTaskTest.java index 5117c1a31c8..283dee84422 100644 --- a/indexing-service/src/test/java/org/apache/druid/indexing/common/task/CompactionTaskTest.java +++ b/indexing-service/src/test/java/org/apache/druid/indexing/common/task/CompactionTaskTest.java @@ -62,6 +62,7 @@ import org.apache.druid.jackson.DefaultObjectMapper; import org.apache.druid.java.util.common.IAE; import org.apache.druid.java.util.common.ISE; import org.apache.druid.java.util.common.Intervals; +import org.apache.druid.java.util.common.Pair; import org.apache.druid.java.util.common.StringUtils; import org.apache.druid.java.util.common.granularity.Granularities; import org.apache.druid.java.util.common.granularity.Granularity; @@ -1135,6 +1136,27 @@ public class CompactionTaskTest .build(); } + @Test + public void testHugeTargetCompactionSize() + { + final PartitionConfigurationManager manager = new PartitionConfigurationManager(Long.MAX_VALUE, TUNING_CONFIG); + final TestIndexIO indexIO = (TestIndexIO) toolbox.getIndexIO(); + final Map queryableIndexMap = indexIO.getQueryableIndexMap(); + final List> segments = new ArrayList<>(); + + for (Entry entry : segmentMap.entrySet()) { + final DataSegment segment = entry.getKey(); + final File file = entry.getValue(); + segments.add(Pair.of(Preconditions.checkNotNull(queryableIndexMap.get(file)), segment)); + } + + expectedException.expect(ArithmeticException.class); + expectedException.expectMessage( + CoreMatchers.startsWith("Estimated maxRowsPerSegment[922337203685477632] is out of integer value range.") + ); + manager.computeTuningConfig(segments); + } + private static List getExpectedDimensionsSpecForAutoGeneration(boolean keepSegmentGranularity) { if (keepSegmentGranularity) {