From 74c14309fb23a52cbfdc3252861cc8d0fcade5af Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Thu, 19 Feb 2026 16:31:17 +0100 Subject: [PATCH 1/3] Skip check of dependencies when a done job has no dependents Every time a job is done, even if it is not part of a graph, it runs a query to look for dependents to enqueue. Storing the dependent uuids in the "dependencies" field was on purpose to know that we have no further jobs in the graph and that we can skip the check entirely and have no overhead in this case. It looks like an oversight, we can add the missing condition. --- queue_job/controllers/main.py | 7 +++++-- queue_job/job.py | 3 +++ test_queue_job/tests/test_dependencies.py | 13 +++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/queue_job/controllers/main.py b/queue_job/controllers/main.py index c98f6305df..fad9e70fa0 100644 --- a/queue_job/controllers/main.py +++ b/queue_job/controllers/main.py @@ -108,6 +108,10 @@ def _try_perform_job(cls, env, job): @classmethod def _enqueue_dependent_jobs(cls, env, job): + if not job.should_check_dependents(): + return + + _logger.debug("%s enqueue depends started", job) tries = 0 while True: try: @@ -136,6 +140,7 @@ def _enqueue_dependent_jobs(cls, env, job): time.sleep(wait_time) else: break + _logger.debug("%s enqueue depends done", job) @classmethod def _runjob(cls, env: api.Environment, job: Job) -> None: @@ -182,9 +187,7 @@ def retry_postpone(job, message, seconds=None): buff.close() raise - _logger.debug("%s enqueue depends started", job) cls._enqueue_dependent_jobs(env, job) - _logger.debug("%s enqueue depends done", job) @classmethod def _get_failure_values(cls, job, traceback_txt, orig_exception): diff --git a/queue_job/job.py b/queue_job/job.py index b6cb190355..96cd6b6c46 100644 --- a/queue_job/job.py +++ b/queue_job/job.py @@ -537,6 +537,9 @@ def _get_common_dependent_jobs_query(self): AND state = %s; """ + def should_check_dependents(self): + return any(self.__reverse_depends_on_uuids) + def enqueue_waiting(self): sql = self._get_common_dependent_jobs_query() self.env.cr.execute(sql, (PENDING, self.uuid, DONE, WAIT_DEPENDENCIES)) diff --git a/test_queue_job/tests/test_dependencies.py b/test_queue_job/tests/test_dependencies.py index 4246fdbeba..d8a9253f00 100644 --- a/test_queue_job/tests/test_dependencies.py +++ b/test_queue_job/tests/test_dependencies.py @@ -287,3 +287,16 @@ def test_depends_graph_uuid_group(self): self.assertTrue(jobs[0].graph_uuid) self.assertTrue(jobs[1].graph_uuid) self.assertEqual(jobs[0].graph_uuid, jobs[1].graph_uuid) + + def test_should_check_dependents(self): + job_root = Job(self.method) + job_a = Job(self.method) + job_a.add_depends({job_root}) + + DelayableGraph._ensure_same_graph_uuid([job_root, job_a]) + + job_root.store() + job_a.store() + + self.assertTrue(job_root.should_check_dependents()) + self.assertFalse(job_a.should_check_dependents()) From ffcaab9de951ad237289b1a725f6f08646435fc9 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier Date: Thu, 19 Feb 2026 17:02:42 +0100 Subject: [PATCH 2/3] Fix dependents error after retryable job error --- queue_job/controllers/main.py | 1 + 1 file changed, 1 insertion(+) diff --git a/queue_job/controllers/main.py b/queue_job/controllers/main.py index fad9e70fa0..2c8a745924 100644 --- a/queue_job/controllers/main.py +++ b/queue_job/controllers/main.py @@ -172,6 +172,7 @@ def retry_postpone(job, message, seconds=None): # traceback in the logs we should have the traceback when all # retries are exhausted env.cr.rollback() + return except (FailedJobError, Exception) as orig_exception: buff = StringIO() From 0c95fd283cdd180ca3807092bb0d8fd13220abb3 Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Tue, 24 Feb 2026 15:22:37 +0000 Subject: [PATCH 3/3] [BOT] post-merge updates --- README.md | 4 ++-- queue_job/README.rst | 2 +- queue_job/__manifest__.py | 2 +- queue_job/static/description/index.html | 2 +- test_queue_job/__manifest__.py | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index ec5dc193cf..04bd3fccf5 100644 --- a/README.md +++ b/README.md @@ -22,12 +22,12 @@ Available addons addon | version | maintainers | summary --- | --- | --- | --- [base_import_async](base_import_async/) | 18.0.1.0.0 | | Import CSV files in the background -[queue_job](queue_job/) | 18.0.2.1.0 | guewen sbidoul | Job Queue +[queue_job](queue_job/) | 18.0.2.1.1 | guewen sbidoul | Job Queue [queue_job_batch](queue_job_batch/) | 18.0.1.0.0 | | Job Queue Batch [queue_job_cron](queue_job_cron/) | 18.0.1.1.1 | | Scheduled Actions as Queue Jobs [queue_job_cron_jobrunner](queue_job_cron_jobrunner/) | 18.0.1.0.1 | ivantodorovich | Run jobs without a dedicated JobRunner [queue_job_subscribe](queue_job_subscribe/) | 18.0.1.0.0 | | Control which users are subscribed to queue job notifications -[test_queue_job](test_queue_job/) | 18.0.2.0.4 | sbidoul | Queue Job Tests +[test_queue_job](test_queue_job/) | 18.0.2.0.5 | sbidoul | Queue Job Tests [test_queue_job_batch](test_queue_job_batch/) | 18.0.1.0.0 | | Test Job Queue Batch [//]: # (end addons) diff --git a/queue_job/README.rst b/queue_job/README.rst index 9dceaf165c..2af46207e0 100644 --- a/queue_job/README.rst +++ b/queue_job/README.rst @@ -11,7 +11,7 @@ Job Queue !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:1087919058419188998ff826b0852e7a275b847d68679ecf8aca3c3fb73ddbac + !! source digest: sha256:facc858dd7edbf8406362311e072519af1a09965e3b1b46f08a64cf4d5971c76 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png diff --git a/queue_job/__manifest__.py b/queue_job/__manifest__.py index e8360a1800..7874dbd65e 100644 --- a/queue_job/__manifest__.py +++ b/queue_job/__manifest__.py @@ -2,7 +2,7 @@ { "name": "Job Queue", - "version": "18.0.2.1.0", + "version": "18.0.2.1.1", "author": "Camptocamp,ACSONE SA/NV,Odoo Community Association (OCA)", "website": "https://github.com/OCA/queue", "license": "LGPL-3", diff --git a/queue_job/static/description/index.html b/queue_job/static/description/index.html index d9ca6fa508..c19d820523 100644 --- a/queue_job/static/description/index.html +++ b/queue_job/static/description/index.html @@ -372,7 +372,7 @@

Job Queue

!! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:1087919058419188998ff826b0852e7a275b847d68679ecf8aca3c3fb73ddbac +!! source digest: sha256:facc858dd7edbf8406362311e072519af1a09965e3b1b46f08a64cf4d5971c76 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

Mature License: LGPL-3 OCA/queue Translate me on Weblate Try me on Runboat

This addon adds an integrated Job Queue to Odoo.

diff --git a/test_queue_job/__manifest__.py b/test_queue_job/__manifest__.py index 449c4c7161..0064305f70 100644 --- a/test_queue_job/__manifest__.py +++ b/test_queue_job/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Queue Job Tests", - "version": "18.0.2.0.4", + "version": "18.0.2.0.5", "author": "Camptocamp,Odoo Community Association (OCA)", "license": "LGPL-3", "category": "Generic Modules",