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
public class EventState {
47
47
@ Nonnull
48
48
private static final Logger logger = LoggerFactory .getLogger (EventState .class );
49
49
50
- @ Nullable private final List <Debugger .Event > events ;
51
- @ Nullable private final List <PEvent > eventProtos ;
52
- @ Nullable private final Iterable <PEvent > prerecordedEventProtoIterable ;
53
- @ Nullable private Iterator <PEvent > prerecordedEventProtoIterator ;
50
+ @ Nullable protected final List <Debugger .Event > events ;
51
+ @ Nullable protected final List <PEvent > eventProtos ;
52
+ @ Nullable protected final Iterable <PEvent > prerecordedEventProtoIterable ;
53
+ @ Nullable protected Iterator <PEvent > prerecordedEventProtoIterator ;
54
54
55
- @ Nonnull private final Map <Class <? extends Debugger .Event >, MutableStats > eventClassStatsMap ;
55
+ @ Nonnull protected final Map <Class <? extends Debugger .Event >, MutableStats > eventWithoutStateClassStatsMap ;
56
+ @ Nonnull protected final Map <PlannerPhase , Map <Class <? extends Debugger .EventWithState >, MutableStats >> eventWithStateClassStatsMapByPlannerPhase ;
56
57
57
- @ Nonnull private final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
58
+ @ Nonnull protected final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
58
59
59
- @ Nonnull private final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
60
+ @ Nonnull protected final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
60
61
61
62
protected int currentTick ;
62
63
protected final long startTs ;
@@ -71,7 +72,8 @@ public static EventState copyOf(final EventState source) {
71
72
source .events == null ? null : Lists .newArrayList (source .events ),
72
73
source .eventProtos == null ? null : Lists .newArrayList (source .eventProtos ),
73
74
source .prerecordedEventProtoIterable ,
74
- Maps .newLinkedHashMap (source .eventClassStatsMap ),
75
+ Maps .newLinkedHashMap (source .eventWithoutStateClassStatsMap ),
76
+ Maps .newEnumMap (source .eventWithStateClassStatsMapByPlannerPhase ),
75
77
Maps .newLinkedHashMap (source .plannerRuleClassStatsMap ),
76
78
new ArrayDeque <>(source .eventProfilingStack ),
77
79
source .getCurrentTick (),
@@ -85,28 +87,31 @@ protected EventState(final boolean isRecordEvents, final boolean isRecordEventPr
85
87
isRecordEvents ? Lists .newArrayList () : null ,
86
88
prerecordedEventProtoIterable ,
87
89
Maps .newLinkedHashMap (),
90
+ Maps .newEnumMap (PlannerPhase .class ),
88
91
Maps .newLinkedHashMap (),
89
92
new ArrayDeque <>(),
90
93
-1 ,
91
94
System .nanoTime ());
92
95
}
93
96
94
97
protected EventState (
95
- @ Nullable final List <Debugger .Event > events ,
96
- @ Nullable final List <PEvent > eventProtos ,
97
- @ Nullable final Iterable <PEvent > prerecordedEventProtoIterable ,
98
- @ Nonnull final Map <Class <? extends Debugger .Event >, MutableStats > eventClassStatsMap ,
99
- @ Nonnull final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ,
100
- @ Nonnull final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ,
101
- final int currentTick ,
102
- final long startTs ) {
98
+ @ Nullable final List <Debugger .Event > events ,
99
+ @ Nullable final List <PEvent > eventProtos ,
100
+ @ Nullable final Iterable <PEvent > prerecordedEventProtoIterable ,
101
+ @ Nonnull final Map <Class <? extends Debugger .Event >, MutableStats > eventWithoutStateClassStatsMap ,
102
+ @ Nonnull final Map <PlannerPhase , Map <Class <? extends Debugger .EventWithState >, MutableStats >> eventWithStateClassStatsMapByPlannerPhase ,
103
+ @ Nonnull final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ,
104
+ @ Nonnull final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ,
105
+ final int currentTick ,
106
+ final long startTs ) {
103
107
104
108
this .events = events ;
105
109
this .eventProtos = eventProtos ;
106
110
this .prerecordedEventProtoIterable = prerecordedEventProtoIterable ;
107
111
this .prerecordedEventProtoIterator = prerecordedEventProtoIterable == null
108
112
? null : prerecordedEventProtoIterable .iterator ();
109
- this .eventClassStatsMap = eventClassStatsMap ;
113
+ this .eventWithoutStateClassStatsMap = eventWithoutStateClassStatsMap ;
114
+ this .eventWithStateClassStatsMapByPlannerPhase = eventWithStateClassStatsMapByPlannerPhase ;
110
115
this .plannerRuleClassStatsMap = plannerRuleClassStatsMap ;
111
116
this .eventProfilingStack = eventProfilingStack ;
112
117
this .currentTick = currentTick ;
@@ -178,7 +183,7 @@ public void addCurrentEvent(@Nonnull final Debugger.Event event) {
178
183
final long totalTime = currentTsInNs - eventDurations .getStartTsInNs ();
179
184
final long ownTime = totalTime - eventDurations .getAdjustmentForOwnTimeInNs ();
180
185
181
- final MutableStats forEventClass = getEventStatsForEventClass ( currentEventClass );
186
+ final MutableStats forEventClass = getEventStatsForEvent ( event );
182
187
forEventClass .increaseTotalTimeInNs (totalTime );
183
188
forEventClass .increaseOwnTimeInNs (ownTime );
184
189
if (event instanceof Debugger .TransformRuleCallEvent ) {
@@ -228,8 +233,9 @@ private void verifyCurrentEventProto(final PEvent currentEventProto) {
228
233
229
234
@ SuppressWarnings ("unchecked" )
230
235
private void updateCounts (@ Nonnull final Debugger .Event event ) {
231
- final MutableStats forEventClass = getEventStatsForEventClass (event . getClass () );
236
+ final MutableStats forEventClass = getEventStatsForEvent (event );
232
237
forEventClass .increaseCount (event .getLocation (), 1L );
238
+
233
239
if (event instanceof Debugger .EventWithRule ) {
234
240
final CascadesRule <?> rule = ((Debugger .EventWithRule )event ).getRule ();
235
241
final Class <? extends CascadesRule <?>> ruleClass = (Class <? extends CascadesRule <?>>)rule .getClass ();
@@ -238,17 +244,31 @@ private void updateCounts(@Nonnull final Debugger.Event event) {
238
244
}
239
245
}
240
246
241
- private MutableStats getEventStatsForEventClass (@ Nonnull Class <? extends Debugger .Event > eventClass ) {
242
- return eventClassStatsMap .compute (eventClass , (eC , mutableStats ) -> mutableStats != null ? mutableStats : new MutableStats ());
247
+ private MutableStats getEventStatsForEvent (@ Nonnull Debugger .Event event ) {
248
+ return (event instanceof Debugger .EventWithState ) ?
249
+ getEventStatsForEventWithStateClassByPlannerPhase ((Debugger .EventWithState )event ) :
250
+ getEventStatsForEventWithoutStateClass (event .getClass ());
251
+ }
252
+
253
+ private MutableStats getEventStatsForEventWithoutStateClass (@ Nonnull Class <? extends Debugger .Event > eventClass ) {
254
+ return eventWithoutStateClassStatsMap .compute (eventClass , (eC , mutableStats ) -> mutableStats != null ? mutableStats : new MutableStats ());
255
+ }
256
+
257
+ private MutableStats getEventStatsForEventWithStateClassByPlannerPhase (@ Nonnull Debugger .EventWithState event ) {
258
+ return eventWithStateClassStatsMapByPlannerPhase .computeIfAbsent (event .getPlannerPhase (), pP -> new LinkedHashMap <>())
259
+ .computeIfAbsent (event .getClass (), (eC ) -> new MutableStats ());
243
260
}
244
261
245
262
private MutableStats getEventStatsForPlannerRuleClass (@ Nonnull Class <? extends CascadesRule <?>> plannerRuleClass ) {
246
- return plannerRuleClassStatsMap .compute (plannerRuleClass , (eC , mutableStats ) -> mutableStats != null ? mutableStats : new MutableStats ());
263
+ return plannerRuleClassStatsMap .computeIfAbsent (plannerRuleClass , (eC ) -> new MutableStats ());
247
264
}
248
265
249
266
@ Nonnull
250
267
StatsMaps getStatsMaps () {
251
- return new StatsMaps (eventClassStatsMap , plannerRuleClassStatsMap );
268
+ return new StatsMaps (
269
+ Collections .unmodifiableMap (eventWithoutStateClassStatsMap ),
270
+ Collections .unmodifiableMap (eventWithStateClassStatsMapByPlannerPhase ),
271
+ Collections .unmodifiableMap (plannerRuleClassStatsMap ));
252
272
}
253
273
254
274
private static class MutableStats extends Stats {
0 commit comments