mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-09 13:50:57 +00:00
Fixed map entry deletion for data import lock
This commit is contained in:
1 parent
8e01b10e6f
commit
7bb2b2c2c7
7 files changed
+63
-17
No files matched your search
+1
@@ -3520,6 +3520,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
|
||||
throw new RuntimeException(e);
|
||||
} finally {
|
||||
// close the connection, set all objects to null
|
||||
getService().setDataImportDeleteProgressFromMapTimerWithReplication(importOperationId);
|
||||
connection.disconnect();
|
||||
connection = null;
|
||||
long timeToImport = System.currentTimeMillis() - startTime;
|
||||
|
||||
@@ -59,6 +59,7 @@ import com.sap.sailing.domain.tracking.TrackedRegattaRegistry;
|
||||
import com.sap.sailing.domain.tracking.TrackerManager;
|
||||
import com.sap.sailing.domain.tracking.WindStore;
|
||||
import com.sap.sailing.server.masterdata.DataImportLockWithProgress;
|
||||
import com.sap.sailing.server.operationaltransformation.ImportMasterDataOperation;
|
||||
|
||||
/**
|
||||
* An OSGi service that can be used to track boat races using a TracTrac connector that pushes
|
||||
@@ -524,4 +525,10 @@ public interface RacingEventService extends TrackedRegattaRegistry, RegattaFetch
|
||||
|
||||
void setDataImportFailedWithoutReplication(UUID importOperationId, String errorMessage);
|
||||
|
||||
void setDataImportDeleteProgressFromMapTimerWithReplication(UUID importOperationId);
|
||||
|
||||
void setDataImportDeleteProgressFromMapTimerWithoutReplication(UUID importOperationId);
|
||||
|
||||
void replicateDataImportOperation(ImportMasterDataOperation op);
|
||||
|
||||
}
|
||||
+18
@@ -134,6 +134,7 @@ import com.sap.sailing.server.operationaltransformation.CreateOrUpdateDataImport
|
||||
import com.sap.sailing.server.operationaltransformation.CreateOrUpdateDeviceConfiguration;
|
||||
import com.sap.sailing.server.operationaltransformation.CreateTrackedRace;
|
||||
import com.sap.sailing.server.operationaltransformation.DataImportFailed;
|
||||
import com.sap.sailing.server.operationaltransformation.ImportMasterDataOperation;
|
||||
import com.sap.sailing.server.operationaltransformation.RecordCompetitorGPSFix;
|
||||
import com.sap.sailing.server.operationaltransformation.RecordMarkGPSFix;
|
||||
import com.sap.sailing.server.operationaltransformation.RecordWindFix;
|
||||
@@ -142,6 +143,7 @@ import com.sap.sailing.server.operationaltransformation.RemoveEvent;
|
||||
import com.sap.sailing.server.operationaltransformation.RemoveMediaTrackOperation;
|
||||
import com.sap.sailing.server.operationaltransformation.RemoveWindFix;
|
||||
import com.sap.sailing.server.operationaltransformation.RenameEvent;
|
||||
import com.sap.sailing.server.operationaltransformation.SetDataImportDeleteProgressFromMapTimer;
|
||||
import com.sap.sailing.server.operationaltransformation.TrackRegatta;
|
||||
import com.sap.sailing.server.operationaltransformation.UpdateEvent;
|
||||
import com.sap.sailing.server.operationaltransformation.UpdateMarkPassings;
|
||||
@@ -2292,4 +2294,20 @@ public class RacingEventServiceImpl implements RacingEventServiceWithTestSupport
|
||||
replicate(new DataImportFailed(importOperationId, errorMessage));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDataImportDeleteProgressFromMapTimerWithReplication(UUID importOperationId) {
|
||||
setDataImportDeleteProgressFromMapTimerWithoutReplication(importOperationId);
|
||||
replicate(new SetDataImportDeleteProgressFromMapTimer(importOperationId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDataImportDeleteProgressFromMapTimerWithoutReplication(UUID importOperationId) {
|
||||
dataImportLock.setDeleteFromMapTimer(importOperationId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void replicateDataImportOperation(ImportMasterDataOperation op) {
|
||||
replicate(op);
|
||||
}
|
||||
|
||||
}
|
||||
+2
-16
@@ -18,8 +18,6 @@ public class DataImportLockWithProgress extends ReentrantLock {
|
||||
|
||||
private static final long serialVersionUID = -3527221613483691340L;
|
||||
|
||||
private DataImportProgress currentProgress;
|
||||
|
||||
private final Map<UUID, DataImportProgress> progressPerId;
|
||||
|
||||
private final ReentrantReadWriteLock mapLock;
|
||||
@@ -30,30 +28,18 @@ public class DataImportLockWithProgress extends ReentrantLock {
|
||||
mapLock = new ReentrantReadWriteLock();
|
||||
}
|
||||
|
||||
public void lock(UUID operationId) {
|
||||
super.lock();
|
||||
currentProgress = progressPerId.get(operationId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unlock() {
|
||||
setDeleteFromMapTimer(currentProgress);
|
||||
currentProgress = null;
|
||||
super.unlock();
|
||||
}
|
||||
|
||||
/**
|
||||
* This timer ensures that operation results are deleted from memory after some time. Just deleting the entry when
|
||||
* the operation is done does not ensure that the entry is deleted from every replica, since the last progress
|
||||
* request will only reach one server.
|
||||
*/
|
||||
private void setDeleteFromMapTimer(final DataImportProgress progressToDelete) {
|
||||
public void setDeleteFromMapTimer(final UUID progressIDToDelete) {
|
||||
TimerTask deleteTask = new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
mapLock.writeLock().lock();
|
||||
try {
|
||||
progressPerId.remove(progressToDelete.getOperationId());
|
||||
progressPerId.remove(progressIDToDelete);
|
||||
} finally {
|
||||
mapLock.writeLock().unlock();
|
||||
}
|
||||
|
||||
+1
@@ -26,6 +26,7 @@ public class MasterDataImporter {
|
||||
creationCount,
|
||||
baseDomainFactory);
|
||||
creationCount = racingEventService.apply(op);
|
||||
racingEventService.replicateDataImportOperation(op);
|
||||
racingEventService.mediaTracksImported(topLevelMasterData.getAllMediaTracks(), override);
|
||||
|
||||
return creationCount;
|
||||
|
||||
+1
-1
@@ -78,7 +78,7 @@ public class ImportMasterDataOperation extends
|
||||
public MasterDataImportObjectCreationCountImpl internalApplyTo(RacingEventService toState) throws Exception {
|
||||
this.progress = toState.getDataImportLock().getProgress(importOperationId);
|
||||
progress.setNameOfCurrentSubProgress("Waiting for other data import operations to finish");
|
||||
toState.getDataImportLock().lock(importOperationId);
|
||||
toState.getDataImportLock().lock();
|
||||
try {
|
||||
progress.setNameOfCurrentSubProgress("Importing leaderboard groups");
|
||||
progress.setCurrentSubProgressPct(0);
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
package com.sap.sailing.server.operationaltransformation;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
import com.sap.sailing.server.RacingEventService;
|
||||
import com.sap.sailing.server.RacingEventServiceOperation;
|
||||
|
||||
public class SetDataImportDeleteProgressFromMapTimer extends AbstractRacingEventServiceOperation<Void> {
|
||||
|
||||
private static final long serialVersionUID = 2134445141548315303L;
|
||||
private UUID importOperationId;
|
||||
|
||||
public SetDataImportDeleteProgressFromMapTimer(UUID importOperationId) {
|
||||
this.importOperationId = importOperationId;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void internalApplyTo(RacingEventService toState) throws Exception {
|
||||
toState.setDataImportDeleteProgressFromMapTimerWithoutReplication(importOperationId);
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RacingEventServiceOperation<?> transformClientOp(RacingEventServiceOperation<?> serverOp) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RacingEventServiceOperation<?> transformServerOp(RacingEventServiceOperation<?> clientOp) {
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user