avoid duplicate leaderboard traversal for statistics collection

This commit is contained in:
Axel Uhl
2015-06-19 12:41:50 +02:00
parent 35e88c6679
commit 67fcf23368
2 changed files with 70 additions and 64 deletions
@@ -2,9 +2,11 @@ package com.sap.sailing.gwt.ui.shared.dispatch.event;
import java.util.Iterator;
import java.util.NavigableSet;
import java.util.Set;
import java.util.UUID;
import com.google.gwt.core.shared.GwtIncompatible;
import com.google.gwt.dev.util.collect.HashSet;
import com.sap.sailing.domain.base.Competitor;
import com.sap.sailing.domain.base.Event;
import com.sap.sailing.domain.base.Mark;
@@ -55,77 +57,81 @@ public class GetEventStatisticsAction implements Action<ResultWithTTL<EventStati
Distance totalDistanceTraveled = Distance.NULL;
Triple<Competitor, Speed, TimePoint> maxSpeed = null;
final TimePoint now = MillisecondsTimePoint.now();
final Set<Leaderboard> leaderboards = new HashSet<>();
for (LeaderboardGroup lg : event.getLeaderboardGroups()) {
for (Leaderboard leaderboard : lg.getLeaderboards()) {
competitors += HomeServiceUtil.calculateCompetitorsCount(leaderboard);
races += HomeServiceUtil.calculateRaceCount(leaderboard);
trackedRaces += HomeServiceUtil.calculateTrackedRaceCount(leaderboard);
regattas++;
String disableStats = System.getenv("DISABLE_STATS");
if (disableStats == null || "false".equals(disableStats)) {
for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) {
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
competitorTrack.lockForRead();
leaderboards.add(leaderboard);
}
}
for (Leaderboard leaderboard : leaderboards) {
competitors += HomeServiceUtil.calculateCompetitorsCount(leaderboard);
races += HomeServiceUtil.calculateRaceCount(leaderboard);
trackedRaces += HomeServiceUtil.calculateTrackedRaceCount(leaderboard);
regattas++;
String disableStats = System.getenv("DISABLE_STATS");
if (disableStats == null || "false".equals(disableStats)) {
for (TrackedRace trackedRace : leaderboard.getTrackedRaces()) {
for (Competitor competitor : trackedRace.getRace().getCompetitors()) {
GPSFixTrack<Competitor, GPSFixMoving> competitorTrack = trackedRace.getTrack(competitor);
competitorTrack.lockForRead();
try {
numberOfGPSFixes += Util.size(competitorTrack.getRawFixes());
} finally {
competitorTrack.unlockAfterRead();
}
if (trackedRace.hasStarted(now)) {
final NavigableSet<MarkPassing> competitorMarkPassings = trackedRace
.getMarkPassings(competitor);
MarkPassing lastMarkPassingBeforeNow = null;
trackedRace.lockForRead(competitorMarkPassings);
try {
numberOfGPSFixes += Util.size(competitorTrack.getRawFixes());
} finally {
competitorTrack.unlockAfterRead();
}
if (trackedRace.hasStarted(now)) {
final NavigableSet<MarkPassing> competitorMarkPassings = trackedRace
.getMarkPassings(competitor);
MarkPassing lastMarkPassingBeforeNow = null;
trackedRace.lockForRead(competitorMarkPassings);
try {
MarkPassing next = null;
Iterator<MarkPassing> i = competitorMarkPassings.descendingIterator();
while (i.hasNext() && (next = i.next()).getTimePoint().after(now))
;
if (next != null) {
lastMarkPassingBeforeNow = next;
}
} finally {
trackedRace.unlockAfterRead(competitorMarkPassings);
MarkPassing next = null;
Iterator<MarkPassing> i = competitorMarkPassings.descendingIterator();
while (i.hasNext() && (next = i.next()).getTimePoint().after(now))
;
if (next != null) {
lastMarkPassingBeforeNow = next;
}
if (lastMarkPassingBeforeNow != null) {
// competitor has started and has at least one mark passing before now; compute
// distance traveled
// up to that mark passing, increasing likelihood of cache hits as compared to using
// "now" as
// the query time point
totalDistanceTraveled = totalDistanceTraveled.add(competitorTrack
.getDistanceTraveled(trackedRace.getStartOfRace(),
lastMarkPassingBeforeNow.getTimePoint()));
Pair<GPSFixMoving, Speed> competitorMaxSpeed = competitorTrack
.getMaximumSpeedOverGround(trackedRace.getStartOfRace(),
lastMarkPassingBeforeNow.getTimePoint());
if (competitorMaxSpeed != null
&& (maxSpeed == null || competitorMaxSpeed.getB()
.compareTo(maxSpeed.getB()) > 0)) {
maxSpeed = new Triple<>(competitor, competitorMaxSpeed.getB(),
competitorMaxSpeed.getA().getTimePoint());
}
} finally {
trackedRace.unlockAfterRead(competitorMarkPassings);
}
if (lastMarkPassingBeforeNow != null) {
// competitor has started and has at least one mark passing before now; compute
// distance traveled
// up to that mark passing, increasing likelihood of cache hits as compared to using
// "now" as
// the query time point
totalDistanceTraveled = totalDistanceTraveled.add(competitorTrack
.getDistanceTraveled(trackedRace.getStartOfRace(),
lastMarkPassingBeforeNow.getTimePoint()));
Pair<GPSFixMoving, Speed> competitorMaxSpeed = competitorTrack
.getMaximumSpeedOverGround(trackedRace.getStartOfRace(),
lastMarkPassingBeforeNow.getTimePoint());
if (competitorMaxSpeed != null
&& (maxSpeed == null || competitorMaxSpeed.getB()
.compareTo(maxSpeed.getB()) > 0)) {
maxSpeed = new Triple<>(competitor, competitorMaxSpeed.getB(),
competitorMaxSpeed.getA().getTimePoint());
}
}
}
for (Mark mark : trackedRace.getMarks()) {
GPSFixTrack<Mark, GPSFix> markTrack = trackedRace.getOrCreateTrack(mark);
markTrack.lockForRead();
try {
numberOfGPSFixes += Util.size(markTrack.getRawFixes());
} finally {
markTrack.unlockAfterRead();
}
}
for (Mark mark : trackedRace.getMarks()) {
GPSFixTrack<Mark, GPSFix> markTrack = trackedRace.getOrCreateTrack(mark);
markTrack.lockForRead();
try {
numberOfGPSFixes += Util.size(markTrack.getRawFixes());
} finally {
markTrack.unlockAfterRead();
}
for (WindSource windSource : trackedRace.getWindSources()) {
WindTrack windTrack = trackedRace.getOrCreateWindTrack(windSource);
windTrack.lockForRead();
try {
numberOfWindFixes += Util.size(windTrack.getRawFixes());
} finally {
windTrack.unlockAfterRead();
}
}
for (WindSource windSource : trackedRace.getWindSources()) {
WindTrack windTrack = trackedRace.getOrCreateWindTrack(windSource);
windTrack.lockForRead();
try {
numberOfWindFixes += Util.size(windTrack.getRawFixes());
} finally {
windTrack.unlockAfterRead();
}
}
}
@@ -20,7 +20,7 @@
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/sapjvm_8"/>
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console -clean"/>
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-ea -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dfile.encoding=cp1252 -Dexpedition.udp.port=2010 -Xmx6000m -XX:+UseG1GC -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -Dpersistentcompetitors.clear=false -XX:+UseMembar -Digtimi.client.id=7fcdd217e0aa16090edb4ad55b09ec43b2021090e209541fc9b7003c2a2b70c6 -Digtimi.client.secret=aa569cf4909bdc7b0e04b11873f3c4ea20687421e010fcc25b771cca9e6f3f9a -Digtimi.client.redirecturi=http://127.0.0.1:8888/igtimi/oauth/v1/authorizationcallback"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y -ea -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dfile.encoding=cp1252 -Dexpedition.udp.port=2010 -Xmx6000m -XX:+UseG1GC -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources -Dpersistentcompetitors.clear=false -XX:+UseMembar -Digtimi.client.id=7fcdd217e0aa16090edb4ad55b09ec43b2021090e209541fc9b7003c2a2b70c6 -Digtimi.client.secret=aa569cf4909bdc7b0e04b11873f3c4ea20687421e010fcc25b771cca9e6f3f9a -Digtimi.client.redirecturi=http://127.0.0.1:8888/igtimi/oauth/v1/authorizationcallback"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${workspace_loc}"/>
<stringAttribute key="pde.version" value="3.3"/>
<stringAttribute key="profilingTraceType-ALLOCATION_TRACE" value="KEY_APPLICATION_FILTER%CTX_KEY%*%CTX_ENTRY%INCREASE_COUNT%CTX_KEY%8192%CTX_ENTRY%KEY_MIN_SIZE%CTX_KEY%32%CTX_ENTRY%KEY_MAX_SIZE%CTX_KEY%65536%CTX_ENTRY%KEY_INC_LINE_NRS%CTX_KEY%true%CTX_ENTRY%KEY_SESSION_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ENABLEMENT%CTX_KEY%false%CTX_ENTRY%CLASS_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_USER_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_REQUEST_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_TENANT_FILTER%CTX_KEY%*%CTX_ENTRY%KEY_ADAPTIVE%CTX_KEY%false%CTX_ENTRY%"/>