in pkg/scheduler/objects/queue.go [1528:1579]
func (sq *Queue) TryReservedAllocate(iterator func() NodeIterator) *AllocationResult {
if sq.IsLeafQueue() {
// skip if it has no reservations
reservedCopy := sq.GetReservedApps()
if len(reservedCopy) != 0 {
// get the headroom
headRoom := sq.getHeadRoom()
// process the apps
for appID, numRes := range reservedCopy {
if numRes > 1 {
log.Log(log.SchedQueue).Debug("multiple reservations found for application trying to allocate one",
zap.String("appID", appID),
zap.Int("reservations", numRes))
}
app := sq.GetApplication(appID)
if app == nil {
log.Log(log.SchedQueue).Debug("reservation(s) found but application did not exist in queue",
zap.String("queueName", sq.QueuePath),
zap.String("appID", appID))
return nil
}
if app.IsAccepted() && (!sq.canRunApp(appID) || !ugm.GetUserManager().CanRunApp(sq.QueuePath, appID, app.user)) {
continue
}
result := app.tryReservedAllocate(headRoom, iterator)
if result != nil {
log.Log(log.SchedQueue).Info("reservation found for allocation found on queue",
zap.String("queueName", sq.QueuePath),
zap.String("appID", appID),
zap.Stringer("resultType", result.ResultType),
zap.Stringer("allocation", result.Request),
zap.String("appStatus", app.CurrentState()))
// if the app is still in Accepted state we're allocating placeholders.
// we want to count these apps as running
if app.IsAccepted() {
sq.setAllocatingAccepted(app.ApplicationID)
}
return result
}
}
}
} else {
// process the child queues (filters out queues that have no pending requests)
for _, child := range sq.sortQueues() {
result := child.TryReservedAllocate(iterator)
if result != nil {
return result
}
}
}
return nil
}