2323import com .apple .foundationdb .record .RecordCoreException ;
2424import com .apple .foundationdb .record .logging .KeyValueLogMessage ;
2525import com .apple .foundationdb .record .query .plan .cascades .CascadesRule ;
26+ import com .apple .foundationdb .record .query .plan .cascades .PlannerPhase ;
2627import com .apple .foundationdb .record .query .plan .cascades .debug .eventprotos .PEvent ;
2728import com .apple .foundationdb .record .util .pair .Pair ;
2829import com .google .common .base .Verify ;
29- import com .google .common .collect .ImmutableMap ;
3030import com .google .common .collect .Lists ;
3131import com .google .common .collect .Maps ;
3232import org .slf4j .Logger ;
3535import javax .annotation .Nonnull ;
3636import javax .annotation .Nullable ;
3737import java .util .ArrayDeque ;
38+ import java .util .Collections ;
3839import java .util .Deque ;
3940import java .util .Iterator ;
41+ import java .util .LinkedHashMap ;
4042import java .util .List ;
41- import java .util .Locale ;
4243import java .util .Map ;
4344import java .util .Objects ;
44- import java .util .concurrent .TimeUnit ;
4545
4646public class EventState {
4747 @ Nonnull
4848 private static final Logger logger = LoggerFactory .getLogger (EventState .class );
4949
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 ;
5454
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 ;
5657
57- @ Nonnull private final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
58+ @ Nonnull protected final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
5859
59- @ Nonnull private final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
60+ @ Nonnull protected final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
6061
6162 protected int currentTick ;
6263 protected final long startTs ;
@@ -71,7 +72,8 @@ public static EventState copyOf(final EventState source) {
7172 source .events == null ? null : Lists .newArrayList (source .events ),
7273 source .eventProtos == null ? null : Lists .newArrayList (source .eventProtos ),
7374 source .prerecordedEventProtoIterable ,
74- Maps .newLinkedHashMap (source .eventClassStatsMap ),
75+ Maps .newLinkedHashMap (source .eventWithoutStateClassStatsMap ),
76+ Maps .newEnumMap (source .eventWithStateClassStatsMapByPlannerPhase ),
7577 Maps .newLinkedHashMap (source .plannerRuleClassStatsMap ),
7678 new ArrayDeque <>(source .eventProfilingStack ),
7779 source .getCurrentTick (),
@@ -85,28 +87,31 @@ protected EventState(final boolean isRecordEvents, final boolean isRecordEventPr
8587 isRecordEvents ? Lists .newArrayList () : null ,
8688 prerecordedEventProtoIterable ,
8789 Maps .newLinkedHashMap (),
90+ Maps .newEnumMap (PlannerPhase .class ),
8891 Maps .newLinkedHashMap (),
8992 new ArrayDeque <>(),
9093 -1 ,
9194 System .nanoTime ());
9295 }
9396
9497 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 ) {
103107
104108 this .events = events ;
105109 this .eventProtos = eventProtos ;
106110 this .prerecordedEventProtoIterable = prerecordedEventProtoIterable ;
107111 this .prerecordedEventProtoIterator = prerecordedEventProtoIterable == null
108112 ? null : prerecordedEventProtoIterable .iterator ();
109- this .eventClassStatsMap = eventClassStatsMap ;
113+ this .eventWithoutStateClassStatsMap = eventWithoutStateClassStatsMap ;
114+ this .eventWithStateClassStatsMapByPlannerPhase = eventWithStateClassStatsMapByPlannerPhase ;
110115 this .plannerRuleClassStatsMap = plannerRuleClassStatsMap ;
111116 this .eventProfilingStack = eventProfilingStack ;
112117 this .currentTick = currentTick ;
@@ -178,7 +183,7 @@ public void addCurrentEvent(@Nonnull final Debugger.Event event) {
178183 final long totalTime = currentTsInNs - eventDurations .getStartTsInNs ();
179184 final long ownTime = totalTime - eventDurations .getAdjustmentForOwnTimeInNs ();
180185
181- final MutableStats forEventClass = getEventStatsForEventClass ( currentEventClass );
186+ final MutableStats forEventClass = getEventStatsForEvent ( event );
182187 forEventClass .increaseTotalTimeInNs (totalTime );
183188 forEventClass .increaseOwnTimeInNs (ownTime );
184189 if (event instanceof Debugger .TransformRuleCallEvent ) {
@@ -228,8 +233,9 @@ private void verifyCurrentEventProto(final PEvent currentEventProto) {
228233
229234 @ SuppressWarnings ("unchecked" )
230235 private void updateCounts (@ Nonnull final Debugger .Event event ) {
231- final MutableStats forEventClass = getEventStatsForEventClass (event . getClass () );
236+ final MutableStats forEventClass = getEventStatsForEvent (event );
232237 forEventClass .increaseCount (event .getLocation (), 1L );
238+
233239 if (event instanceof Debugger .EventWithRule ) {
234240 final CascadesRule <?> rule = ((Debugger .EventWithRule )event ).getRule ();
235241 final Class <? extends CascadesRule <?>> ruleClass = (Class <? extends CascadesRule <?>>)rule .getClass ();
@@ -238,17 +244,31 @@ private void updateCounts(@Nonnull final Debugger.Event event) {
238244 }
239245 }
240246
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 ());
243260 }
244261
245262 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 ());
247264 }
248265
249266 @ Nonnull
250267 StatsMaps getStatsMaps () {
251- return new StatsMaps (eventClassStatsMap , plannerRuleClassStatsMap );
268+ return new StatsMaps (
269+ Collections .unmodifiableMap (eventWithoutStateClassStatsMap ),
270+ Collections .unmodifiableMap (eventWithStateClassStatsMapByPlannerPhase ),
271+ Collections .unmodifiableMap (plannerRuleClassStatsMap ));
252272 }
253273
254274 private static class MutableStats extends Stats {
0 commit comments