diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java index b492edf0d0f..d5df4a7a074 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/racelog/tracking/impl/MongoSensorFixStoreImpl.java @@ -73,6 +73,12 @@ public class MongoSensorFixStoreImpl extends MongoFixHandler implements MongoSen */ private final WriteConcern writeConcern; + /** + * The read concern to use for reading/loading fixes and metadata. Tests can use this, e.g., to work with + * {@link ReadConcern#MAJORITY} in order to ensure they can read their own writes. + */ + private final ReadConcern readConcern; + /** * Lock object to be used when accessing {@link #listeners}. */ @@ -94,6 +100,7 @@ public class MongoSensorFixStoreImpl extends MongoFixHandler implements MongoSen fixesCollection = mongoOF.getGPSFixCollection(clientSession); metadataCollection = new MetadataCollection(mongoOF, fixServiceFinder, deviceServiceFinder, readConcern, writeConcern, metadataCollectionClientSession); this.writeConcern = writeConcern; + this.readConcern = readConcern; this.clientSession = clientSession; } @@ -118,16 +125,14 @@ public class MongoSensorFixStoreImpl extends MongoFixHandler implements MongoSen @Override public void loadFixes(Consumer consumer, DeviceIdentifier device, TimePoint from, TimePoint to, boolean inclusive) throws NoCorrespondingServiceRegisteredException, TransformationException { - loadFixes(consumer, device, from, to, inclusive, () -> false, (d) -> { - }); + loadFixes(consumer, device, from, to, inclusive, () -> false, /* progress consumer */ d -> {}); } @Override public void loadFixes(Consumer consumer, DeviceIdentifier device, TimePoint from, TimePoint to, boolean inclusive, BooleanSupplier isPreemptiveStopped, Consumer progressConsumer) throws NoCorrespondingServiceRegisteredException, TransformationException { - loadFixes(consumer, device, from, to, inclusive, isPreemptiveStopped, progressConsumer, - true, false); + loadFixes(consumer, device, from, to, inclusive, isPreemptiveStopped, progressConsumer, true, false); } private boolean loadFixes(Consumer consumer, DeviceIdentifier device, TimePoint from, @@ -147,7 +152,8 @@ public class MongoSensorFixStoreImpl extends MongoFixHandler implements MongoSen filters.add(Filters.lt(FieldNames.TIME_AS_MILLIS.name(), loadFixesTo.asMillis())); } Bson query = Filters.and(filters); - FindIterable result = clientSession == null ? fixesCollection.find(query) : fixesCollection.find(clientSession, query); + final MongoCollection fixesCollectionWithReadConcern = fixesCollection.withReadConcern(readConcern); + FindIterable result = clientSession == null ? fixesCollectionWithReadConcern.find(query) : fixesCollectionWithReadConcern.find(clientSession, query); result.batchSize(100000).sort(new Document(FieldNames.TIME_AS_MILLIS.name(), ascending ? 1 : -1)); if (onlyOneResult) { result.limit(1); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java index 585aaa15ca1..92fa3c107fa 100644 --- a/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter.test/src/com/sap/sailing/domain/racelogtracking/test/impl/SensorFixStoreTest.java @@ -16,6 +16,7 @@ import org.mockito.Mockito; import com.mongodb.MongoException; import com.mongodb.ReadConcern; import com.mongodb.WriteConcern; +import com.mongodb.client.ClientSession; import com.mongodb.client.MongoDatabase; import com.sap.sailing.domain.common.DeviceIdentifier; import com.sap.sailing.domain.common.sensordata.BravoSensorDataMetadata; @@ -33,6 +34,7 @@ import com.sap.sse.common.Timed; import com.sap.sse.common.TransformationException; import com.sap.sse.common.impl.MillisecondsTimePoint; import com.sap.sse.common.impl.TimeRangeImpl; +import com.sap.sse.mongodb.MongoDBService; public class SensorFixStoreTest { private static final long FIX_TIMESTAMP = 110; @@ -43,9 +45,13 @@ public class SensorFixStoreTest { protected final DeviceIdentifier device = new SmartphoneImeiIdentifier("a"); protected final DeviceIdentifier device2 = new SmartphoneImeiIdentifier("b"); protected SensorFixStore store; + private ClientSession clientSession; + private ClientSession metadataCollectionClientSession; @Before public void setUp() throws UnknownHostException, MongoException { + clientSession = MongoDBService.INSTANCE.startCausallyConsistentSession(); + metadataCollectionClientSession = MongoDBService.INSTANCE.startCausallyConsistentSession(); dropPersistedData(); newStore(); } @@ -53,7 +59,7 @@ public class SensorFixStoreTest { private void newStore() { store = new MongoSensorFixStoreImpl(PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory(), PersistenceFactory.INSTANCE.getDefaultDomainObjectFactory(), serviceFinderFactory, ReadConcern.MAJORITY, - WriteConcern.MAJORITY, /* clientSession */ null, /* metadataCollectionClientSession */ null); + WriteConcern.MAJORITY, clientSession, metadataCollectionClientSession); } @After @@ -63,8 +69,8 @@ public class SensorFixStoreTest { private void dropPersistedData() { MongoDatabase db = PersistenceFactory.INSTANCE.getDefaultMongoObjectFactory().getDatabase(); - db.getCollection(CollectionNames.GPS_FIXES.name()).drop(); - db.getCollection(CollectionNames.GPS_FIXES_METADATA.name()).drop(); + db.getCollection(CollectionNames.GPS_FIXES.name()).withWriteConcern(WriteConcern.MAJORITY).drop(clientSession); + db.getCollection(CollectionNames.GPS_FIXES_METADATA.name()).withWriteConcern(WriteConcern.MAJORITY).drop(metadataCollectionClientSession); } @Test @@ -87,7 +93,6 @@ public class SensorFixStoreTest { @Test public void testFixDataIsPreservedOnStore() throws Exception { DoubleVectorFix fix = addBravoFix(device, FIX_TIMESTAMP, FIX_RIDE_HEIGHT); - verifySingleFix(fix, 100, 200, device, true); }