Removed hashing from stacktrace deduplication

Affects issues:
- #1475
This commit is contained in:
Risto Lahtela 2020-06-07 12:09:15 +03:00
parent fe66c2dd63
commit aae8dab7c3

View File

@ -225,14 +225,13 @@ public class ErrorLogger implements ErrorHandler {
private String hash(Throwable e) { private String hash(Throwable e) {
StringBuilder seed = new StringBuilder(); StringBuilder seed = new StringBuilder();
Throwable cause = e; Throwable cause = e;
Set<String> alreadyPresent = new HashSet<>(); String previousLine = null;
while (cause != null) { while (cause != null) {
for (StackTraceElement element : cause.getStackTrace()) { for (StackTraceElement element : cause.getStackTrace()) {
String asLine = element.toString(); String asLine = element.toString();
if (!alreadyPresent.contains(asLine)) { if (asLine.equals(previousLine)) continue;
seed.append(asLine); seed.append(asLine);
} previousLine = asLine;
alreadyPresent.add(asLine);
} }
cause = e.getCause(); cause = e.getCause();
} }
@ -245,7 +244,7 @@ public class ErrorLogger implements ErrorHandler {
Deduplicator deduplicator = new Deduplicator(); Deduplicator deduplicator = new Deduplicator();
for (StackTraceElement element : e.getStackTrace()) { for (StackTraceElement element : e.getStackTrace()) {
String line = element.toString(); String line = element.toString();
deduplicator.getLine(line).ifPresent(trace::add); trace.addAll(deduplicator.getLines(line));
} }
deduplicator.getLeftoverDuplicateCountLine().ifPresent(trace::add); deduplicator.getLeftoverDuplicateCountLine().ifPresent(trace::add);
Throwable[] suppressed = e.getSuppressed(); Throwable[] suppressed = e.getSuppressed();
@ -264,25 +263,25 @@ public class ErrorLogger implements ErrorHandler {
} }
private static class Deduplicator { private static class Deduplicator {
private final Set<String> lines = new HashSet<>(); private String previousLine = null;
private String lastDuplicate = null; private String lastDuplicate = null;
private int duplicateCount = 0; private int duplicateCount = 0;
public Optional<String> getLine(String line) { public List<String> getLines(String line) {
if (duplicateCount > 0 && !line.equals(lastDuplicate)) { if (duplicateCount > 0 && !line.equals(lastDuplicate)) {
String returnLine = " x " + duplicateCount; String returnLine = " x " + duplicateCount;
duplicateCount = 0; duplicateCount = 1;
return Optional.of(returnLine); return Arrays.asList(returnLine, " " + line);
} else if (line.equals(lastDuplicate)) { } else if (line.equals(lastDuplicate)) {
duplicateCount++; duplicateCount++;
return Optional.empty(); return Collections.emptyList();
} else if (lines.contains(line)) { } else if (line.equals(previousLine)) {
lastDuplicate = line; lastDuplicate = line;
duplicateCount = 1; duplicateCount = 2;
return Optional.empty(); return Collections.emptyList();
} else { } else {
lines.add(line); previousLine = line;
return Optional.of(" " + line); return Collections.singletonList(" " + line);
} }
} }