diff --git a/beat/web/backend/schedule.py b/beat/web/backend/schedule.py index 170d36e9ff06101be8e42cc37effef861e770f8d..bcc4f2e86e91f6a715cbee1b2871d961a3292345 100644 --- a/beat/web/backend/schedule.py +++ b/beat/web/backend/schedule.py @@ -71,7 +71,8 @@ def _select_splits_for_queue(queue): ''' splits = JobSplit.objects.filter(job__block__queue=queue, - job__split_errors=0, status=Job.QUEUED).order_by('job__runnable_date') + worker__isnull=True, job__split_errors=0, + status=Job.QUEUED).order_by('job__runnable_date') # lists of all users currently running users = set(splits.values_list('job__block__experiment__author', flat=True)) diff --git a/beat/web/backend/tests.py b/beat/web/backend/tests.py index 936ca5c93b98ed5abf149d764371c4caab190b89..9379638ef022b0dbf9f987f982df3fb355c1a83c 100644 --- a/beat/web/backend/tests.py +++ b/beat/web/backend/tests.py @@ -840,6 +840,25 @@ class Scheduling(BaseBackendTestCase): self.assertEqual(worker.available_cores(), qsetup.CORES) + def test_does_not_reassign(self): + + # tests if the scheduling routine never re-assigns splits which are + # already assigned. + + fullname = 'user/user/single/1/single' + xp = Experiment.objects.get(name=fullname.split(os.sep)[-1]) + + # schedules the experiment and check it + xp.schedule() + self.check_single(xp) + assigned_splits = schedule() + + self.assertEqual(len(assigned_splits), 1) + + assigned_splits = schedule() + self.assertEqual(len(assigned_splits), 0) + + def test_worker_activation(self): # tests that scheduling depends on worker activation