From baf8ce1ddc8136eaf3dac8424830b8960991ee21 Mon Sep 17 00:00:00 2001 From: Simon Brandhof Date: Sat, 4 May 2019 09:43:24 +0200 Subject: [PATCH] SONAR-12078 out of memory in CE if file has too many issues --- .../org/sonar/core/issue/tracking/BlockRecognizer.java | 6 +++++- .../sonar/core/issue/tracking/BlockRecognizerTest.java | 9 +++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java b/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java index 652b27c07e2..20b78655d1c 100644 --- a/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java +++ b/sonar-core/src/main/java/org/sonar/core/issue/tracking/BlockRecognizer.java @@ -77,7 +77,7 @@ class BlockRecognizer { } // Check if remaining number of lines exceeds threshold. It avoids processing too many combinations. - if (basesByLine.keySet().size() * rawsByLine.keySet().size() >= 250_000) { + if (isOverLimit(basesByLine.keySet().size(), rawsByLine.keySet().size())) { return; } @@ -97,6 +97,10 @@ class BlockRecognizer { } } + static boolean isOverLimit(long a, long b) { + return Math.multiplyExact(a, b) >= 250_000; + } + /** * @param startLineA number of line from first version of text (numbering starts from 1) * @param startLineB number of line from second version of text (numbering starts from 1) diff --git a/sonar-core/src/test/java/org/sonar/core/issue/tracking/BlockRecognizerTest.java b/sonar-core/src/test/java/org/sonar/core/issue/tracking/BlockRecognizerTest.java index 9164a04b82d..c6046dcb322 100644 --- a/sonar-core/src/test/java/org/sonar/core/issue/tracking/BlockRecognizerTest.java +++ b/sonar-core/src/test/java/org/sonar/core/issue/tracking/BlockRecognizerTest.java @@ -41,6 +41,15 @@ public class BlockRecognizerTest { assertThat(compute(seq("bcde"), seq("abcde"), 3, 4)).isEqualTo(4); } + @Test + public void isOverLimit() { + assertThat(BlockRecognizer.isOverLimit(20, 40)).isFalse(); + assertThat(BlockRecognizer.isOverLimit(3, 100_000)).isTrue(); + + // multiplication of these two ints is higher than Integer.MAX_VALUE + assertThat(BlockRecognizer.isOverLimit(50_000, 60_000)).isTrue(); + } + private int compute(LineHashSequence seqA, LineHashSequence seqB, int ai, int bi) { return BlockRecognizer.lengthOfMaximalBlock(seqA, ai, seqB, bi); } -- 2.39.5