diff --git a/src/main/java/org/mariadb/jdbc/internal/io/LruTraceCache.java b/src/main/java/org/mariadb/jdbc/internal/io/LruTraceCache.java index ac8937102..e2ec93aa1 100644 --- a/src/main/java/org/mariadb/jdbc/internal/io/LruTraceCache.java +++ b/src/main/java/org/mariadb/jdbc/internal/io/LruTraceCache.java @@ -55,6 +55,7 @@ import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.Collection; +import java.util.ConcurrentModificationException; import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; @@ -90,40 +91,42 @@ protected boolean removeEldestEntry(Map.Entry eldest) { * * @return trace cache value */ - public synchronized String printStack() { + public String printStack() { StringBuilder sb = new StringBuilder(); - Map.Entry[] arr = entrySet().toArray(new Map.Entry[0]); - for (Map.Entry entry : arr) { - TraceObject traceObj = entry.getValue(); - String key = entry.getKey(); - String indicator = ""; + boolean finished = false; + while (!finished) { + try { + Map.Entry[] arr = entrySet().toArray(new Map.Entry[0]); + for (Map.Entry entry : arr) { + TraceObject traceObj = entry.getValue(); + String key = entry.getKey(); + String indicator = ""; - switch (traceObj.getIndicatorFlag()) { - case TraceObject.NOT_COMPRESSED: - break; + switch (traceObj.getIndicatorFlag()) { + case TraceObject.COMPRESSED_PROTOCOL_NOT_COMPRESSED_PACKET: + indicator = " (compressed protocol - packet not compressed)"; + break; + case TraceObject.COMPRESSED_PROTOCOL_COMPRESSED_PACKET: + indicator = " (compressed protocol - packet compressed)"; + break; + default: + break; + } + sb.append("\nthread:").append(traceObj.getThreadId()); + if (traceObj.isSend()) { + sb.append(" send at -exchange:"); + } else { + sb.append(" read at -exchange:"); + } - case TraceObject.COMPRESSED_PROTOCOL_NOT_COMPRESSED_PACKET: - indicator = " (compressed protocol - packet not compressed)"; - break; - - case TraceObject.COMPRESSED_PROTOCOL_COMPRESSED_PACKET: - indicator = " (compressed protocol - packet compressed)"; - break; - - default: - break; - } - sb.append("\nthread:").append(traceObj.getThreadId()); - if (traceObj.isSend()) { - sb.append(" send at -exchange:"); - } else { - sb.append(" read at -exchange:"); + sb.append(key).append(indicator).append(Utils.hexdump(traceObj.getBuf())); + } + finished = true; + } catch (ConcurrentModificationException cc) { + // eat } - - sb.append(key).append(indicator).append(Utils.hexdump(traceObj.getBuf())); - - traceObj.remove(); } + this.clear(); return sb.toString(); }