func (s *DiegoScheduler) createLrpTaskInfo(slaveId *mesos.SlaveID, lrpAuction *auctiontypes.LRPAuction) *mesos.TaskInfo { work, _ := json.Marshal(rep.Work{LRPs: []rep.LRP{lrpAuction.LRP}, Tasks: []rep.Task{}}) taskId := mesos.TaskID{Value: proto.String(lrpAuction.Identifier())} taskInfo := mesos.TaskInfo{ Name: proto.String(lrpAuction.Identifier()), TaskId: &taskId, SlaveId: slaveId, Executor: s.executor, Resources: []*mesos.Resource{ util.NewScalarResource("cpus", taskCpuAllocation), // TODO: ?? util.NewScalarResource("mem", float64(lrpAuction.MemoryMB)), util.NewScalarResource("disk", float64(lrpAuction.DiskMB)), }, Data: work, } return &taskInfo }
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 }