mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-25 06:58:39 +00:00
bug5728: manually-crafted test fix sequences must not undergo outlier filtering; fighting intermittent MongoDB causality errors
This commit is contained in:
+22
-10
@@ -154,6 +154,12 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
|
||||
|
||||
private final SensorFixMapperFactory sensorFixMapperFactory;
|
||||
|
||||
/**
|
||||
* If set to {@code true} in the constructor, fixes loaded for competitor tracks will be subject to
|
||||
* outlier removal using the {@link OutlierFilter}.
|
||||
*/
|
||||
private final boolean removeOutliersFromCompetitorTracks;
|
||||
|
||||
/**
|
||||
* This flag is used to tell the loaders/trackers whether preemptive stopping has been requested. If switched
|
||||
* to {@code true}, running loaders will stop loading fixes and return immediately.
|
||||
@@ -168,6 +174,7 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
|
||||
private AtomicBoolean willBeRemovedAfterStopping = new AtomicBoolean(false);
|
||||
|
||||
private AtomicBoolean stopRequested = new AtomicBoolean(false);
|
||||
|
||||
private final AbstractRaceChangeListener raceChangeListener = new AbstractRaceChangeListener() {
|
||||
@Override
|
||||
public void startOfTrackingChanged(TimePoint oldStartOfTracking, TimePoint newStartOfTracking) {
|
||||
@@ -196,6 +203,7 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
|
||||
deviceMappings.addRegattaLog(regattaLog);
|
||||
}
|
||||
};
|
||||
|
||||
private final FixReceivedListener<Timed> listener = new FixReceivedListener<Timed>() {
|
||||
@Override
|
||||
public Iterable<Triple<RegattaAndRaceIdentifier, Boolean, Duration>> fixReceived(DeviceIdentifier device, Timed fix, boolean returnManeuverChanges, boolean returnLiveDelay) {
|
||||
@@ -394,10 +402,11 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
|
||||
}
|
||||
|
||||
public FixLoaderAndTracker(DynamicTrackedRace trackedRace, SensorFixStore sensorFixStore,
|
||||
SensorFixMapperFactory sensorFixMapperFactory) {
|
||||
SensorFixMapperFactory sensorFixMapperFactory, boolean removeOutliersFromCompetitorTracks) {
|
||||
this.sensorFixStore = sensorFixStore;
|
||||
this.sensorFixMapperFactory = sensorFixMapperFactory;
|
||||
this.trackedRace = trackedRace;
|
||||
this.removeOutliersFromCompetitorTracks = removeOutliersFromCompetitorTracks;
|
||||
startTracking();
|
||||
}
|
||||
|
||||
@@ -561,8 +570,6 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
|
||||
/**
|
||||
* First loads the fixes into a temporary track which is then subject to outlier filtering (see
|
||||
* {@link OutlierFilter}). The fixes that make it through outlier filtering are then inserted
|
||||
* @param competitor
|
||||
* @param event
|
||||
*/
|
||||
private void loadForCompetitor(Competitor competitor, RegattaLogDeviceMappingEvent<?> event) {
|
||||
DynamicGPSFixTrack<Competitor, GPSFixMoving> track = trackedRace.getTrack(competitor);
|
||||
@@ -574,17 +581,22 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
|
||||
new DynamicGPSFixMovingTrackImpl<Competitor>(track.getTrackedItem(), track.getMillisecondsOverWhichToAverageSpeed());
|
||||
loadedFixes.suspendValidityAndMaxSpeedCaching(); // no validity nor max speed required on this track
|
||||
try {
|
||||
final DynamicGPSFixTrack<Competitor, GPSFixMoving> filteredTrack;
|
||||
sensorFixStore.<GPSFixMoving> loadFixes(fix -> loadedFixes.add(fix, true), event.getDevice(),
|
||||
timeRangeToLoad.from(), timeRangeToLoad.to(), /* toIsInclusive */ false,
|
||||
stopCallback, progressConsumer);
|
||||
final Pair<Integer, DynamicGPSFixTrack<Competitor, GPSFixMoving>> filtered = new OutlierFilter().findAndRemoveInconsistenciesOnRawFixes(loadedFixes);
|
||||
loadedFixes.lockForRead();
|
||||
try {
|
||||
logger.info("Filtered competitor track for outliers; "+filtered.getA()+" outliers removed in track with "+Util.size(loadedFixes.getRawFixes())+" fixes");
|
||||
} finally {
|
||||
loadedFixes.unlockAfterRead();
|
||||
if (removeOutliersFromCompetitorTracks) {
|
||||
final Pair<Integer, DynamicGPSFixTrack<Competitor, GPSFixMoving>> filtered = new OutlierFilter().findAndRemoveInconsistenciesOnRawFixes(loadedFixes);
|
||||
loadedFixes.lockForRead();
|
||||
try {
|
||||
logger.info("Filtered competitor track for outliers; "+filtered.getA()+" outliers removed in track with "+Util.size(loadedFixes.getRawFixes())+" fixes");
|
||||
} finally {
|
||||
loadedFixes.unlockAfterRead();
|
||||
}
|
||||
filteredTrack = filtered.getB();
|
||||
} else {
|
||||
filteredTrack = loadedFixes;
|
||||
}
|
||||
final DynamicGPSFixTrack<Competitor, GPSFixMoving> filteredTrack = filtered.getB();
|
||||
track.suspendValidityAndMaxSpeedCaching();
|
||||
filteredTrack.lockForRead();
|
||||
try {
|
||||
|
||||
+1
-1
@@ -128,7 +128,7 @@ public class RaceLogFixTrackerManager implements TrackingDataLoader {
|
||||
private synchronized void startTrackerIfNotAlreadyStarted() {
|
||||
if (tracker == null) {
|
||||
logger.fine("Starting fix tracker for TrackedRace: " + trackedRace.getRaceIdentifier());
|
||||
tracker = new FixLoaderAndTracker(trackedRace, sensorFixStore, sensorFixMapperFactory);
|
||||
tracker = new FixLoaderAndTracker(trackedRace, sensorFixStore, sensorFixMapperFactory, /* removeOutliersFromCompetitorTracks */ true);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user