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
4646@ SuppressWarnings ("PMD.SystemPrintln" )
4747public class EventState {
4848 @ Nonnull
4949 private static final Logger logger = LoggerFactory .getLogger (EventState .class );
5050
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 ;
5555
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 ;
5758
58- @ Nonnull private final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
59+ @ Nonnull protected final Map <Class <? extends CascadesRule <?>>, MutableStats > plannerRuleClassStatsMap ;
5960
60- @ Nonnull private final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
61+ @ Nonnull protected final Deque <Pair <Class <? extends Debugger .Event >, EventDurations >> eventProfilingStack ;
6162
6263 protected int currentTick ;
6364 protected final long startTs ;
@@ -72,7 +73,8 @@ public static EventState copyOf(final EventState source) {
7273 source .events == null ? null : Lists .newArrayList (source .events ),
7374 source .eventProtos == null ? null : Lists .newArrayList (source .eventProtos ),
7475 source .prerecordedEventProtoIterable ,
75- Maps .newLinkedHashMap (source .eventClassStatsMap ),
76+ Maps .newLinkedHashMap (source .eventWithoutStateClassStatsMap ),
77+ Maps .newEnumMap (source .eventWithStateClassStatsMapByPlannerPhase ),
7678 Maps .newLinkedHashMap (source .plannerRuleClassStatsMap ),
7779 new ArrayDeque <>(source .eventProfilingStack ),
7880 source .getCurrentTick (),
@@ -86,28 +88,31 @@ protected EventState(final boolean isRecordEvents, final boolean isRecordEventPr
8688 isRecordEvents ? Lists .newArrayList () : null ,
8789 prerecordedEventProtoIterable ,
8890 Maps .newLinkedHashMap (),
91+ Maps .newEnumMap (PlannerPhase .class ),
8992 Maps .newLinkedHashMap (),
9093 new ArrayDeque <>(),
9194 -1 ,
9295 System .nanoTime ());
9396 }
9497
9598 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 ) {
104108
105109 this .events = events ;
106110 this .eventProtos = eventProtos ;
107111 this .prerecordedEventProtoIterable = prerecordedEventProtoIterable ;
108112 this .prerecordedEventProtoIterator = prerecordedEventProtoIterable == null
109113 ? null : prerecordedEventProtoIterable .iterator ();
110- this .eventClassStatsMap = eventClassStatsMap ;
114+ this .eventWithoutStateClassStatsMap = eventWithoutStateClassStatsMap ;
115+ this .eventWithStateClassStatsMapByPlannerPhase = eventWithStateClassStatsMapByPlannerPhase ;
111116 this .plannerRuleClassStatsMap = plannerRuleClassStatsMap ;
112117 this .eventProfilingStack = eventProfilingStack ;
113118 this .currentTick = currentTick ;
@@ -179,7 +184,7 @@ public void addCurrentEvent(@Nonnull final Debugger.Event event) {
179184 final long totalTime = currentTsInNs - eventDurations .getStartTsInNs ();
180185 final long ownTime = totalTime - eventDurations .getAdjustmentForOwnTimeInNs ();
181186
182- final MutableStats forEventClass = getEventStatsForEventClass ( currentEventClass );
187+ final MutableStats forEventClass = getEventStatsForEvent ( event );
183188 forEventClass .increaseTotalTimeInNs (totalTime );
184189 forEventClass .increaseOwnTimeInNs (ownTime );
185190 if (event instanceof Debugger .TransformRuleCallEvent ) {
@@ -229,8 +234,9 @@ private void verifyCurrentEventProto(final PEvent currentEventProto) {
229234
230235 @ SuppressWarnings ("unchecked" )
231236 private void updateCounts (@ Nonnull final Debugger .Event event ) {
232- final MutableStats forEventClass = getEventStatsForEventClass (event . getClass () );
237+ final MutableStats forEventClass = getEventStatsForEvent (event );
233238 forEventClass .increaseCount (event .getLocation (), 1L );
239+
234240 if (event instanceof Debugger .EventWithRule ) {
235241 final CascadesRule <?> rule = ((Debugger .EventWithRule )event ).getRule ();
236242 final Class <? extends CascadesRule <?>> ruleClass = (Class <? extends CascadesRule <?>>)rule .getClass ();
@@ -239,17 +245,31 @@ private void updateCounts(@Nonnull final Debugger.Event event) {
239245 }
240246 }
241247
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 ());
244261 }
245262
246263 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 ());
248265 }
249266
250267 @ Nonnull
251268 StatsMaps getStatsMaps () {
252- return new StatsMaps (eventClassStatsMap , plannerRuleClassStatsMap );
269+ return new StatsMaps (
270+ Collections .unmodifiableMap (eventWithoutStateClassStatsMap ),
271+ Collections .unmodifiableMap (eventWithStateClassStatsMapByPlannerPhase ),
272+ Collections .unmodifiableMap (plannerRuleClassStatsMap ));
253273 }
254274
255275 private static class MutableStats extends Stats {
0 commit comments