func (s *Scheduler) scheduleLRPAuction(lrpAuction *auctiontypes.LRPAuction) (*auctiontypes.LRPAuction, error) { var winnerCell *Cell winnerScore := 1e20 zones := accumulateZonesByInstances(s.zones, lrpAuction.ProcessGuid) filteredZones := filterZonesByRootFS(zones, lrpAuction.RootFs) if len(filteredZones) == 0 { return nil, auctiontypes.ErrorCellMismatch } sortedZones := sortZonesByInstances(filteredZones) for zoneIndex, lrpByZone := range sortedZones { for _, cell := range lrpByZone.zone { score, err := cell.ScoreForLRP(&lrpAuction.LRP, s.startingContainerWeight) if err != nil { continue } if score < winnerScore { winnerScore = score winnerCell = cell } } // if (not last zone) && (this zone has the same # of instances as the next sorted zone) // acts as a tie breaker if zoneIndex+1 < len(sortedZones) && lrpByZone.instances == sortedZones[zoneIndex+1].instances { continue } if winnerCell != nil { break } } if winnerCell == nil { return nil, rep.ErrorInsufficientResources } err := winnerCell.ReserveLRP(&lrpAuction.LRP) if err != nil { s.logger.Error("lrp-failed-to-reserve-cell", err, lager.Data{"cell-guid": winnerCell.Guid, "lrp-guid": lrpAuction.Identifier()}) return nil, err } winningAuction := lrpAuction.Copy() winningAuction.Winner = winnerCell.Guid return &winningAuction, nil }