From eba68f4e3546e46815ac127298721d40629e58d3 Mon Sep 17 00:00:00 2001
From: Florian Fittkau <ffi@informatik.uni-kiel.de>
Date: Thu, 27 Feb 2014 23:05:26 +0100
Subject: [PATCH] fixed long GC calls for large traces

---
 .../reconstruction/TraceReconstructionBuffer.java  | 10 +++++++++-
 .../reconstruction/TraceReconstructionFilter.java  | 14 ++++++++++++--
 .../TracePatternSummarizationFilter.java           |  2 ++
 3 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
index 5767581..df7c441 100644
--- a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
+++ b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionBuffer.java
@@ -24,6 +24,14 @@ class TraceReconstructionBuffer {
 	private long lastBufferInsert = -1;
 	private int maxOrderIndex = -1;
 
+	public void clear() {
+		events.clear();
+		openEvents = 0;
+		updatedInThisPeriod = true;
+		lastBufferInsert = -1;
+		maxOrderIndex = -1;
+	}
+
 	public final void insertEvent(final AbstractEventRecord event) {
 		updatedInThisPeriod = true;
 		setMaxOrderIndex(event);
@@ -90,6 +98,6 @@ class TraceReconstructionBuffer {
 				}
 			}
 		}
-		return new Trace(events, valid);
+		return new Trace(new ArrayList<AbstractEventRecord>(events), valid);
 	}
 }
diff --git a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java
index d349843..61fa7f0 100644
--- a/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java
+++ b/src/explorviz/live_trace_processing/filter/reconstruction/TraceReconstructionFilter.java
@@ -1,6 +1,7 @@
 package explorviz.live_trace_processing.filter.reconstruction;
 
 import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -20,6 +21,7 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 	private final long maxTraceTimeout;
 
 	private final Map<Long, TraceReconstructionBuffer> traceId2trace = new ConcurrentSkipListMap<Long, TraceReconstructionBuffer>();
+	private final LinkedList<TraceReconstructionBuffer> freeBufferCache = new LinkedList<TraceReconstructionBuffer>();
 
 	public TraceReconstructionFilter(final long maxTraceTimeout,
 			final ITraceReduction traceReduction) {
@@ -33,13 +35,15 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 		if (record instanceof AbstractEventRecord) {
 			final AbstractEventRecord abstractOperationEvent = ((AbstractEventRecord) record);
 
-			final long traceId = abstractOperationEvent.getTraceId();
+			final Long traceId = abstractOperationEvent.getTraceId();
 			final TraceReconstructionBuffer traceBuffer = getBufferForTraceId(abstractOperationEvent
 					.getTraceId());
 			traceBuffer.insertEvent(abstractOperationEvent);
 
 			if (traceBuffer.isFinished()) {
 				traceId2trace.remove(traceId);
+				traceBuffer.clear();
+				freeBufferCache.addLast(traceBuffer);
 				deliver(traceBuffer.toTrace(true));
 			}
 		} else if (record instanceof Trace) {
@@ -64,7 +68,11 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 	private final TraceReconstructionBuffer getBufferForTraceId(final long traceId) {
 		TraceReconstructionBuffer traceBuffer = traceId2trace.get(traceId);
 		if (traceBuffer == null) {
-			traceBuffer = new TraceReconstructionBuffer();
+			if (freeBufferCache.isEmpty()) {
+				traceBuffer = new TraceReconstructionBuffer();
+			} else {
+				traceBuffer = freeBufferCache.removeFirst();
+			}
 			traceId2trace.put(traceId, traceBuffer);
 		}
 		return traceBuffer;
@@ -84,6 +92,8 @@ public final class TraceReconstructionFilter extends AbstractFilter implements I
 				if ((timestamp - traceBuffer.getLastBufferInsert()) <= traceTimeout) {
 					deliver(traceBuffer.toTrace(false));
 					traceIdsToRemove.add(entry.getKey());
+					traceBuffer.clear();
+					freeBufferCache.addLast(traceBuffer);
 				}
 			}
 		}
diff --git a/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java b/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java
index 6683064..90b0fbe 100644
--- a/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java
+++ b/src/explorviz/live_trace_processing/filter/reduction/summarization/TracePatternSummarizationFilter.java
@@ -22,6 +22,8 @@ public class TracePatternSummarizationFilter extends AbstractFilter implements I
 	private final Map<Trace, TracePatternSummarizationBuffer> trace2buffer = new ConcurrentSkipListMap<Trace, TracePatternSummarizationBuffer>(
 			new TraceComperator());
 
+	// TODO cache for buffer objects
+
 	public TracePatternSummarizationFilter(final long maxCollectionDuration,
 			final IPipeReceiver sinkReceiver) {
 		super(sinkReceiver, Constants.TRACE_SUMMARIZATION_DISRUPTOR_SIZE,
-- 
GitLab