Fixed map entry deletion for data import lock

This commit is contained in:
Frederik Petersen committed 2014-02-24 09:03:56 +01:00
1 parent 8e01b10e6f
commit 7bb2b2c2c7
7 files changed
+63 -17

No files matched your search

@@ -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);
}
@@ -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);
}
}
@@ -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();
}
@@ -26,6 +26,7 @@ public class MasterDataImporter {
creationCount,
baseDomainFactory);
creationCount = racingEventService.apply(op);
racingEventService.replicateDataImportOperation(op);
racingEventService.mediaTracksImported(topLevelMasterData.getAllMediaTracks(), override);
return creationCount;
@@ -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);
@@ -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;
}
}