Search in sources :

Example 31 with Node

use of org.objectweb.proactive.core.node.Node in project scheduling by ow2-proactive.

the class SelectionTest method action.

@Test
public void action() throws Exception {
    String currentHost = System.getenv("HOSTNAME");
    // checking if properties distantHost and neighborHost are defined
    String distantHost = System.getProperty("distantHost");
    String neighborHost = System.getProperty("neighborHost");
    if (distantHost != null && !distantHost.equals("${distantHost}") && neighborHost != null && !neighborHost.equals("${neighborHost}")) {
        String rmHome = System.getProperty("pa.rm.home");
        String rmCredPath = rmHome + "/config/authentication/rm.cred";
        String javaExec = System.getenv("JAVA_HOME") + "/bin/java";
        // properties are defined, trying to deploy nodes to these hosts
        BooleanWrapper result = rmHelper.getResourceManager().createNodeSource("remote", SSHInfrastructure.class.getName(), new Object[] { // ssh options
        "", // java executable path
        javaExec, // rmHelper distrib path
        rmHome, // node lookup timeout
        "30000", // attempts
        "2", // os
        "Linux", // java options
        "", // rmHelper credential
        FileToBytesConverter.convertFileToByteArray(new File(rmCredPath)), (distantHost + " 2\n" + neighborHost).getBytes() }, StaticPolicy.class.getName(), null, NODES_NOT_RECOVERABLE);
        if (result.getBooleanValue()) {
            rmHelper.waitForAnyNodeEvent(RMEventType.NODE_ADDED);
            rmHelper.waitForAnyNodeEvent(RMEventType.NODE_ADDED);
            rmHelper.waitForAnyNodeEvent(RMEventType.NODE_ADDED);
            // wait for the nodes to be in free state
            rmHelper.waitForAnyNodeEvent(RMEventType.NODE_STATE_CHANGED);
            rmHelper.waitForAnyNodeEvent(RMEventType.NODE_STATE_CHANGED);
            rmHelper.waitForAnyNodeEvent(RMEventType.NODE_STATE_CHANGED);
        }
    // we are good - all remote nodes registered
    } else {
        // no parameters provided
        RMTHelper.log("Nothing to do. Set up distantHost & neighborHost parameters.");
        return;
    }
    // creating the selection script object
    SelectionScript script = new SelectionScript(new File(vmPropSelectionScriptpath), new String[] { this.vmPropKey1, this.vmPropValue1 }, true);
    List<SelectionScript> scriptList = new LinkedList<>();
    scriptList.add(script);
    ResourceManager resourceManager = rmHelper.getResourceManager();
    String node1 = "node1";
    // a node with the VM properties
    HashMap<String, String> vmProperties = new HashMap<>();
    vmProperties.put(this.vmPropKey1, this.vmPropValue1);
    testNode = rmHelper.createNode(node1, vmProperties);
    String node1URL = testNode.getNode().getNodeInformation().getURL();
    resourceManager.addNode(node1URL, NodeSource.DEFAULT);
    // wait node adding event
    rmHelper.waitForNodeEvent(RMEventType.NODE_ADDED, node1URL);
    // wait for the nodes to be in free state
    rmHelper.waitForAnyNodeEvent(RMEventType.NODE_STATE_CHANGED);
    // so now we have 9 node in total
    // 6 local nodes (5 default, 1 marked with property)
    // 2 nodes on distant host
    // 1 node on neighbor host
    Assert.assertEquals(9, resourceManager.getState().getFreeNodesNumber());
    // checking TopologyDescriptor.ARBITRARY
    NodeSet ns = resourceManager.getAtMostNodes(1, TopologyDescriptor.ARBITRARY, null, null);
    Assert.assertEquals(1, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(8, TopologyDescriptor.ARBITRARY, null, null);
    Assert.assertEquals(8, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.ARBITRARY, null, null);
    Assert.assertEquals(9, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.ARBITRARY, scriptList, null);
    Assert.assertEquals(1, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    // checking TopologyDescriptor.BEST_PROXIMITY
    ns = resourceManager.getAtMostNodes(1, TopologyDescriptor.BEST_PROXIMITY, null, null);
    Assert.assertEquals(1, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(9, TopologyDescriptor.BEST_PROXIMITY, null, null);
    Assert.assertEquals(9, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.BEST_PROXIMITY, null, null);
    Assert.assertEquals(9, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    // Node pivotNode = null;
    ns = resourceManager.getAtMostNodes(6, TopologyDescriptor.BEST_PROXIMITY, null, null);
    Assert.assertEquals(6, ns.size());
    for (Node node : ns) {
        // pivotNode = node;
        if (!node.getNodeInformation().getURL().contains(currentHost)) {
            Assert.assertTrue("All nodes have to be from " + currentHost, false);
        }
    }
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(7, TopologyDescriptor.BEST_PROXIMITY, null, null);
    Assert.assertEquals(7, ns.size());
    for (Node node : ns) {
        if (node.getNodeInformation().getURL().contains(distantHost)) {
            Assert.assertTrue("Node from distant host selected", false);
        }
    }
    resourceManager.releaseNodes(ns).getBooleanValue();
    // pivot scenario
    // List<Node> pivot = new LinkedList<Node>();
    // pivot.add(pivotNode);
    // ns = resourceManager.getAtMostNodes(6,
    // new BestProximityDescriptor(BestProximityDescriptor.MAX, pivot), null, null);
    // Assert.assertEquals(6, ns.size());
    // for (Node node : ns) {
    // if (node.getNodeInformation().getURL().equals(pivotNode.getNodeInformation().getURL())) {
    // Assert.assertTrue("Pivot must not be in results", false);
    // }
    // if (node.getNodeInformation().getURL().contains(distantHost)) {
    // Assert.assertTrue("Node from distant host selected", false);
    // }
    // }
    // resourceManager.releaseNodes(ns).getBooleanValue();
    // 
    // ns = resourceManager.getAtMostNodes(7,
    // new BestProximityDescriptor(BestProximityDescriptor.MAX, pivot), null, null);
    // Assert.assertEquals(7, ns.size());
    // for (Node node : ns) {
    // if (node.getNodeInformation().getURL().equals(pivotNode.getNodeInformation().getURL())) {
    // Assert.assertTrue("Pivot must not be in results", false);
    // }
    // }
    // resourceManager.releaseNodes(ns).getBooleanValue();
    // checking TopologyDescriptor.ThresholdProximityDescriptor
    ns = resourceManager.getAtMostNodes(1, new ThresholdProximityDescriptor(Long.MAX_VALUE), null, null);
    Assert.assertEquals(1, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(9, new ThresholdProximityDescriptor(Long.MAX_VALUE), null, null);
    Assert.assertEquals(9, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, new ThresholdProximityDescriptor(Long.MAX_VALUE), null, null);
    Assert.assertEquals(9, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    // getting information about topology
    Topology topology = resourceManager.getTopology();
    Assert.assertEquals(3, topology.getHosts().size());
    // looking for distances consistency
    Long current2neighborDistance = topology.getDistance(currentHost, neighborHost);
    Long current2distantDistance = topology.getDistance(currentHost, distantHost);
    Long distant2neightborDistance = topology.getDistance(neighborHost, distantHost);
    if (current2neighborDistance == null || current2distantDistance == null) {
        Assert.assertTrue("Please put full host names to the parameters", false);
    }
    if (current2neighborDistance > current2distantDistance) {
        Assert.assertTrue("Distant host is close to current than neighbor according to the topology", false);
    }
    System.out.println("Distance between " + currentHost + " and " + neighborHost + " is " + current2neighborDistance);
    System.out.println("Distance between " + currentHost + " and " + distantHost + " is " + current2distantDistance);
    System.out.println("Distance between " + neighborHost + " and " + distantHost + " is " + distant2neightborDistance);
    long maxThreshold = Math.max(current2neighborDistance, Math.max(current2distantDistance, distant2neightborDistance));
    ns = resourceManager.getAtMostNodes(100, new ThresholdProximityDescriptor(current2neighborDistance - 1), null, null);
    Assert.assertEquals(6, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, new ThresholdProximityDescriptor(current2neighborDistance), null, null);
    Assert.assertEquals(7, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, new ThresholdProximityDescriptor(maxThreshold - 1), null, null);
    for (Node node : ns) {
        if (node.getNodeInformation().getURL().contains(distantHost)) {
            Assert.assertTrue("Node from distant host selected", false);
        }
    }
    Assert.assertEquals(7, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(10, new ThresholdProximityDescriptor(maxThreshold), null, null);
    Assert.assertEquals(9, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    // pivot scenario
    // ns = resourceManager.getAtMostNodes(1, new ThresholdProximityDescriptor(0, pivot), null, null);
    // Assert.assertEquals(1, ns.size());
    // for (Node node : ns) {
    // if (node.getNodeInformation().getURL().equals(pivotNode.getNodeInformation().getURL())) {
    // Assert.assertTrue("Pivot must not be in results", false);
    // }
    // if (node.getNodeInformation().getURL().contains(distantHost) ||
    // node.getNodeInformation().getURL().contains(neighborHost)) {
    // Assert.assertTrue("Incorrect node selected", false);
    // }
    // }
    // resourceManager.releaseNodes(ns).getBooleanValue();
    // 
    // ns = resourceManager.getAtMostNodes(6, new ThresholdProximityDescriptor(current2neighborDistance,
    // pivot), null, null);
    // Assert.assertEquals(6, ns.size());
    // for (Node node : ns) {
    // if (node.getNodeInformation().getURL().equals(pivotNode.getNodeInformation().getURL())) {
    // Assert.assertTrue("Pivot must not be in results", false);
    // }
    // if (node.getNodeInformation().getURL().contains(distantHost)) {
    // Assert.assertTrue("Node from distant host selected", false);
    // }
    // }
    // resourceManager.releaseNodes(ns).getBooleanValue();
    // checking TopologyDescriptor.SINGLE_HOST
    ns = resourceManager.getAtMostNodes(1, TopologyDescriptor.SINGLE_HOST, null, null);
    Assert.assertEquals(1, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(9, TopologyDescriptor.SINGLE_HOST, null, null);
    Assert.assertEquals(6, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.SINGLE_HOST, null, null);
    Assert.assertEquals(6, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.SINGLE_HOST, scriptList, null);
    Assert.assertEquals(1, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    // checking TopologyDescriptor.SINGLE_HOST_EXCLUSIVE
    ns = resourceManager.getAtMostNodes(1, TopologyDescriptor.SINGLE_HOST_EXCLUSIVE, null, null);
    Assert.assertEquals(1, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    if (!ns.get(0).getNodeInformation().getURL().contains(neighborHost)) {
        Assert.assertTrue("Neighbor host shold be selected", false);
    }
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(9, TopologyDescriptor.SINGLE_HOST_EXCLUSIVE, null, null);
    Assert.assertEquals(6, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(2, TopologyDescriptor.SINGLE_HOST_EXCLUSIVE, null, null);
    Assert.assertEquals(2, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(3, TopologyDescriptor.SINGLE_HOST_EXCLUSIVE, null, null);
    Assert.assertEquals(3, ns.size());
    Assert.assertEquals(3, ns.getExtraNodes().size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.SINGLE_HOST_EXCLUSIVE, scriptList, null);
    // no hosts matched selection script
    Assert.assertEquals(0, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.SINGLE_HOST_EXCLUSIVE, null, null);
    // return the host with max capacity
    Assert.assertEquals(6, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    // checking TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE
    ns = resourceManager.getAtMostNodes(1, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(1, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(2, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(2, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(3, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(3, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(9, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(9, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(8, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, null, null);
    // current + distant has to be selected
    Assert.assertEquals(8, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(7, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, null, null);
    // current + neighbor has to be selected
    Assert.assertEquals(7, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, scriptList, null);
    // selection script specified => no such set
    Assert.assertEquals(0, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(100, TopologyDescriptor.MULTIPLE_HOSTS_EXCLUSIVE, null, null);
    // get max possible capacity
    Assert.assertEquals(9, ns.size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    // checking TopologyDescriptor.ONE_NODE_PER_HOST_EXCLUSIVE
    ns = resourceManager.getAtMostNodes(1, TopologyDescriptor.DIFFERENT_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(1, ns.size());
    Assert.assertEquals(null, ns.getExtraNodes());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(2, TopologyDescriptor.DIFFERENT_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(2, ns.size());
    Assert.assertEquals(1, ns.getExtraNodes().size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(3, TopologyDescriptor.DIFFERENT_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(3, ns.size());
    Assert.assertEquals(6, ns.getExtraNodes().size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    ns = resourceManager.getAtMostNodes(4, TopologyDescriptor.DIFFERENT_HOSTS_EXCLUSIVE, null, null);
    Assert.assertEquals(3, ns.size());
    Assert.assertEquals(6, ns.getExtraNodes().size());
    resourceManager.releaseNodes(ns).getBooleanValue();
    PAFuture.waitFor(resourceManager.removeNodeSource("remote", true));
}
Also used : NodeSet(org.ow2.proactive.utils.NodeSet) SSHInfrastructure(org.ow2.proactive.resourcemanager.nodesource.infrastructure.SSHInfrastructure) HashMap(java.util.HashMap) StaticPolicy(org.ow2.proactive.resourcemanager.nodesource.policy.StaticPolicy) Node(org.objectweb.proactive.core.node.Node) ThresholdProximityDescriptor(org.ow2.proactive.topology.descriptor.ThresholdProximityDescriptor) ResourceManager(org.ow2.proactive.resourcemanager.frontend.ResourceManager) Topology(org.ow2.proactive.resourcemanager.frontend.topology.Topology) LinkedList(java.util.LinkedList) BooleanWrapper(org.objectweb.proactive.core.util.wrapper.BooleanWrapper) SelectionScript(org.ow2.proactive.scripting.SelectionScript) File(java.io.File) Test(org.junit.Test) RMFunctionalTest(functionaltests.utils.RMFunctionalTest)

Example 32 with Node

use of org.objectweb.proactive.core.node.Node in project scheduling by ow2-proactive.

the class RMTHelper method createNodes.

/**
 * Create several nodes on the same JVMProcess
 */
public static List<TestNode> createNodes(final String nodeName, int number) throws IOException, NodeException, ExecutionException, InterruptedException, AlreadyBoundException {
    if (number == 0) {
        throw new IllegalArgumentException("" + number);
    }
    ArrayList<TestNode> nodes = new ArrayList<>(number);
    // Start the JVMProcess and create the first node
    TestNode node0 = createNode(nodeName + 0, findFreePort());
    nodes.add(0, node0);
    // create all subsequent nodes remotely
    for (int i = 1; i < number; i++) {
        Node nodei = node0.getNode().getProActiveRuntime().createLocalNode(nodeName + i, false, null);
        nodes.add(new TestNode(node0.getNodeProcess(), nodei));
    }
    return nodes;
}
Also used : StartNode(org.objectweb.proactive.core.node.StartNode) Node(org.objectweb.proactive.core.node.Node)

Example 33 with Node

use of org.objectweb.proactive.core.node.Node in project scheduling by ow2-proactive.

the class RMTHelper method createNode.

public static TestNode createNode(String nodeName, String expectedUrl, JVMProcess nodeProcess) throws IOException, NodeException, InterruptedException {
    Node newNode = null;
    long startTimeStamp = System.currentTimeMillis();
    NodeException toThrow = null;
    while ((System.currentTimeMillis() - startTimeStamp) < DEFAULT_NODES_TIMEOUT) {
        try {
            newNode = NodeFactory.getNode(expectedUrl);
        } catch (NodeException e) {
            toThrow = e;
        // nothing, wait another loop
        }
        if (newNode != null) {
            return new TestNode(nodeProcess, newNode);
        } else {
            Thread.sleep(100);
        }
    }
    throw toThrow == null ? new NodeException("unable to create the node " + nodeName) : toThrow;
}
Also used : StartNode(org.objectweb.proactive.core.node.StartNode) Node(org.objectweb.proactive.core.node.Node) NodeException(org.objectweb.proactive.core.node.NodeException)

Example 34 with Node

use of org.objectweb.proactive.core.node.Node in project scheduling by ow2-proactive.

the class TaskProActiveDataspaces method initDataSpaces.

private void initDataSpaces() throws Exception {
    long startTime = System.currentTimeMillis();
    // configure node for application
    String appId = taskId.toString();
    // prepare scratch, input, output
    Node node = PAActiveObject.getNode();
    logger.info("Configuring dataspaces for app " + appId + " on " + node.getNodeInformation().getName());
    DataSpacesNodes.configureApplication(node, appId, namingService);
    SCRATCH = PADataSpaces.resolveScratchForAO();
    logger.info("SCRATCH space is " + SCRATCH.getRealURI());
    // Set the scratch folder writable for everyone
    if (!SCRATCH.setWritable(true, false)) {
        logger.warn("Missing permission to change write permissions to " + getScratchFolder());
    }
    InputOutputSpaceConfiguration cacheConfiguration = DataSpaceNodeConfigurationAgent.getCacheSpaceConfiguration();
    if (cacheConfiguration != null) {
        final String cacheName = cacheConfiguration.getName();
        cacheSpaceInstanceInfo = new SpaceInstanceInfo(appId, cacheConfiguration);
        try {
            namingService.register(cacheSpaceInstanceInfo);
        } catch (SpaceAlreadyRegisteredException e) {
            // this is a rare case where the cache space has already been registered for the same task and there was a node failure.
            namingService.unregister(cacheSpaceInstanceInfo.getMountingPoint());
            namingService.register(cacheSpaceInstanceInfo);
        }
        CACHE = initDataSpace(new Callable<DataSpacesFileObject>() {

            @Override
            public DataSpacesFileObject call() throws Exception {
                return PADataSpaces.resolveOutput(cacheName);
            }
        }, "CACHE", false);
    } else {
        logger.error("No Cache space configuration found, cache space is disabled.");
    }
    INPUT = initDataSpace(new Callable<DataSpacesFileObject>() {

        @Override
        public DataSpacesFileObject call() throws Exception {
            return PADataSpaces.resolveDefaultInput();
        }
    }, "INPUT", true);
    OUTPUT = initDataSpace(new Callable<DataSpacesFileObject>() {

        @Override
        public DataSpacesFileObject call() throws Exception {
            return PADataSpaces.resolveDefaultOutput();
        }
    }, "OUTPUT", false);
    GLOBAL = initDataSpace(new Callable<DataSpacesFileObject>() {

        @Override
        public DataSpacesFileObject call() throws Exception {
            return PADataSpaces.resolveOutput(SchedulerConstants.GLOBALSPACE_NAME);
        }
    }, "GLOBAL", false);
    USER = initDataSpace(new Callable<DataSpacesFileObject>() {

        @Override
        public DataSpacesFileObject call() throws Exception {
            return PADataSpaces.resolveOutput(SchedulerConstants.USERSPACE_NAME);
        }
    }, "USER", false);
    logger.info("Time needed to mount data spaces: " + (System.currentTimeMillis() - startTime) + " ms");
}
Also used : InputOutputSpaceConfiguration(org.objectweb.proactive.extensions.dataspaces.core.InputOutputSpaceConfiguration) SpaceInstanceInfo(org.objectweb.proactive.extensions.dataspaces.core.SpaceInstanceInfo) SpaceAlreadyRegisteredException(org.objectweb.proactive.extensions.dataspaces.exceptions.SpaceAlreadyRegisteredException) Node(org.objectweb.proactive.core.node.Node) Throwables.getStackTraceAsString(com.google.common.base.Throwables.getStackTraceAsString) Callable(java.util.concurrent.Callable)

Example 35 with Node

use of org.objectweb.proactive.core.node.Node in project scheduling by ow2-proactive.

the class SchedulingMethodImpl method selectAndStartTasks.

private int selectAndStartTasks(Policy currentPolicy, Map<JobId, JobDescriptor> jobMap, Set<String> freeResources, LinkedList<EligibleTaskDescriptor> fullListOfTaskRetrievedFromPolicy) {
    int numberOfTaskStarted = 0;
    VariableBatchSizeIterator progressiveIterator = new VariableBatchSizeIterator(fullListOfTaskRetrievedFromPolicy);
    while (progressiveIterator.hasMoreElements() && !freeResources.isEmpty()) {
        LinkedList<EligibleTaskDescriptor> taskRetrievedFromPolicy = new LinkedList<>(progressiveIterator.getNextElements(freeResources.size()));
        if (logger.isDebugEnabled()) {
            loggingEligibleTasksDetails(fullListOfTaskRetrievedFromPolicy, taskRetrievedFromPolicy);
        }
        updateVariablesForTasksToSchedule(taskRetrievedFromPolicy);
        for (EligibleTaskDescriptor etd : taskRetrievedFromPolicy) {
            // load and Initialize the executable container
            loadAndInit(((EligibleTaskDescriptorImpl) etd).getInternal());
        }
        while (!taskRetrievedFromPolicy.isEmpty()) {
            if (freeResources.isEmpty()) {
                break;
            }
            // get the next compatible tasks from the whole returned policy tasks
            LinkedList<EligibleTaskDescriptor> tasksToSchedule = new LinkedList<>();
            int neededResourcesNumber = 0;
            while (!taskRetrievedFromPolicy.isEmpty() && neededResourcesNumber == 0) {
                // the loop will search for next compatible task until it find something
                neededResourcesNumber = getNextcompatibleTasks(jobMap, taskRetrievedFromPolicy, freeResources.size(), tasksToSchedule);
            }
            if (logger.isDebugEnabled()) {
                logger.debug("tasksToSchedule : " + tasksToSchedule);
            }
            logger.debug("required number of nodes : " + neededResourcesNumber);
            if (neededResourcesNumber == 0 || tasksToSchedule.isEmpty()) {
                break;
            }
            NodeSet nodeSet = getRMNodes(jobMap, neededResourcesNumber, tasksToSchedule, freeResources);
            if (nodeSet != null) {
                freeResources.removeAll(nodeSet.getAllNodesUrls());
            }
            // start selected tasks
            Node node = null;
            InternalJob currentJob = null;
            try {
                while (nodeSet != null && !nodeSet.isEmpty()) {
                    EligibleTaskDescriptor taskDescriptor = tasksToSchedule.removeFirst();
                    currentJob = ((JobDescriptorImpl) jobMap.get(taskDescriptor.getJobId())).getInternal();
                    InternalTask internalTask = ((EligibleTaskDescriptorImpl) taskDescriptor).getInternal();
                    if (currentPolicy.isTaskExecutable(nodeSet, taskDescriptor)) {
                        // create launcher and try to start the task
                        node = nodeSet.get(0);
                        if (createExecution(nodeSet, node, currentJob, internalTask, taskDescriptor)) {
                            numberOfTaskStarted++;
                        }
                    }
                    // if every task that should be launched have been removed
                    if (tasksToSchedule.isEmpty()) {
                        // get back unused nodes to the RManager
                        if (!nodeSet.isEmpty()) {
                            releaseNodes(currentJob, nodeSet);
                            freeResources.addAll(nodeSet.getAllNodesUrls());
                        }
                        // and leave the loop
                        break;
                    }
                }
            } catch (ActiveObjectCreationException e1) {
                // Something goes wrong with the active object creation (createLauncher)
                logger.warn("An exception occured while creating the task launcher.", e1);
                // so try to get back every remaining nodes to the resource manager
                try {
                    releaseNodes(currentJob, nodeSet);
                    freeResources.addAll(nodeSet.getAllNodesUrls());
                } catch (Exception e2) {
                    logger.info("Unable to get back the nodeSet to the RM", e2);
                }
                if (--activeObjectCreationRetryTimeNumber == 0) {
                    break;
                }
            } catch (Exception e1) {
                // if we are here, it is that something append while launching the current task.
                logger.warn("An exception occured while starting task.", e1);
                // so try to get back every remaining nodes to the resource manager
                try {
                    releaseNodes(currentJob, nodeSet);
                    freeResources.addAll(nodeSet.getAllNodesUrls());
                } catch (Exception e2) {
                    logger.info("Unable to get back the nodeSet to the RM", e2);
                }
            }
        }
        if (freeResources.isEmpty()) {
            break;
        }
        if (activeObjectCreationRetryTimeNumber == 0) {
            break;
        }
    }
    return numberOfTaskStarted;
}
Also used : NodeSet(org.ow2.proactive.utils.NodeSet) InternalJob(org.ow2.proactive.scheduler.job.InternalJob) EligibleTaskDescriptor(org.ow2.proactive.scheduler.descriptor.EligibleTaskDescriptor) InternalTask(org.ow2.proactive.scheduler.task.internal.InternalTask) Node(org.objectweb.proactive.core.node.Node) EligibleTaskDescriptorImpl(org.ow2.proactive.scheduler.descriptor.EligibleTaskDescriptorImpl) VariableBatchSizeIterator(org.ow2.proactive.scheduler.core.helpers.VariableBatchSizeIterator) LinkedList(java.util.LinkedList) ActiveObjectCreationException(org.objectweb.proactive.ActiveObjectCreationException) ActiveObjectCreationException(org.objectweb.proactive.ActiveObjectCreationException) TopologyDisabledException(org.ow2.proactive.resourcemanager.frontend.topology.TopologyDisabledException) InvalidScriptException(org.ow2.proactive.scripting.InvalidScriptException) RMProxyCreationException(org.ow2.proactive.scheduler.core.rmproxies.RMProxyCreationException) IOException(java.io.IOException)

Aggregations

Node (org.objectweb.proactive.core.node.Node)80 Test (org.junit.Test)28 RMFunctionalTest (functionaltests.utils.RMFunctionalTest)21 NodeSet (org.ow2.proactive.utils.NodeSet)19 RMNode (org.ow2.proactive.resourcemanager.rmnode.RMNode)18 ResourceManager (org.ow2.proactive.resourcemanager.frontend.ResourceManager)16 HashMap (java.util.HashMap)15 TestNode (functionaltests.utils.TestNode)11 StaticPolicy (org.ow2.proactive.resourcemanager.nodesource.policy.StaticPolicy)11 NodeException (org.objectweb.proactive.core.node.NodeException)9 DefaultInfrastructureManager (org.ow2.proactive.resourcemanager.nodesource.infrastructure.DefaultInfrastructureManager)9 RMDeployingNode (org.ow2.proactive.resourcemanager.rmnode.RMDeployingNode)9 Criteria (org.ow2.proactive.utils.Criteria)8 IOException (java.io.IOException)7 LinkedList (java.util.LinkedList)7 RMNodeEvent (org.ow2.proactive.resourcemanager.common.event.RMNodeEvent)7 RMException (org.ow2.proactive.resourcemanager.exception.RMException)7 BooleanWrapper (org.objectweb.proactive.core.util.wrapper.BooleanWrapper)6 InetAddress (java.net.InetAddress)5 ArrayList (java.util.ArrayList)5