Skip to content

Commit f623a10

Browse files
tmf.analysis: Pre-filter events to speed up trace parsing
Add a pre-filter activity to reduce queue fill. Only enqueue data that may be read by analyses. This patch updates: * ActiveTidStateProvider * KernelStateProvider * KernelMemoryStateProvider * KernelCpuUsageStateProvider * CallstackStateProvider [Changed] add filter to event dispatch to speed up trace compass Change-Id: I51c8cb5594812491c85a2cbafe8d32fd4f6bc0c5 Signed-off-by: Matthew Khouzam <matthew.khouzam@ericsson.com>
1 parent 98c306b commit f623a10

File tree

7 files changed

+83
-12
lines changed

7 files changed

+83
-12
lines changed

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/cpuusage/KernelCpuUsageStateProvider.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ public KernelCpuUsageStateProvider getNewInstance() {
9090
return new KernelCpuUsageStateProvider(this.getTrace(), this.fLayout);
9191
}
9292

93+
@Override
94+
protected boolean considerEvent(ITmfEvent event) {
95+
return super.considerEvent(event) && event.getName().equals(fLayout.eventSchedSwitch());
96+
}
97+
9398
@Override
9499
protected void eventHandle(@Nullable ITmfEvent event) {
95100
if (event == null) {

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/kernelmemoryusage/KernelMemoryStateProvider.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212

1313
import static org.eclipse.tracecompass.common.core.NonNullUtils.checkNotNull;
1414

15+
import java.util.Set;
16+
import java.util.TreeSet;
17+
1518
import org.eclipse.core.runtime.NullProgressMonitor;
1619
import org.eclipse.jdt.annotation.NonNull;
1720
import org.eclipse.tracecompass.analysis.os.linux.core.kernel.KernelTidAspect;
@@ -58,6 +61,12 @@ public class KernelMemoryStateProvider extends AbstractTmfStateProvider {
5861

5962
private IKernelAnalysisEventLayout fLayout;
6063

64+
private final String fEventKmemPageFree;
65+
66+
private final String fEventKmemPageAlloc;
67+
68+
private final Set<String> fToConsider = new TreeSet<>();
69+
6170
/**
6271
* Constructor
6372
*
@@ -69,6 +78,10 @@ public class KernelMemoryStateProvider extends AbstractTmfStateProvider {
6978
public KernelMemoryStateProvider(@NonNull ITmfTrace trace, IKernelAnalysisEventLayout layout) {
7079
super(trace, "Kernel:Memory"); //$NON-NLS-1$
7180
fLayout = layout;
81+
fEventKmemPageAlloc = fLayout.eventKmemPageAlloc();
82+
fEventKmemPageFree = fLayout.eventKmemPageFree();
83+
fToConsider.add(fEventKmemPageAlloc);
84+
fToConsider.add(fEventKmemPageFree);
7285
}
7386

7487
@Override
@@ -81,17 +94,24 @@ public ITmfStateProvider getNewInstance() {
8194
return new KernelMemoryStateProvider(getTrace(), fLayout);
8295
}
8396

97+
@Override
98+
protected boolean considerEvent(ITmfEvent event) {
99+
return super.considerEvent(event) && fToConsider.contains(event.getName());
100+
}
101+
84102
@Override
85103
protected void eventHandle(@NonNull ITmfEvent event) {
86104
String name = event.getName();
87105

88106
long inc;
89-
if (name.equals(fLayout.eventKmemPageAlloc())) {
107+
if (name.equals(fEventKmemPageAlloc)) {
90108
inc = PAGE_SIZE;
91-
} else if (name.equals(fLayout.eventKmemPageFree())) {
92-
inc = -PAGE_SIZE;
93109
} else {
94-
return;
110+
if (name.equals(fEventKmemPageFree)) {
111+
inc = -PAGE_SIZE;
112+
} else {
113+
return;
114+
}
95115
}
96116

97117
try {

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/analysis/os/linux/core/tid/ActiveTidStateProvider.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,13 @@ public int getVersion() {
7272
return new ActiveTidStateProvider(getTrace(), fLayout);
7373
}
7474

75+
@Override
76+
protected boolean considerEvent(@NonNull ITmfEvent event) {
77+
return super.considerEvent(event) && event.getName().equals(fSchedSwitch);
78+
}
79+
7580
@Override
7681
protected void eventHandle(@NonNull ITmfEvent event) {
77-
if (!event.getName().equals(fSchedSwitch)) {
78-
return;
79-
}
8082
ITmfStateSystemBuilder ssb = getStateSystemBuilder();
8183
if (ssb == null) {
8284
return;

analysis/org.eclipse.tracecompass.analysis.os.linux.core/src/org/eclipse/tracecompass/internal/analysis/os/linux/core/kernel/KernelStateProvider.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@
1414

1515
package org.eclipse.tracecompass.internal.analysis.os.linux.core.kernel;
1616

17+
import java.util.HashSet;
1718
import java.util.Map;
19+
import java.util.Set;
1820

1921
import org.eclipse.jdt.annotation.Nullable;
2022
import org.eclipse.tracecompass.analysis.os.linux.core.trace.IKernelAnalysisEventLayout;
@@ -98,6 +100,7 @@ public class KernelStateProvider extends AbstractTmfStateProvider {
98100

99101
private final KernelEventHandler fSysEntryHandler;
100102
private final KernelEventHandler fSysExitHandler;
103+
private final Set<String> fValidEventNames = new HashSet<>();
101104

102105
// ------------------------------------------------------------------------
103106
// Constructor
@@ -116,7 +119,7 @@ public KernelStateProvider(ITmfTrace trace, IKernelAnalysisEventLayout layout) {
116119
super(trace, "Kernel"); //$NON-NLS-1$
117120
fLayout = layout;
118121
fEventNames = buildEventNames(layout);
119-
122+
fValidEventNames.addAll(fEventNames.keySet());
120123
fSysEntryHandler = new SysEntryHandler(fLayout);
121124
fSysExitHandler = new SysExitHandler(fLayout);
122125
}
@@ -175,6 +178,19 @@ public KernelStateProvider getNewInstance() {
175178
return new KernelStateProvider(this.getTrace(), fLayout);
176179
}
177180

181+
@Override
182+
protected boolean considerEvent(ITmfEvent event) {
183+
boolean considerEvent = super.considerEvent(event);
184+
if (!considerEvent) {
185+
return false;
186+
}
187+
String name = event.getName();
188+
if (fValidEventNames.contains(name)) {
189+
return true;
190+
}
191+
return isSyscallEntry(name) || isSyscallExit(name);
192+
}
193+
178194
@Override
179195
protected void eventHandle(@Nullable ITmfEvent event) {
180196
if (event == null) {

analysis/org.eclipse.tracecompass.analysis.profiling.core/src/org/eclipse/tracecompass/analysis/profiling/core/callstack/CallStackStateProvider.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ public CallStackStateProvider(ITmfTrace trace) {
114114

115115
@Override
116116
protected void eventHandle(ITmfEvent event) {
117-
if (!considerEvent(event)) {
118-
return;
119-
}
120117

121118
ITmfStateSystemBuilder ss = checkNotNull(getStateSystemBuilder());
122119

@@ -204,7 +201,10 @@ public void done() {
204201
* @return If false, the event will be ignored by the state provider. If
205202
* true processing will continue.
206203
*/
207-
protected abstract boolean considerEvent(ITmfEvent event);
204+
@Override
205+
protected boolean considerEvent(ITmfEvent event) {
206+
return true;
207+
}
208208

209209
/**
210210
* Check an event if it indicates a function entry.

lttng/org.eclipse.tracecompass.lttng2.ust.core/src/org/eclipse/tracecompass/internal/lttng2/ust/core/analysis/memory/UstMemoryStateProvider.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,14 @@ public UstMemoryStateProvider(@NonNull ITmfTrace trace, @Nullable UstMemoryAnaly
159159
return builder.build();
160160
}
161161

162+
@Override
163+
protected boolean considerEvent(@NonNull ITmfEvent event) {
164+
if (!super.considerEvent(event)) {
165+
return false;
166+
}
167+
return fEventNames.containsKey(event.getName());
168+
}
169+
162170
@Override
163171
protected void eventHandle(ITmfEvent event) {
164172
String name = event.getName();

tmf/org.eclipse.tracecompass.tmf.core/src/org/eclipse/tracecompass/tmf/core/statesystem/AbstractTmfStateProvider.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@ public void run() {
319319
event = fEventsQueue.take();
320320
continue;
321321
}
322+
if (!considerEvent(event)) {
323+
event = fEventsQueue.take();
324+
continue;
325+
}
322326
currentEvent = event;
323327
long currentTime = event.getTimestamp().toNanos();
324328
fSafeTime = currentTime - 1;
@@ -436,6 +440,22 @@ public void addFutureEvent(long time, @Nullable Object futureValue, int attribut
436440
// Abstract methods
437441
// ------------------------------------------------------------------------
438442

443+
/**
444+
* Check if this event should be considered for processing by the state
445+
* provider. This check is a fast fail filter invoked before
446+
* {@link #eventHandle(ITmfEvent)} to allow events to not be processed as
447+
* much.
448+
*
449+
* @param event
450+
* The event to check
451+
* @return If false, the event will be ignored by the state provider. If
452+
* true processing will continue.
453+
* @since 10.2
454+
*/
455+
protected boolean considerEvent(ITmfEvent event) {
456+
return true;
457+
}
458+
439459
/**
440460
* Handle the given event and send the appropriate state transitions into
441461
* the the state system.

0 commit comments

Comments
 (0)