From aae8dab7c3a6012dbc467c7cd337e9de14a3cbfc Mon Sep 17 00:00:00 2001 From: Risto Lahtela <24460436+Rsl1122@users.noreply.github.com> Date: Sun, 7 Jun 2020 12:09:15 +0300 Subject: [PATCH] Removed hashing from stacktrace deduplication Affects issues: - #1475 --- .../plan/utilities/logging/ErrorLogger.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorLogger.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorLogger.java index dc726eb68..e68d7f081 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorLogger.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/logging/ErrorLogger.java @@ -225,14 +225,13 @@ public class ErrorLogger implements ErrorHandler { private String hash(Throwable e) { StringBuilder seed = new StringBuilder(); Throwable cause = e; - Set alreadyPresent = new HashSet<>(); + String previousLine = null; while (cause != null) { for (StackTraceElement element : cause.getStackTrace()) { String asLine = element.toString(); - if (!alreadyPresent.contains(asLine)) { - seed.append(asLine); - } - alreadyPresent.add(asLine); + if (asLine.equals(previousLine)) continue; + seed.append(asLine); + previousLine = asLine; } cause = e.getCause(); } @@ -245,7 +244,7 @@ public class ErrorLogger implements ErrorHandler { Deduplicator deduplicator = new Deduplicator(); for (StackTraceElement element : e.getStackTrace()) { String line = element.toString(); - deduplicator.getLine(line).ifPresent(trace::add); + trace.addAll(deduplicator.getLines(line)); } deduplicator.getLeftoverDuplicateCountLine().ifPresent(trace::add); Throwable[] suppressed = e.getSuppressed(); @@ -264,25 +263,25 @@ public class ErrorLogger implements ErrorHandler { } private static class Deduplicator { - private final Set lines = new HashSet<>(); + private String previousLine = null; private String lastDuplicate = null; private int duplicateCount = 0; - public Optional getLine(String line) { + public List getLines(String line) { if (duplicateCount > 0 && !line.equals(lastDuplicate)) { String returnLine = " x " + duplicateCount; - duplicateCount = 0; - return Optional.of(returnLine); + duplicateCount = 1; + return Arrays.asList(returnLine, " " + line); } else if (line.equals(lastDuplicate)) { duplicateCount++; - return Optional.empty(); - } else if (lines.contains(line)) { + return Collections.emptyList(); + } else if (line.equals(previousLine)) { lastDuplicate = line; - duplicateCount = 1; - return Optional.empty(); + duplicateCount = 2; + return Collections.emptyList(); } else { - lines.add(line); - return Optional.of(" " + line); + previousLine = line; + return Collections.singletonList(" " + line); } }