/* * Following methods are used for setting if a node is up and running, and it * will update running nodes resource */ public virtual void ActivateNode(NodeId nodeId, Resource resource) { try { writeLock.Lock(); // save if we have a node before IDictionary <string, CommonNodeLabelsManager.Host> before = CloneNodeMap(ImmutableSet .Of(nodeId)); CreateHostIfNonExisted(nodeId.GetHost()); try { CreateNodeIfNonExisted(nodeId); } catch (IOException) { Log.Error("This shouldn't happen, cannot get host in nodeCollection" + " associated to the node being activated" ); return; } CommonNodeLabelsManager.Node nm = GetNMInNodeSet(nodeId); nm.resource = resource; nm.running = true; // Add node in labelsCollection ICollection <string> labelsForNode = GetLabelsByNode(nodeId); if (labelsForNode != null) { foreach (string label in labelsForNode) { NodeLabel labelInfo = labelCollections[label]; if (labelInfo != null) { labelInfo.AddNodeId(nodeId); } } } // get the node after edition IDictionary <string, CommonNodeLabelsManager.Host> after = CloneNodeMap(ImmutableSet .Of(nodeId)); UpdateResourceMappings(before, after); } finally { writeLock.Unlock(); } }
private IDictionary <string, CommonNodeLabelsManager.Host> CloneNodeMap(ICollection <NodeId> nodesToCopy) { IDictionary <string, CommonNodeLabelsManager.Host> map = new Dictionary <string, CommonNodeLabelsManager.Host >(); foreach (NodeId nodeId in nodesToCopy) { if (!map.Contains(nodeId.GetHost())) { CommonNodeLabelsManager.Host originalN = nodeCollections[nodeId.GetHost()]; if (null == originalN) { continue; } CommonNodeLabelsManager.Host n = originalN.Copy(); n.nms.Clear(); map[nodeId.GetHost()] = n; } CommonNodeLabelsManager.Host n_1 = map[nodeId.GetHost()]; if (WildcardPort == nodeId.GetPort()) { foreach (KeyValuePair <NodeId, CommonNodeLabelsManager.Node> entry in nodeCollections [nodeId.GetHost()].nms) { n_1.nms[entry.Key] = entry.Value.Copy(); } } else { CommonNodeLabelsManager.Node nm = GetNMInNodeSet(nodeId); if (null != nm) { n_1.nms[nodeId] = nm.Copy(); } } } return(map); }
/* * Following methods are used for setting if a node unregistered to RM */ public virtual void DeactivateNode(NodeId nodeId) { try { writeLock.Lock(); // save if we have a node before IDictionary <string, CommonNodeLabelsManager.Host> before = CloneNodeMap(ImmutableSet .Of(nodeId)); CommonNodeLabelsManager.Node nm = GetNMInNodeSet(nodeId); if (null != nm) { if (null == nm.labels) { // When node deactivated, remove the nm from node collection if no // labels explicitly set for this particular nm // Save labels first, we need to remove label->nodes relation later ICollection <string> savedNodeLabels = GetLabelsOnNode(nodeId); // Remove this node in nodes collection Sharpen.Collections.Remove(nodeCollections[nodeId.GetHost()].nms, nodeId); // Remove this node in labels->node RemoveNodeFromLabels(nodeId, savedNodeLabels); } else { // set nm is not running, and its resource = 0 nm.running = false; nm.resource = Resource.NewInstance(0, 0); } } // get the node after edition IDictionary <string, CommonNodeLabelsManager.Host> after = CloneNodeMap(ImmutableSet .Of(nodeId)); UpdateResourceMappings(before, after); } finally { writeLock.Unlock(); } }
public virtual void ReinitializeQueueLabels(IDictionary <string, ICollection <string > > queueToLabels) { try { writeLock.Lock(); // clear before set this.queueCollections.Clear(); foreach (KeyValuePair <string, ICollection <string> > entry in queueToLabels) { string queue = entry.Key; RMNodeLabelsManager.Queue q = new RMNodeLabelsManager.Queue(); this.queueCollections[queue] = q; ICollection <string> labels = entry.Value; if (labels.Contains(Any)) { continue; } Sharpen.Collections.AddAll(q.acccessibleNodeLabels, labels); foreach (CommonNodeLabelsManager.Host host in nodeCollections.Values) { foreach (KeyValuePair <NodeId, CommonNodeLabelsManager.Node> nentry in host.nms) { NodeId nodeId = nentry.Key; CommonNodeLabelsManager.Node nm = nentry.Value; if (nm.running && IsNodeUsableByQueue(GetLabelsByNode(nodeId), q)) { Resources.AddTo(q.resource, nm.resource); } } } } } finally { writeLock.Unlock(); } }