use of org.ow2.proactive.resourcemanager.rmnode.RMNode in project scheduling by ow2-proactive.
the class NodesCleaner method cleanAndRelease.
/**
* Cleans nodes in parallel for the nodes specified.
*
* @param nodes to be cleaned
* @return true if all the nodes were freed, false if error occurs on one of the node (it will be marked as down in this case)
*/
public BooleanWrapper cleanAndRelease(List<RMNode> nodes) {
List<Callable<Boolean>> cleaners = new LinkedList<>();
for (RMNode node : nodes) {
logger.debug("Cleaning the node " + node.getNodeURL());
cleaners.add(new NodeCleaner(node));
}
try {
Collection<Future<Boolean>> cleanNodes = scriptExecutorThreadPool.invokeAll(cleaners);
int index = 0;
for (Future<Boolean> cleanNode : cleanNodes) {
RMNode node = nodes.get(index);
if (!cleanNode.isCancelled()) {
Boolean isClean = null;
try {
isClean = cleanNode.get();
if (!isClean.booleanValue()) {
logger.warn("Cannot clean the node " + node.getNodeURL());
rmcore.setDownNode(node.getNodeURL());
} else {
logger.debug("The node " + node.getNodeURL() + " has been successfully cleaned");
}
} catch (ExecutionException e) {
logger.warn("Cannot clean the node " + node.getNodeURL(), e);
rmcore.setDownNode(node.getNodeURL());
}
} else {
logger.warn("Cannot clean the node " + node.getNodeURL());
rmcore.setDownNode(node.getNodeURL());
}
index++;
}
// in this case rmcore.setFreeNodes() will return false
return rmcore.setFreeNodes(nodes);
} catch (InterruptedException e) {
logger.error("", e);
}
return new BooleanWrapper(false);
}
use of org.ow2.proactive.resourcemanager.rmnode.RMNode in project scheduling by ow2-proactive.
the class NodesRecoveryManager method recoverNodes.
protected void recoverNodes(NodeSource nodeSource) {
// this log line is important for performance tests
logger.info(START_TO_RECOVER_NODES);
int lookUpTimeout = PAResourceManagerProperties.RM_NODELOOKUP_TIMEOUT.getValueAsInt();
String nodeSourceName = nodeSource.getName();
this.logWarnIfNodeSourceHasNoNode(nodeSource, nodeSourceName);
Collection<RMNodeData> nodesData = this.rmCore.getDbManager().getNodesByNodeSource(nodeSourceName);
logger.info("Number of nodes found in database for node source " + nodeSourceName + ": " + nodesData.size());
List<RMNode> recoveredEligibleNodes = Collections.synchronizedList(new ArrayList<RMNode>());
Map<NodeState, Integer> recoveredNodeStatesCounter = new HashMap<>();
// as down node
for (RMNodeData rmNodeData : nodesData) {
String nodeUrl = rmNodeData.getNodeUrl();
Node node = this.tryToLookupNode(nodeSource, lookUpTimeout, nodeUrl);
RMNode rmnode = this.recoverRMNode(nodeSource, recoveredNodeStatesCounter, rmNodeData, nodeUrl, node);
if (this.isEligible(rmnode)) {
recoveredEligibleNodes.add(rmnode);
}
}
this.rmCore.setEligibleNodesToRecover(recoveredEligibleNodes);
this.logNodeRecoverySummary(nodeSourceName, recoveredNodeStatesCounter, recoveredEligibleNodes.size());
}
use of org.ow2.proactive.resourcemanager.rmnode.RMNode in project scheduling by ow2-proactive.
the class NodesRecoveryManager method recoverNodeInternally.
private RMNode recoverNodeInternally(NodeSource nodeSource, RMNodeData rmNodeData, String nodeUrl, Node node) {
RMNode rmNode = null;
// information to the node data retrieved in database.
if (rmNodeData.equalsToNode(node)) {
logger.info("Node to recover could successfully be looked up at URL: " + nodeUrl);
rmNode = nodeSource.internalAddNodeAfterRecovery(node, rmNodeData);
this.rmCore.registerAvailableNode(rmNode);
} else {
logger.error("The node that has been looked up does not have the same information as the node to recover: " + node.getNodeInformation().getName() + " is not equal to " + rmNodeData.getName() + " or " + node.getNodeInformation().getURL() + " is not equal to " + rmNodeData.getNodeUrl());
}
return rmNode;
}
use of org.ow2.proactive.resourcemanager.rmnode.RMNode in project scheduling by ow2-proactive.
the class NodesRecoveryManager method recoverRMNode.
private RMNode recoverRMNode(NodeSource nodeSource, Map<NodeState, Integer> nodeStates, RMNodeData rmNodeData, String nodeUrl, Node node) {
RMNode rmnode = null;
if (node != null) {
rmnode = this.recoverNodeInternally(nodeSource, rmNodeData, nodeUrl, node);
this.nodesLockRestorationManager.handle(rmnode, rmNodeData.getProvider());
this.updateRecoveredNodeStateCounter(nodeStates, rmnode.getState());
} else {
// the node is not recoverable and does not appear in any data
// structures: we can remove it safely from database
this.rmCore.getDbManager().removeNode(rmNodeData, rmNodeData.getNodeSource().getName());
this.markNodesNotInDeployingStateAsDown(nodeSource, rmNodeData, nodeUrl);
this.updateRecoveredNodeStateCounter(nodeStates, NodeState.DOWN);
}
return rmnode;
}
use of org.ow2.proactive.resourcemanager.rmnode.RMNode in project scheduling by ow2-proactive.
the class RMCore method disconnect.
/**
* Disconnects the client and releases all nodes held by him
*/
public void disconnect(UniqueID clientId) {
Client client = RMCore.clients.remove(clientId);
if (client != null) {
List<RMNode> nodesToRelease = new LinkedList<>();
// expensive but relatively rare operation
for (RMNode rmnode : new ArrayList<>(allNodes.values())) {
// the same connection
if (client.equals(rmnode.getOwner()) && clientId.equals(rmnode.getOwner().getId())) {
if (rmnode.isToRemove()) {
removeNodeFromCoreAndSource(rmnode, client);
} else if (rmnode.isBusy()) {
nodesToRelease.add(rmnode);
}
}
}
// Force the nodes cleaning here to avoid the situation
// when the disconnected client still uses nodes.
// In the future we may clean nodes for any release request
nodesCleaner.cleanAndRelease(nodesToRelease);
// update the connection info in the DB
if (client.getHistory() != null) {
UserHistory userHistory = client.getHistory();
userHistory.setEndTime(System.currentTimeMillis());
dbManager.updateUserHistory(userHistory);
}
logger.info(client + " disconnected from " + client.getId().shortString());
} else {
logger.warn("Trying to disconnect unknown client with id " + clientId.shortString());
}
}
Aggregations