private void AddResourceRequest(Priority priority, string resourceName, Resource capability, T req, bool relaxLocality, string labelExpression) { IDictionary <string, SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo > > remoteRequests = this.remoteRequestsTable[priority]; if (remoteRequests == null) { remoteRequests = new Dictionary <string, SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo > >(); this.remoteRequestsTable[priority] = remoteRequests; if (Log.IsDebugEnabled()) { Log.Debug("Added priority=" + priority); } } SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo> reqMap = remoteRequests [resourceName]; if (reqMap == null) { // capabilities are stored in reverse sorted order. smallest last. reqMap = new SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo>(new AMRMClientImpl.ResourceReverseMemoryThenCpuComparator (this)); remoteRequests[resourceName] = reqMap; } AMRMClientImpl.ResourceRequestInfo resourceRequestInfo = reqMap[capability]; if (resourceRequestInfo == null) { resourceRequestInfo = new AMRMClientImpl.ResourceRequestInfo(this, priority, resourceName , capability, relaxLocality); reqMap[capability] = resourceRequestInfo; } resourceRequestInfo.remoteRequest.SetNumContainers(resourceRequestInfo.remoteRequest .GetNumContainers() + 1); if (relaxLocality) { resourceRequestInfo.containerRequests.AddItem(req); } if (ResourceRequest.Any.Equals(resourceName)) { resourceRequestInfo.remoteRequest.SetNodeLabelExpression(labelExpression); } // Note this down for next interaction with ResourceManager AddResourceRequestToAsk(resourceRequestInfo.remoteRequest); if (Log.IsDebugEnabled()) { Log.Debug("addResourceRequest:" + " applicationId=" + " priority=" + priority.GetPriority () + " resourceName=" + resourceName + " numContainers=" + resourceRequestInfo.remoteRequest .GetNumContainers() + " #asks=" + ask.Count); } }
public override IList <ICollection <T> > GetMatchingRequests(Priority priority, string resourceName, Resource capability) { lock (this) { Preconditions.CheckArgument(capability != null, "The Resource to be requested should not be null " ); Preconditions.CheckArgument(priority != null, "The priority at which to request containers should not be null " ); IList <LinkedHashSet <T> > list = new List <LinkedHashSet <T> >(); IDictionary <string, SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo > > remoteRequests = this.remoteRequestsTable[priority]; if (remoteRequests == null) { return(list); } SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo> reqMap = remoteRequests [resourceName]; if (reqMap == null) { return(list); } AMRMClientImpl.ResourceRequestInfo resourceRequestInfo = reqMap[capability]; if (resourceRequestInfo != null && !resourceRequestInfo.containerRequests.IsEmpty ()) { list.AddItem(resourceRequestInfo.containerRequests); return(list); } // no exact match. Container may be larger than what was requested. // get all resources <= capability. map is reverse sorted. SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo> tailMap = reqMap.TailMap (capability); foreach (KeyValuePair <Resource, AMRMClientImpl.ResourceRequestInfo> entry in tailMap) { if (CanFit(entry.Key, capability) && !entry.Value.containerRequests.IsEmpty()) { // match found that fits in the larger resource list.AddItem(entry.Value.containerRequests); } } // no match found return(list); } }
private void DecResourceRequest(Priority priority, string resourceName, Resource capability, T req) { IDictionary <string, SortedDictionary <Resource, AMRMClientImpl.ResourceRequestInfo > > remoteRequests = this.remoteRequestsTable[priority]; if (remoteRequests == null) { if (Log.IsDebugEnabled()) { Log.Debug("Not decrementing resource as priority " + priority + " is not present in request table" ); } return; } IDictionary <Resource, AMRMClientImpl.ResourceRequestInfo> reqMap = remoteRequests [resourceName]; if (reqMap == null) { if (Log.IsDebugEnabled()) { Log.Debug("Not decrementing resource as " + resourceName + " is not present in request table" ); } return; } AMRMClientImpl.ResourceRequestInfo resourceRequestInfo = reqMap[capability]; if (Log.IsDebugEnabled()) { Log.Debug("BEFORE decResourceRequest:" + " applicationId=" + " priority=" + priority .GetPriority() + " resourceName=" + resourceName + " numContainers=" + resourceRequestInfo .remoteRequest.GetNumContainers() + " #asks=" + ask.Count); } resourceRequestInfo.remoteRequest.SetNumContainers(resourceRequestInfo.remoteRequest .GetNumContainers() - 1); resourceRequestInfo.containerRequests.Remove(req); if (resourceRequestInfo.remoteRequest.GetNumContainers() < 0) { // guard against spurious removals resourceRequestInfo.remoteRequest.SetNumContainers(0); } // send the ResourceRequest to RM even if is 0 because it needs to override // a previously sent value. If ResourceRequest was not sent previously then // sending 0 aught to be a no-op on RM AddResourceRequestToAsk(resourceRequestInfo.remoteRequest); // delete entries from map if no longer needed if (resourceRequestInfo.remoteRequest.GetNumContainers() == 0) { Sharpen.Collections.Remove(reqMap, capability); if (reqMap.Count == 0) { Sharpen.Collections.Remove(remoteRequests, resourceName); } if (remoteRequests.Count == 0) { Sharpen.Collections.Remove(remoteRequestsTable, priority); } } if (Log.IsDebugEnabled()) { Log.Info("AFTER decResourceRequest:" + " applicationId=" + " priority=" + priority .GetPriority() + " resourceName=" + resourceName + " numContainers=" + resourceRequestInfo .remoteRequest.GetNumContainers() + " #asks=" + ask.Count); } }