diff --git a/arkindex/process/api.py b/arkindex/process/api.py index 33c7bfb96df8ac446625e6a5f25616f0ed897b54..fbac429efb80c9c2bd2e2547a838520b864d80cf 100644 --- a/arkindex/process/api.py +++ b/arkindex/process/api.py @@ -2167,7 +2167,17 @@ class SelectProcessFailures(ProcessACLMixin, CreateAPIView): .annotate(has_non_final_tasks=Exists( Task .objects - .filter(process=OuterRef("pk")) + .filter( + process=OuterRef("pk"), + # Only look for tasks in the last run of the process + run=( + Task.objects + .filter(process=OuterRef(OuterRef("pk"))) + .values("process") + .annotate(last_run=Max("run")) + .values("last_run")[:1] + ) + ) .exclude(state__in=FINAL_STATES) )) ) diff --git a/arkindex/process/tests/test_processes.py b/arkindex/process/tests/test_processes.py index fa0537f20cef227c65ea7582355e2901dea96534..45b685cb64ff430dc3eb4b114c2de07ffe9da6e2 100644 --- a/arkindex/process/tests/test_processes.py +++ b/arkindex/process/tests/test_processes.py @@ -11,7 +11,7 @@ from rest_framework import status from rq.job import Job from arkindex.documents.models import Corpus, ElementType -from arkindex.ponos.models import Farm, State +from arkindex.ponos.models import ACTIVE_STATES, Farm, State from arkindex.process.models import ( ActivityState, ArkindexFeature, @@ -2991,19 +2991,13 @@ class TestProcesses(FixtureAPITestCase): ) def test_select_failed_elts_requires_finished_state(self): - unfinished_states = { - State.Running, - State.Stopping, - State.Pending, - State.Unscheduled, - } self.elts_process.run() self.assertEqual(self.elts_process.tasks.get().run, 0) self.elts_process.activity_state = ActivityState.Ready self.elts_process.save() self.client.force_login(self.user) - for state in unfinished_states: + for state in ACTIVE_STATES: with self.subTest(state=state): self.elts_process.tasks.update(state=state) self.assertEqual(self.elts_process.state, state) @@ -3045,9 +3039,15 @@ class TestProcesses(FixtureAPITestCase): ) def test_select_failed_elts(self): + # Failures in a previous run should not prevent calling this endpoint self.elts_process.run() - self.assertEqual(self.elts_process.tasks.get().run, 0) - self.elts_process.tasks.update(state=State.Completed) + self.elts_process.tasks.update(state=State.Error) + # Reload the prefetched worker runs because a new init_elements run was created + # and running again would try to recreate it + self.elts_process.refresh_from_db() + self.elts_process.run() + self.elts_process.tasks.filter(run=1).update(state=State.Completed) + self.elts_process.activity_state = ActivityState.Ready self.elts_process.save()