diff --git a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/engine/scheduler/AdpDBQueryScheduler.java b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/engine/scheduler/AdpDBQueryScheduler.java index fd785d00c..15036ca9e 100644 --- a/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/engine/scheduler/AdpDBQueryScheduler.java +++ b/Exareme-Docker/src/exareme/exareme-master/src/main/java/madgik/exareme/master/engine/scheduler/AdpDBQueryScheduler.java @@ -29,6 +29,7 @@ import madgik.exareme.utils.eventProcessor.EventProcessor; import java.rmi.RemoteException; +import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** diff --git a/Exareme-Docker/src/exareme/exareme-worker/src/main/java/madgik/exareme/worker/art/executionEngine/dynamicExecutionEngine/DynamicPlanManager.java b/Exareme-Docker/src/exareme/exareme-worker/src/main/java/madgik/exareme/worker/art/executionEngine/dynamicExecutionEngine/DynamicPlanManager.java index bf5ca2615..fd2bf4c36 100644 --- a/Exareme-Docker/src/exareme/exareme-worker/src/main/java/madgik/exareme/worker/art/executionEngine/dynamicExecutionEngine/DynamicPlanManager.java +++ b/Exareme-Docker/src/exareme/exareme-worker/src/main/java/madgik/exareme/worker/art/executionEngine/dynamicExecutionEngine/DynamicPlanManager.java @@ -25,6 +25,8 @@ import java.util.Map; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; +import java.util.concurrent.locks.ReentrantLock; /** * @author herald @@ -34,6 +36,7 @@ public class DynamicPlanManager implements PlanSessionManagerInterface { private final HashMap elasticTreeSessions = new HashMap<>(); private EventProcessor eventProcessor = null; private long sessionCount = 0; + ReentrantLock sessionCountLock = new ReentrantLock(); private long containerSessionCount = 0; /* ROOT sessions */ private Map schedulerMap = null; @@ -71,11 +74,13 @@ public void setExecutionEngine(ExecutionEngine executionEngine) { @Override public void createGlobalScheduler() throws RemoteException { + sessionCountLock.lock(); PlanSessionID sessionID = new PlanSessionID(sessionCount); PlanSessionReportID reportID = new PlanSessionReportID(sessionCount); - reportID.reportManagerProxy = executionEngine.getPlanSessionReportManagerProxy(reportID); sessionCount++; + sessionCountLock.unlock(); + reportID.reportManagerProxy = executionEngine.getPlanSessionReportManagerProxy(reportID); PlanEventScheduler eventScheduler = new PlanEventScheduler(sessionID, reportID, eventProcessor, this, resourceManager, registryProxy); @@ -86,12 +91,13 @@ public void createGlobalScheduler() throws RemoteException { @Override public PlanSessionID createNewSession() throws RemoteException { - // TODO Is this thread safe? + sessionCountLock.lock(); PlanSessionID sessionID = new PlanSessionID(sessionCount); PlanSessionReportID reportID = new PlanSessionReportID(sessionCount); - reportID.reportManagerProxy = executionEngine.getPlanSessionReportManagerProxy(reportID); sessionCount++; + sessionCountLock.unlock(); + reportID.reportManagerProxy = executionEngine.getPlanSessionReportManagerProxy(reportID); PlanEventScheduler eventScheduler = new PlanEventScheduler(sessionID, reportID, eventProcessor, this, resourceManager, registryProxy);