23
23
import com .apple .foundationdb .record .RecordCoreException ;
24
24
import com .apple .foundationdb .record .logging .KeyValueLogMessage ;
25
25
import com .apple .foundationdb .record .query .plan .cascades .CascadesRule ;
26
+ import com .apple .foundationdb .record .query .plan .cascades .PlannerPhase ;
26
27
import com .apple .foundationdb .record .query .plan .cascades .debug .eventprotos .PEvent ;
27
28
import com .apple .foundationdb .record .util .pair .Pair ;
28
29
import com .google .common .base .Verify ;
29
- import com .google .common .collect .ImmutableMap ;
30
30
import com .google .common .collect .Lists ;
31
31
import com .google .common .collect .Maps ;
32
32
import org .slf4j .Logger ;
35
35
import javax .annotation .Nonnull ;
36
36
import javax .annotation .Nullable ;
37
37
import java .util .ArrayDeque ;
38
+ import java .util .Collections ;
38
39
import java .util .Deque ;
39
40
import java .util .Iterator ;
41
+ import java .util .LinkedHashMap ;
40
42
import java .util .List ;
41
- import java .util .Locale ;
42
43
import java .util .Map ;
43
44
import java .util .Objects ;
44
- import java .util .concurrent .TimeUnit ;
45
45
46
46
@ SuppressWarnings ("PMD.SystemPrintln" )
47
47
public class EventState {
48
48
@ Nonnull
49
49
private static final Logger logger = LoggerFactory .getLogger (EventState .class );
50
50
51
- @ Nullable private final List <Debugger .Event > events ;
52
- @ Nullable private final List <PEvent > eventProtos ;
53
- @ Nullable private final Iterable <PEvent > prerecordedEventProtoIterable ;
54
- @ Nullable private Iterator <PEvent > prerecordedEventProtoIterator ;
51
+ @ Nullable protected final List <Debugger .Event > events ;
52
+ @ Nullable protected final List <PEvent > eventProtos ;
53
+ @ Nullable protected final Iterable <PEvent > prerecordedEventProtoIterable ;
54
+ @ Nullable protected Iterator <PEvent > prerecordedEventProtoIterator ;
55
55
56
- @ Nonnull private final Map <Class <? extends Debugger .Event >, MutableStats > eventClassStatsMap ;
56
+ @ Nonnull protected final Map <Class <? extends Debugger .Event >, MutableStats > eventWithoutStateClassStatsMap ;
57
+ @ Nonnull protected final Map <PlannerPhase , Map <Class <? extends Debugger .EventWithState >, MutableStats >> eventWithStateClassStatsMapByPlannerPhase ;
57
58
58
- @ Nonnull private final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
59
+ @ Nonnull protected final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
59
60
60
- @ Nonnull private final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
61
+ @ Nonnull protected final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
61
62
62
63
protected int currentTick ;
63
64
protected final long startTs ;
@@ -72,7 +73,8 @@ public static EventState copyOf(final EventState source) {
72
73
source .events == null ? null : Lists .newArrayList (source .events ),
73
74
source .eventProtos == null ? null : Lists .newArrayList (source .eventProtos ),
74
75
source .prerecordedEventProtoIterable ,
75
- Maps .newLinkedHashMap (source .eventClassStatsMap ),
76
+ Maps .newLinkedHashMap (source .eventWithoutStateClassStatsMap ),
77
+ Maps .newEnumMap (source .eventWithStateClassStatsMapByPlannerPhase ),
76
78
Maps .newLinkedHashMap (source .plannerRuleClassStatsMap ),
77
79
new ArrayDeque <>(source .eventProfilingStack ),
78
80
source .getCurrentTick (),
@@ -86,28 +88,31 @@ protected EventState(final boolean isRecordEvents, final boolean isRecordEventPr
86
88
isRecordEvents ? Lists .newArrayList () : null ,
87
89
prerecordedEventProtoIterable ,
88
90
Maps .newLinkedHashMap (),
91
+ Maps .newEnumMap (PlannerPhase .class ),
89
92
Maps .newLinkedHashMap (),
90
93
new ArrayDeque <>(),
91
94
-1 ,
92
95
System .nanoTime ());
93
96
}
94
97
95
98
protected EventState (
96
- @ Nullable final List <Debugger .Event > events ,
97
- @ Nullable final List <PEvent > eventProtos ,
98
- @ Nullable final Iterable <PEvent > prerecordedEventProtoIterable ,
99
- @ Nonnull final Map <Class <? extends Debugger .Event >, MutableStats > eventClassStatsMap ,
100
- @ Nonnull final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ,
101
- @ Nonnull final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ,
102
- final int currentTick ,
103
- final long startTs ) {
99
+ @ Nullable final List <Debugger .Event > events ,
100
+ @ Nullable final List <PEvent > eventProtos ,
101
+ @ Nullable final Iterable <PEvent > prerecordedEventProtoIterable ,
102
+ @ Nonnull final Map <Class <? extends Debugger .Event >, MutableStats > eventWithoutStateClassStatsMap ,
103
+ @ Nonnull final Map <PlannerPhase , Map <Class <? extends Debugger .EventWithState >, MutableStats >> eventWithStateClassStatsMapByPlannerPhase ,
104
+ @ Nonnull final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ,
105
+ @ Nonnull final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ,
106
+ final int currentTick ,
107
+ final long startTs ) {
104
108
105
109
this .events = events ;
106
110
this .eventProtos = eventProtos ;
107
111
this .prerecordedEventProtoIterable = prerecordedEventProtoIterable ;
108
112
this .prerecordedEventProtoIterator = prerecordedEventProtoIterable == null
109
113
? null : prerecordedEventProtoIterable .iterator ();
110
- this .eventClassStatsMap = eventClassStatsMap ;
114
+ this .eventWithoutStateClassStatsMap = eventWithoutStateClassStatsMap ;
115
+ this .eventWithStateClassStatsMapByPlannerPhase = eventWithStateClassStatsMapByPlannerPhase ;
111
116
this .plannerRuleClassStatsMap = plannerRuleClassStatsMap ;
112
117
this .eventProfilingStack = eventProfilingStack ;
113
118
this .currentTick = currentTick ;
@@ -179,7 +184,7 @@ public void addCurrentEvent(@Nonnull final Debugger.Event event) {
179
184
final long totalTime = currentTsInNs - eventDurations .getStartTsInNs ();
180
185
final long ownTime = totalTime - eventDurations .getAdjustmentForOwnTimeInNs ();
181
186
182
- final MutableStats forEventClass = getEventStatsForEventClass ( currentEventClass );
187
+ final MutableStats forEventClass = getEventStatsForEvent ( event );
183
188
forEventClass .increaseTotalTimeInNs (totalTime );
184
189
forEventClass .increaseOwnTimeInNs (ownTime );
185
190
if (event instanceof Debugger .TransformRuleCallEvent ) {
@@ -229,8 +234,9 @@ private void verifyCurrentEventProto(final PEvent currentEventProto) {
229
234
230
235
@ SuppressWarnings ("unchecked" )
231
236
private void updateCounts (@ Nonnull final Debugger .Event event ) {
232
- final MutableStats forEventClass = getEventStatsForEventClass (event . getClass () );
237
+ final MutableStats forEventClass = getEventStatsForEvent (event );
233
238
forEventClass .increaseCount (event .getLocation (), 1L );
239
+
234
240
if (event instanceof Debugger .EventWithRule ) {
235
241
final CascadesRule <?> rule = ((Debugger .EventWithRule )event ).getRule ();
236
242
final Class <? extends CascadesRule <?>> ruleClass = (Class <? extends CascadesRule <?>>)rule .getClass ();
@@ -239,17 +245,31 @@ private void updateCounts(@Nonnull final Debugger.Event event) {
239
245
}
240
246
}
241
247
242
- private MutableStats getEventStatsForEventClass (@ Nonnull Class <? extends Debugger .Event > eventClass ) {
243
- return eventClassStatsMap .compute (eventClass , (eC , mutableStats ) -> mutableStats != null ? mutableStats : new MutableStats ());
248
+ private MutableStats getEventStatsForEvent (@ Nonnull Debugger .Event event ) {
249
+ return (event instanceof Debugger .EventWithState ) ?
250
+ getEventStatsForEventWithStateClassByPlannerPhase ((Debugger .EventWithState )event ) :
251
+ getEventStatsForEventWithoutStateClass (event .getClass ());
252
+ }
253
+
254
+ private MutableStats getEventStatsForEventWithoutStateClass (@ Nonnull Class <? extends Debugger .Event > eventClass ) {
255
+ return eventWithoutStateClassStatsMap .compute (eventClass , (eC , mutableStats ) -> mutableStats != null ? mutableStats : new MutableStats ());
256
+ }
257
+
258
+ private MutableStats getEventStatsForEventWithStateClassByPlannerPhase (@ Nonnull Debugger .EventWithState event ) {
259
+ return eventWithStateClassStatsMapByPlannerPhase .computeIfAbsent (event .getPlannerPhase (), pP -> new LinkedHashMap <>())
260
+ .computeIfAbsent (event .getClass (), (eC ) -> new MutableStats ());
244
261
}
245
262
246
263
private MutableStats getEventStatsForPlannerRuleClass (@ Nonnull Class <? extends CascadesRule <?>> plannerRuleClass ) {
247
- return plannerRuleClassStatsMap .compute (plannerRuleClass , (eC , mutableStats ) -> mutableStats != null ? mutableStats : new MutableStats ());
264
+ return plannerRuleClassStatsMap .computeIfAbsent (plannerRuleClass , (eC ) -> new MutableStats ());
248
265
}
249
266
250
267
@ Nonnull
251
268
StatsMaps getStatsMaps () {
252
- return new StatsMaps (eventClassStatsMap , plannerRuleClassStatsMap );
269
+ return new StatsMaps (
270
+ Collections .unmodifiableMap (eventWithoutStateClassStatsMap ),
271
+ Collections .unmodifiableMap (eventWithStateClassStatsMapByPlannerPhase ),
272
+ Collections .unmodifiableMap (plannerRuleClassStatsMap ));
253
273
}
254
274
255
275
private static class MutableStats extends Stats {
0 commit comments