in pkg/scheduler/objects/application.go [1293:1361]
func (sa *Application) tryReservedAllocate(headRoom *resources.Resource, nodeIterator func() NodeIterator) *AllocationResult {
sa.Lock()
defer sa.Unlock()
// calculate the users' headroom, includes group check which requires the applicationID
userHeadroom := ugm.GetUserManager().Headroom(sa.queuePath, sa.ApplicationID, sa.user)
// process all outstanding reservations and pick the first one that fits
for _, reserve := range sa.reservations {
ask := sa.requests[reserve.allocKey]
// sanity check and cleanup if needed
if ask == nil || ask.IsAllocated() {
var unreserveAsk *Allocation
// if the ask was not found we need to construct one to unreserve
if ask == nil {
unreserveAsk = &Allocation{
allocationKey: reserve.allocKey,
applicationID: sa.ApplicationID,
allocLog: make(map[string]*AllocationLogEntry),
}
} else {
unreserveAsk = ask
}
// remove the reservation as this should not be reserved
return newUnreservedAllocationResult(reserve.nodeID, unreserveAsk)
}
if !sa.checkHeadRooms(ask, userHeadroom, headRoom) {
continue
}
// Do we need a specific node?
if ask.GetRequiredNode() != "" {
if !reserve.node.CanAllocate(ask.GetAllocatedResource()) && !ask.HasTriggeredPreemption() {
sa.tryRequiredNodePreemption(reserve, ask)
continue
}
}
// check allocation possibility
// we don't care about predicate error messages here
result, _ := sa.tryNode(reserve.node, ask) //nolint:errcheck
// allocation worked fix the resultType and return
if result != nil {
result.ResultType = AllocatedReserved
return result
}
}
// try this on all other nodes
for _, reserve := range sa.reservations {
// Other nodes cannot be tried if a required node is requested
alloc := reserve.alloc
if alloc.GetRequiredNode() != "" {
continue
}
iterator := nodeIterator()
if iterator != nil {
if !sa.checkHeadRooms(alloc, userHeadroom, headRoom) {
continue
}
result := sa.tryNodesNoReserve(alloc, iterator, reserve.nodeID)
// have a candidate return it, including the node that was reserved
if result != nil {
return result
}
}
}
return nil
}