/*
  * 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();
     }
 }