use of org.ow2.proactive.scheduler.policy.Policy in project scheduling by ow2-proactive.
the class DefaultPolicy method getOrderedTasks.
/**
* This method return the tasks using FIFO policy according to the jobs priorities.
*
* @see org.ow2.proactive.scheduler.policy.Policy#getOrderedTasks(java.util.List)
*/
@Override
public LinkedList<EligibleTaskDescriptor> getOrderedTasks(List<JobDescriptor> jobs) {
LinkedList<EligibleTaskDescriptor> toReturn = new LinkedList<>();
Collections.sort(jobs, FIFO_BY_PRIORITY_COMPARATOR);
// add all sorted tasks to list of tasks
for (JobDescriptor jd : jobs) {
Collection<TaskDescriptor> tasks = jd.getEligibleTasks();
Collection<EligibleTaskDescriptor> eligibleTasks = (Collection) tasks;
toReturn.addAll(eligibleTasks);
}
// return sorted list of tasks
return toReturn;
}
use of org.ow2.proactive.scheduler.policy.Policy in project scheduling by ow2-proactive.
the class SchedulerFrontendState method checkChangePolicy.
synchronized void checkChangePolicy() throws NotConnectedException, PermissionException {
UniqueID id = checkAccess();
UserIdentificationImpl ident = identifications.get(id).getUser();
// renew session for this user
renewUserSession(id, ident);
try {
ident.checkPermission(new ChangePolicyPermission(), ident.getUsername() + " does not have permissions to change the policy of the scheduler");
} catch (PermissionException ex) {
logger.info(ex.getMessage());
throw ex;
}
}
use of org.ow2.proactive.scheduler.policy.Policy in project scheduling by ow2-proactive.
the class TestNodeSourcePolicy method action.
@Test
public void action() throws Exception {
/**
* Creating a config with ns names 0, 1, 2, 3, ... 9
*/
File config = tmpFolder.newFile("policies");
BufferedWriter out = new BufferedWriter(new FileWriter(config));
for (int i = 0; i < 10; i++) {
out.write(i + "\n");
}
out.close();
System.setProperty(NodeSourcePriorityPolicy.CONFIG_NAME_PROPERTY, config.getAbsolutePath());
NodeSourcePriorityPolicy policy = new NodeSourcePriorityPolicy();
// checking the arrangement of all nodes
List<RMNode> nodes = createNodes();
List<RMNode> res = policy.arrangeNodes(1000, nodes, null);
assertEquals("Incorrect result size", 400, res.size());
Iterator<RMNode> iterator = res.iterator();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 20; j++) {
RMNode node = iterator.next();
assertEquals("Incorrect arrangenemt (" + i + ", " + j + ")", String.valueOf(i), node.getNodeName());
}
}
}
use of org.ow2.proactive.scheduler.policy.Policy in project scheduling by ow2-proactive.
the class SelectionManager method doSelectNodes.
private NodeSet doSelectNodes(Criteria criteria, Client client) {
boolean hasScripts = criteria.getScripts() != null && criteria.getScripts().size() > 0;
boolean loggerIsDebugEnabled = logger.isDebugEnabled();
if (loggerIsDebugEnabled) {
logger.debug(client + " requested " + criteria.getSize() + " nodes with " + criteria.getTopology());
if (hasScripts) {
logger.debug("Selection scripts:");
for (SelectionScript s : criteria.getScripts()) {
logger.debug(s);
}
}
if (criteria.getBlackList() != null && criteria.getBlackList().size() > 0) {
logger.debug("Black list nodes:");
for (Node n : criteria.getBlackList()) {
logger.debug(n);
}
}
}
// can throw Exception if topology is disabled
TopologyHandler handler = RMCore.topologyManager.getHandler(criteria.getTopology());
int totalNumberOfAliveNodesRightNow = rmcore.getTotalAliveNodesNumber();
List<RMNode> freeNodes = rmcore.getFreeNodes();
// filtering out the "free node list"
// removing exclusion and checking permissions
List<RMNode> filteredNodes = filterOut(freeNodes, criteria, client);
if (filteredNodes.size() == 0) {
if (loggerIsDebugEnabled) {
logger.debug(client + " will get 0 nodes");
}
return new NodeSet();
}
// arranging nodes according to the selection policy
// if could be shuffling or node source priorities
List<RMNode> afterPolicyNodes = selectionPolicy.arrangeNodes(criteria.getSize(), filteredNodes, client);
List<Node> matchedNodes;
if (hasScripts) {
// checking if all scripts are authorized
checkAuthorizedScripts(criteria.getScripts());
// arranging nodes for script execution
List<RMNode> arrangedNodes = arrangeNodesForScriptExecution(afterPolicyNodes, criteria.getScripts(), criteria.getBindings());
List<RMNode> arrangedFilteredNodes = arrangedNodes;
if (criteria.getTopology().isTopologyBased()) {
arrangedFilteredNodes = topologyNodesFilter.filterNodes(criteria, arrangedNodes);
}
if (arrangedFilteredNodes.isEmpty()) {
matchedNodes = new LinkedList<>();
} else if (electedToRunOnAllNodes(criteria)) {
// run scripts on all available nodes
matchedNodes = runScripts(arrangedFilteredNodes, criteria);
} else {
// run scripts not on all nodes, but always on missing number of
// nodes
// until required node set is found
matchedNodes = new LinkedList<>();
while (matchedNodes.size() < criteria.getSize()) {
int numberOfNodesForScriptExecution = criteria.getSize() - matchedNodes.size();
if (numberOfNodesForScriptExecution < PAResourceManagerProperties.RM_SELECTION_MAX_THREAD_NUMBER.getValueAsInt()) {
// we can run
// "PAResourceManagerProperties.RM_SELECTION_MAX_THREAD_NUMBER.getValueAsInt()"
// scripts in parallel
// in case when we need less nodes it still useful to
// the full capacity of the thread pool to find nodes
// quicker
// it is not important if we find more nodes than needed
// subset will be selected later (topology handlers)
numberOfNodesForScriptExecution = PAResourceManagerProperties.RM_SELECTION_MAX_THREAD_NUMBER.getValueAsInt();
}
List<RMNode> subset = arrangedFilteredNodes.subList(0, Math.min(numberOfNodesForScriptExecution, arrangedFilteredNodes.size()));
matchedNodes.addAll(runScripts(subset, criteria));
// removing subset of arrangedNodes
subset.clear();
if (arrangedFilteredNodes.size() == 0) {
break;
}
}
if (loggerIsDebugEnabled) {
logger.debug(matchedNodes.size() + " nodes found after scripts execution for " + client);
}
}
} else {
matchedNodes = new LinkedList<>();
for (RMNode node : afterPolicyNodes) {
matchedNodes.add(node.getNode());
}
}
if (criteria.getTopology().isTopologyBased() && loggerIsDebugEnabled) {
logger.debug("Filtering nodes with topology " + criteria.getTopology());
}
NodeSet selectedNodes = handler.select(criteria.getSize(), matchedNodes);
if (selectedNodes.size() < criteria.getSize() && !criteria.isBestEffort()) {
selectedNodes.clear();
if (selectedNodes.getExtraNodes() != null) {
selectedNodes.getExtraNodes().clear();
}
}
// the nodes are selected, now mark them as busy.
for (Node node : selectedNodes) {
try {
// Synchronous call
rmcore.setBusyNode(node.getNodeInformation().getURL(), client);
} catch (NotConnectedException e) {
// client has disconnected during getNodes request
logger.warn(e.getMessage(), e);
return null;
}
}
// marking extra selected nodes as busy
if (selectedNodes.size() > 0 && selectedNodes.getExtraNodes() != null) {
for (Node node : new LinkedList<>(selectedNodes.getExtraNodes())) {
try {
// synchronous call
rmcore.setBusyNode(node.getNodeInformation().getURL(), client);
} catch (NotConnectedException e) {
// client has disconnected during getNodes request
logger.warn(e.getMessage(), e);
return null;
}
}
}
if (logger.isInfoEnabled()) {
String extraNodes = selectedNodes.getExtraNodes() != null && selectedNodes.getExtraNodes().size() > 0 ? " and " + selectedNodes.getExtraNodes().size() + " extra nodes" : "";
logger.info(client + " requested " + criteria.getSize() + " nodes with " + criteria.getTopology() + " and will get " + selectedNodes.size() + " nodes " + extraNodes + " [totalNumberOfAliveNodesRightNow:" + totalNumberOfAliveNodesRightNow + ";freeNodes:" + freeNodes.size() + ";filteredNodes:" + filteredNodes.size() + ";reordered after policy:" + afterPolicyNodes.size() + ";selection script present:" + hasScripts + ";nodes filtered by selection script:" + matchedNodes.size() + ";selectedNodes:" + selectedNodes.size() + "]");
}
if (loggerIsDebugEnabled) {
for (Node n : selectedNodes) {
logger.debug(n.getNodeInformation().getURL());
}
}
return selectedNodes;
}
use of org.ow2.proactive.scheduler.policy.Policy in project scheduling by ow2-proactive.
the class NodeSourcesTest method addNodeSource.
@Test
public void addNodeSource() throws Exception {
NodeSourceData nodeSourceData = createNodeSource();
nodeSourceData.setInfrastructureVariables(infrastructureVariables);
assertThat(dbManager.getNodeSources()).isEmpty();
dbManager.addNodeSource(nodeSourceData);
Collection<NodeSourceData> nodeSources = dbManager.getNodeSources();
assertThat(nodeSources).hasSize(1);
NodeSourceData nodeSource = nodeSources.iterator().next();
Assert.assertEquals("ns1", nodeSource.getName());
Assert.assertEquals(DefaultInfrastructureManager.class.getName(), nodeSource.getInfrastructureType());
Assert.assertEquals("infrastructure", nodeSource.getInfrastructureParameters().toArray()[0]);
Assert.assertEquals(StaticPolicy.class.getName(), nodeSource.getPolicyType());
Assert.assertEquals("policy", nodeSource.getPolicyParameters().toArray()[0]);
assertThat(nodeSource.getInfrastructureVariables()).hasSize(1);
Assert.assertEquals(INFRASTRUCTURE_VARIABLE_VALUE, nodeSource.getInfrastructureVariables().get(INFRASTRUCTURE_VARIABLE_KEY));
}
Aggregations