mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-10-05 11:53:53 +00:00
fixing bug 815 by adding synchronization for raceTrackersByRegatta
This commit is contained in:
1 parent
0d35aa348c
commit
a8081f71fc
2 files changed
+64
-50
No files matched your search
@@ -22,9 +22,9 @@
|
||||
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Xmx6000m -Djava.util.logging.config.file=${project_loc:com.sap.sailing.server}/../target/configuration/logging_debug.properties -Dhttp.proxyHost=proxy.wdf.sap.corp -Dhttp.proxyPort=8080 -Dexpedition.udp.port=2010 -Djetty.home=${project_loc:com.sap.sailing.server}/../target/configuration/jetty -Dkiwo.results=${project_loc:com.sap.sailing.kiworesultimport.test}/resources"/>
|
||||
<stringAttribute key="pde.version" value="3.3"/>
|
||||
<booleanAttribute key="show_selected_only" value="false"/>
|
||||
<stringAttribute key="target_bundles" value="javax.servlet@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.client@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.nested@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.servlets@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,slf4j.api@default:default,slf4j.jdk14@default:false"/>
|
||||
<stringAttribute key="target_bundles" value="javax.servlet@default:default,jcl.over.slf4j@default:default,org.apache.activemq.activeio-core@default:default,org.apache.activemq.activemq-core@default:default,org.apache.activemq.kahadb@default:default,org.apache.geronimo.specs.geronimo-annotation_1.0_spec@default:default,org.apache.geronimo.specs.geronimo-j2ee-management_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jms_1.1_spec@default:default,org.apache.geronimo.specs.geronimo-jta_1.0.1B_spec@default:default,org.eclipse.equinox.transforms.hook@default:false,org.eclipse.jetty.client@default:default,org.eclipse.jetty.continuation@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jmx@default:default,org.eclipse.jetty.nested@default:default,org.eclipse.jetty.osgi.boot@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.servlets@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,slf4j.api@default:default,slf4j.jdk14@default:false"/>
|
||||
<booleanAttribute key="tracing" value="false"/>
|
||||
<booleanAttribute key="useCustomFeatures" value="false"/>
|
||||
<booleanAttribute key="useDefaultConfigArea" value="true"/>
|
||||
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.server@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
|
||||
<stringAttribute key="workspace_bundles" value="com.google.gwt.osgi@default:default,com.googlecode.java-diff-utils@default:default,com.mongodb.driver@default:default,com.sap.sailing.declination@default:default,com.sap.sailing.domain.common@default:default,com.sap.sailing.domain.persistence@default:default,com.sap.sailing.domain.swisstimingadapter.persistence@default:default,com.sap.sailing.domain.swisstimingadapter@default:default,com.sap.sailing.domain.tractracadapter.persistence@default:default,com.sap.sailing.domain.tractracadapter@default:default,com.sap.sailing.domain@default:default,com.sap.sailing.expeditionconnector@default:default,com.sap.sailing.geocoding@default:default,com.sap.sailing.gwt.ui@default:default,com.sap.sailing.kiworesultimport@default:default,com.sap.sailing.mongodb@default:default,com.sap.sailing.operationaltransformation@default:default,com.sap.sailing.server.replication@default:default,com.sap.sailing.server@default:default,com.sap.sailing.udpconnector@default:default,com.sap.sailing.www.events@default:default,com.sap.sailing.www@default:default,com.sap.sailing.xcelsiusadapter@default:default,com.tractrac.clientmodule@default:default,org.json.simple@default:default,org.moxieapps.gwt.highcharts@default:default"/>
|
||||
</launchConfiguration>
|
||||
+62
-48
@@ -491,14 +491,16 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
|
||||
|
||||
@Override
|
||||
public boolean isRaceBeingTracked(RaceDefinition r) {
|
||||
for (Set<RaceTracker> trackers : raceTrackersByRegatta.values()) {
|
||||
for (RaceTracker tracker : trackers) {
|
||||
if (tracker.getRaces() != null && tracker.getRaces().contains(r)) {
|
||||
return true;
|
||||
synchronized (raceTrackersByRegatta) {
|
||||
for (Set<RaceTracker> trackers : raceTrackersByRegatta.values()) {
|
||||
for (RaceTracker tracker : trackers) {
|
||||
if (tracker.getRaces() != null && tracker.getRaces().contains(r)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -624,12 +626,14 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
|
||||
assert tracker.getRegatta() == regatta;
|
||||
}
|
||||
raceTrackersByID.put(params.getTrackerID(), tracker);
|
||||
Set<RaceTracker> trackers = raceTrackersByRegatta.get(tracker.getRegatta());
|
||||
if (trackers == null) {
|
||||
trackers = new HashSet<RaceTracker>();
|
||||
raceTrackersByRegatta.put(tracker.getRegatta(), trackers);
|
||||
synchronized (raceTrackersByRegatta) {
|
||||
Set<RaceTracker> trackers = raceTrackersByRegatta.get(tracker.getRegatta());
|
||||
if (trackers == null) {
|
||||
trackers = new HashSet<RaceTracker>();
|
||||
raceTrackersByRegatta.put(tracker.getRegatta(), trackers);
|
||||
}
|
||||
trackers.add(tracker);
|
||||
}
|
||||
trackers.add(tracker);
|
||||
// TODO we assume here that the event name is unique which necessitates adding the boat class name to it in EventImpl constructor
|
||||
String regattaName = tracker.getRegatta().getName();
|
||||
Regatta regattaWithName = regattasByName.get(regattaName);
|
||||
@@ -878,14 +882,16 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
|
||||
@Override
|
||||
public synchronized void stopTracking(Regatta regatta) throws MalformedURLException, IOException, InterruptedException {
|
||||
if (raceTrackersByRegatta.containsKey(regatta)) {
|
||||
for (RaceTracker raceTracker : raceTrackersByRegatta.get(regatta)) {
|
||||
for (RaceDefinition race : raceTracker.getRaces()) {
|
||||
stopTrackingWind(regatta, race);
|
||||
synchronized (raceTrackersByRegatta) {
|
||||
for (RaceTracker raceTracker : raceTrackersByRegatta.get(regatta)) {
|
||||
for (RaceDefinition race : raceTracker.getRaces()) {
|
||||
stopTrackingWind(regatta, race);
|
||||
}
|
||||
raceTracker.stop(); // this also removes the TrackedRace from trackedRegatta
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
}
|
||||
raceTracker.stop(); // this also removes the TrackedRace from trackedRegatta
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
raceTrackersByRegatta.remove(regatta);
|
||||
}
|
||||
raceTrackersByRegatta.remove(regatta);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -926,9 +932,12 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
|
||||
Regatta regatta = tracker.getRegatta();
|
||||
logger.log(Level.SEVERE, "RaceDefinition for a race in regatta "+regatta.getName()+" not obtained within "+
|
||||
timeoutInMilliseconds+"ms. Aborting tracker for this race.");
|
||||
Set<RaceTracker> trackersForRegatta = raceTrackersByRegatta.get(regatta);
|
||||
if (trackersForRegatta != null) {
|
||||
trackersForRegatta.remove(tracker);
|
||||
Set<RaceTracker> trackersForRegatta;
|
||||
synchronized (raceTrackersByRegatta) {
|
||||
trackersForRegatta = raceTrackersByRegatta.get(regatta);
|
||||
if (trackersForRegatta != null) {
|
||||
trackersForRegatta.remove(tracker);
|
||||
}
|
||||
}
|
||||
tracker.stop();
|
||||
raceTrackersByID.remove(tracker.getID());
|
||||
@@ -949,15 +958,18 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
|
||||
public synchronized void stopTracking(Regatta regatta, RaceDefinition race) throws MalformedURLException, IOException, InterruptedException {
|
||||
logger.info("Stopping tracking for "+race+"...");
|
||||
if (raceTrackersByRegatta.containsKey(regatta)) {
|
||||
Iterator<RaceTracker> trackerIter = raceTrackersByRegatta.get(regatta).iterator();
|
||||
while (trackerIter.hasNext()) {
|
||||
RaceTracker raceTracker = trackerIter.next();
|
||||
if (raceTracker.getRaces() != null && raceTracker.getRaces().contains(race)) {
|
||||
logger.info("Found tracker to stop for races "+raceTracker.getRaces());
|
||||
raceTracker.stop(); // this also removes the TrackedRace from trackedRegatta
|
||||
// do not remove the tracker from raceTrackersByRegatta, because it should still exist there, but with the state "non-tracked"
|
||||
trackerIter.remove();
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
synchronized (raceTrackersByRegatta) {
|
||||
Iterator<RaceTracker> trackerIter = raceTrackersByRegatta.get(regatta).iterator();
|
||||
while (trackerIter.hasNext()) {
|
||||
RaceTracker raceTracker = trackerIter.next();
|
||||
if (raceTracker.getRaces() != null && raceTracker.getRaces().contains(race)) {
|
||||
logger.info("Found tracker to stop for races " + raceTracker.getRaces());
|
||||
raceTracker.stop(); // this also removes the TrackedRace from trackedRegatta
|
||||
// do not remove the tracker from raceTrackersByRegatta, because it should still exist there,
|
||||
// but with the state "non-tracked"
|
||||
trackerIter.remove();
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
@@ -1043,27 +1055,29 @@ public class RacingEventServiceImpl implements RacingEventService, RegattaListen
|
||||
*/
|
||||
private void stopAllTrackersForWhichRaceIsLastReachable(Regatta regatta, RaceDefinition race)
|
||||
throws MalformedURLException, IOException, InterruptedException {
|
||||
if (raceTrackersByRegatta.containsKey(regatta)) {
|
||||
Iterator<RaceTracker> trackerIter = raceTrackersByRegatta.get(regatta).iterator();
|
||||
while (trackerIter.hasNext()) {
|
||||
RaceTracker raceTracker = trackerIter.next();
|
||||
if (raceTracker.getRaces() != null && raceTracker.getRaces().contains(race)) {
|
||||
boolean foundReachableRace = false;
|
||||
for (RaceDefinition raceTrackedByTracker : raceTracker.getRaces()) {
|
||||
if (raceTrackedByTracker != race && isReachable(regatta, raceTrackedByTracker)) {
|
||||
foundReachableRace = true;
|
||||
break;
|
||||
synchronized (raceTrackersByRegatta) {
|
||||
if (raceTrackersByRegatta.containsKey(regatta)) {
|
||||
Iterator<RaceTracker> trackerIter = raceTrackersByRegatta.get(regatta).iterator();
|
||||
while (trackerIter.hasNext()) {
|
||||
RaceTracker raceTracker = trackerIter.next();
|
||||
if (raceTracker.getRaces() != null && raceTracker.getRaces().contains(race)) {
|
||||
boolean foundReachableRace = false;
|
||||
for (RaceDefinition raceTrackedByTracker : raceTracker.getRaces()) {
|
||||
if (raceTrackedByTracker != race && isReachable(regatta, raceTrackedByTracker)) {
|
||||
foundReachableRace = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!foundReachableRace) {
|
||||
// firstly stop the tracker
|
||||
raceTracker.stop();
|
||||
// remove it from the raceTrackers by Regatta
|
||||
trackerIter.remove();
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
// if the last tracked race was removed, remove the entire regatta
|
||||
if (raceTrackersByRegatta.get(regatta).isEmpty()) {
|
||||
stopTracking(regatta);
|
||||
if (!foundReachableRace) {
|
||||
// firstly stop the tracker
|
||||
raceTracker.stop();
|
||||
// remove it from the raceTrackers by Regatta
|
||||
trackerIter.remove();
|
||||
raceTrackersByID.remove(raceTracker.getID());
|
||||
// if the last tracked race was removed, remove the entire regatta
|
||||
if (raceTrackersByRegatta.get(regatta).isEmpty()) {
|
||||
stopTracking(regatta);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user