Skip to content

Commit 189a307

Browse files
committed
[IMP] queue_job: Cancel child jobs when the parent is cancelled
1 parent 80a4185 commit 189a307

File tree

3 files changed

+31
-2
lines changed

3 files changed

+31
-2
lines changed

queue_job/job.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -542,8 +542,8 @@ def perform(self):
542542

543543
return self.result
544544

545-
def enqueue_waiting(self):
546-
sql = """
545+
def _get_common_dependent_jobs_query(self):
546+
return """
547547
UPDATE queue_job
548548
SET state = %s
549549
FROM (
@@ -571,9 +571,17 @@ def enqueue_waiting(self):
571571
AND %s = ALL(jobs.parent_states)
572572
AND state = %s;
573573
"""
574+
575+
def enqueue_waiting(self):
576+
sql = self._get_common_dependent_jobs_query()
574577
self.env.cr.execute(sql, (PENDING, self.uuid, DONE, WAIT_DEPENDENCIES))
575578
self.env["queue.job"].invalidate_cache(["state"])
576579

580+
def cancel_dependent_jobs(self):
581+
sql = self._get_common_dependent_jobs_query()
582+
self.env.cr.execute(sql, (CANCELLED, self.uuid, CANCELLED, WAIT_DEPENDENCIES))
583+
self.env["queue.job"].invalidate_cache(["state"])
584+
577585
def store(self):
578586
"""Store the Job"""
579587
job_model = self.env["queue.job"]

queue_job/models/queue_job.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,8 @@ def _change_job_state(self, state, result=None):
316316
elif state == CANCELLED:
317317
job_.set_cancelled(result=result)
318318
job_.store()
319+
record.env["queue.job"].flush()
320+
job_.cancel_dependent_jobs()
319321
else:
320322
raise ValueError("State not supported: %s" % state)
321323

test_queue_job/tests/test_job.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
RetryableJobError,
1717
)
1818
from odoo.addons.queue_job.job import (
19+
CANCELLED,
1920
DONE,
2021
ENQUEUED,
2122
FAILED,
@@ -549,6 +550,24 @@ def test_button_done_enqueue_waiting_dependencies(self):
549550
self.assertEqual(record_root.state, DONE)
550551
self.assertEqual(record_child.state, PENDING)
551552

553+
def test_button_cancel_dependencies(self):
554+
job_root = Job(self.env["test.queue.job"].testing_method)
555+
job_child = Job(self.env["test.queue.job"].testing_method)
556+
job_child.add_depends({job_root})
557+
558+
DelayableGraph._ensure_same_graph_uuid([job_root, job_child])
559+
job_root.store()
560+
job_child.store()
561+
562+
self.assertEqual(job_child.state, WAIT_DEPENDENCIES)
563+
record_root = job_root.db_record()
564+
record_child = job_child.db_record()
565+
# Trigger button cancelled
566+
record_root.button_cancelled()
567+
# Check the state
568+
self.assertEqual(record_root.state, CANCELLED)
569+
self.assertEqual(record_child.state, CANCELLED)
570+
552571
def test_requeue(self):
553572
stored = self._create_job()
554573
stored.write({"state": "failed"})

0 commit comments

Comments
 (0)