diff --git a/packages/flamenco-manager-go/src/flamenco-manager/flamenco/documents.go b/packages/flamenco-manager-go/src/flamenco-manager/flamenco/documents.go index 047ac4f10eaf97e5df58be86c7843d2a62420cfe..9b4e244c2bb4ae6b250a9ad4da0e8f0cb1511e28 100644 --- a/packages/flamenco-manager-go/src/flamenco-manager/flamenco/documents.go +++ b/packages/flamenco-manager-go/src/flamenco-manager/flamenco/documents.go @@ -12,21 +12,22 @@ type Command struct { } type Task struct { - Id bson.ObjectId `bson:"_id,omitempty" json:"_id,omitempty"` - Etag string `bson:"_etag,omitempty" json:"_etag,omitempty"` - Job bson.ObjectId `bson:"job,omitempty" json:"job"` - Manager bson.ObjectId `bson:"manager,omitempty" json:"manager"` - Project bson.ObjectId `bson:"project,omitempty" json:"project"` - User bson.ObjectId `bson:"user,omitempty" json:"user"` - Name string `bson:"name" json:"name"` - Status string `bson:"status" json:"status"` - Priority int `bson:"priority" json:"priority"` - JobType string `bson:"job_type" json:"job_type"` - Commands []Command `bson:"commands" json:"commands"` - Log string `bson:"log,omitempty" json:"log,omitempty"` - Activity string `bson:"activity,omitempty" json:"activity,omitempty"` - Parents []bson.ObjectId `bson:"parents,omitempty" json:"parents,omitempty"` - Worker string `bson:"worker,omitempty" json:"worker,omitempty"` + Id bson.ObjectId `bson:"_id,omitempty" json:"_id,omitempty"` + Etag string `bson:"_etag,omitempty" json:"_etag,omitempty"` + Job bson.ObjectId `bson:"job,omitempty" json:"job"` + Manager bson.ObjectId `bson:"manager,omitempty" json:"manager"` + Project bson.ObjectId `bson:"project,omitempty" json:"project"` + User bson.ObjectId `bson:"user,omitempty" json:"user"` + Name string `bson:"name" json:"name"` + Status string `bson:"status" json:"status"` + Priority int `bson:"priority" json:"priority"` + JobPriority int `bson:"job_priority" json:"job_priority"` + JobType string `bson:"job_type" json:"job_type"` + Commands []Command `bson:"commands" json:"commands"` + Log string `bson:"log,omitempty" json:"log,omitempty"` + Activity string `bson:"activity,omitempty" json:"activity,omitempty"` + Parents []bson.ObjectId `bson:"parents,omitempty" json:"parents,omitempty"` + Worker string `bson:"worker,omitempty" json:"worker,omitempty"` // Internal bookkeeping WorkerId *bson.ObjectId `bson:"worker_id,omitempty" json:"-"` diff --git a/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler.go b/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler.go index b75e9bdbecc6ab196f421a7ef69706ab0ca050b1..235408715b2f32da58838203c81a764c5364929a 100644 --- a/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler.go +++ b/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler.go @@ -168,6 +168,7 @@ func (ts *TaskScheduler) fetchTaskFromQueueOrManager( M{"$project": M{"task": 1}}, // 9: Sort by priority, with highest prio first. If prio is equal, use newest task. M{"$sort": bson.D{ + {"task.job_priority", -1}, {"task.priority", -1}, {"task._id", 1}, }}, diff --git a/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler_test.go b/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler_test.go index ba5773f5cdc0724a44a6d8c83750e76772fdc9b7..cc819296483b280fefd042069fd05b703e6c7a7c 100644 --- a/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler_test.go +++ b/packages/flamenco-manager-go/src/flamenco-manager/flamenco/scheduler_test.go @@ -141,6 +141,31 @@ func (s *SchedulerTestSuite) TestSchedulerOrderByPriority(t *check.C) { assert.Equal(t, task2.Id.Hex(), json_task.Id.Hex()) } +func (s *SchedulerTestSuite) TestSchedulerOrderByJobPriority(t *check.C) { + // Store task in DB. + task1 := ConstructTestTaskWithPrio("1aaaaaaaaaaaaaaaaaaaaaaa", "sleeping", 50) + task1.JobPriority = 10 + if err := s.db.C("flamenco_tasks").Insert(task1); err != nil { + t.Fatal("Unable to insert test task1", err) + } + task2 := ConstructTestTaskWithPrio("2aaaaaaaaaaaaaaaaaaaaaaa", "sleeping", 100) + task2.JobPriority = 5 + if err := s.db.C("flamenco_tasks").Insert(task2); err != nil { + t.Fatal("Unable to insert test task 2", err) + } + + // Perform HTTP request to the scheduler. + resp_rec := httptest.NewRecorder() + request, _ := http.NewRequest("GET", "/task", nil) + ar := &auth.AuthenticatedRequest{Request: *request, Username: s.worker_lnx.Id.Hex()} + s.sched.ScheduleTask(resp_rec, ar) + + // We should have gotten task 1, because its job has the highest priority. + json_task := Task{} + parseJson(t, resp_rec, 200, &json_task) + assert.Equal(t, task1.Id.Hex(), json_task.Id.Hex()) +} + /** * The failure case, where the TaskScheduler cannot reach the Server to check * the task for updates, is already implicitly handled in the TestVariableReplacement