Initial commit
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
|
||||
#include <wfr/scheduling/scheduler/justintime/JustInTimeScheduler.h>
|
||||
#include <wfr/common/wep/WorkflowExecutionPlan.h>
|
||||
#include <wfr/common/wep/AbstractWepNode.h>
|
||||
#include <wfr/common/wep/activities/AtomicWepNode.h>
|
||||
#include <wfr/common/wfs/Activity.h>
|
||||
#include <wfr/common/wfs/ActivityInstance.h>
|
||||
#include <wfr/common/wfs/AtomicActivityImplementation.h>
|
||||
#include <wfr/common/wfs/instances/AtomicActivityInstance.h>
|
||||
#include <wfr/common/wfs/templates/AtomicActivityTemplate.h>
|
||||
#include <wfr/prediction/PredictionManager.h>
|
||||
#include <wfr/common/resource/ResourceManager.h>
|
||||
#include <wfr/enactment/EnactmentEngine.h>
|
||||
#include <wfr/common/scheduling/SchedulingDecision.h>
|
||||
#include <wfr/execution/ExecutionManager.h>
|
||||
#include <wfr/WorkflowRuntime.h>
|
||||
#include <wfr/wep/utils/WepSearch.h>
|
||||
#include <iostream>
|
||||
#include <set>
|
||||
#include <queue>
|
||||
|
||||
|
||||
namespace wfr {
|
||||
namespace scheduling {
|
||||
|
||||
|
||||
void JustInTimeScheduler::_notifyWEPUpdate(SchedulerBase::WepMapEntry& wepe, std::set<wep::AtomicWepNode*> readyToExecute, std::unique_lock<std::mutex>& schedulerLock) {
|
||||
for (auto n : readyToExecute) {
|
||||
nodeQueue.insert(n);
|
||||
}
|
||||
auto resourceTypes = resourceManager.getComputingResourceTypes();
|
||||
std::vector<wep::AtomicWepNode*> scheduledQueue;
|
||||
for (auto n : nodeQueue) {
|
||||
auto& ai = n->activity.as<wfs::AtomicActivityInstance>();
|
||||
wfs::AtomicActivityImplementation* fastestImpl = nullptr;
|
||||
resource::ComputingResource* fastestRes = nullptr;
|
||||
prediction::ExecutionTimeResult fastestPred;
|
||||
for (auto restype : resourceTypes) {
|
||||
resource::ComputingResource* freeRes = nullptr;
|
||||
for (auto res : restype->getResources()) {
|
||||
if (res->getFreeSlotCount() > 0) {
|
||||
freeRes = res;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (freeRes) {
|
||||
auto& aat = ai.baseActivity.baseTemplate.as<wfs::AtomicActivityTemplate>();
|
||||
for (auto impl : aat.atomicActivityType->getImplementations()) {
|
||||
auto execPred = predictionManager.predictExecutionTime(ai, *impl, *restype);
|
||||
if (execPred.isValid()) {
|
||||
if (!fastestImpl || !fastestPred.isValid() || execPred.executionTime.getValue() < fastestPred.executionTime.getValue()) {
|
||||
fastestImpl = impl;
|
||||
fastestRes = freeRes;
|
||||
fastestPred = execPred;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (fastestImpl) {
|
||||
auto reservation = resourceManager.reserveComputingResource(fastestRes, 1);
|
||||
auto sd = std::make_shared<SchedulingDecision>(&ai, fastestImpl, wepe.wep, reservation);
|
||||
sd->setPrediction(fastestPred);
|
||||
ai.setInstanceStatus(wfs::ActivityInstanceStatus::Scheduled);
|
||||
scheduledQueue.push_back(n);
|
||||
executeSchedulingDecision(wepe, sd, schedulerLock);
|
||||
} else {
|
||||
//throw exception::wfr_fatal_error("JustInTimeScheduler could not find a suitable implementation.");
|
||||
}
|
||||
}
|
||||
for (auto n : scheduledQueue) {
|
||||
nodeQueue.erase(n);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} /* namespace scheduling */
|
||||
} /* namespace wfr */
|
||||
Reference in New Issue
Block a user