From 45c14b64afcd901570293b414e2ea6fc5a4386cc Mon Sep 17 00:00:00 2001
From: Andre Anjos <andre.dos.anjos@gmail.com>
Date: Thu, 28 Apr 2016 14:21:47 +0200
Subject: [PATCH] [backend] Test and fix scheduler re-assignment

---
 beat/web/backend/schedule.py |  3 ++-
 beat/web/backend/tests.py    | 19 +++++++++++++++++++
 2 files changed, 21 insertions(+), 1 deletion(-)

diff --git a/beat/web/backend/schedule.py b/beat/web/backend/schedule.py
index 170d36e9f..bcc4f2e86 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 936ca5c93..9379638ef 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
-- 
GitLab