bug5728: manually-crafted test fix sequences must not undergo outlier filtering; fighting intermittent MongoDB causality errors

This commit is contained in:
Axel Uhl
2022-08-11 02:11:56 +02:00
parent 7e986ec1c5
commit 947de37542
11 changed files with 60 additions and 27 deletions
@@ -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 {
@@ -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);
}
}