Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions queue_job/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -132,6 +132,19 @@ Configuration
.. [1] It works with the threaded Odoo server too, although this way
of running Odoo is obviously not for production purposes.

* Be sure to check out *Jobs Garbage Collector* CRON and change *enqueued_delta* and *started_delta* parameters to your needs.

* ``enqueued_delta``: Spent time in minutes after which an enqueued job is considered stuck.
Set it to 0 to disable this check.
* ``started_delta``: Spent time in minutes after which a started job is considered stuck.
This parameter should not be less than ``--limit-time-real // 60`` parameter in your configuration.
Set it to 0 to disable this check. Set it to -1 to automate it, based in the server's ``--limit-time-real`` config parameter.

.. code-block:: python

# `model` corresponds to 'queue.job' model
model.requeue_stuck_jobs(enqueued_delta=1, started_delta=-1)

Usage
=====

Expand Down
4 changes: 3 additions & 1 deletion queue_job/data/queue_data.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,9 @@
<field name="numbercall">-1</field>
<field ref="model_queue_job" name="model_id" />
<field name="state">code</field>
<field name="code">model.requeue_stuck_jobs()</field>
<field
name="code"
>model.requeue_stuck_jobs(enqueued_delta=1, started_delta=-1)</field>
</record>
<!-- Queue-job-related subtypes for messaging / Chatter -->
<record id="mt_job_failed" model="mail.message.subtype">
Expand Down
17 changes: 10 additions & 7 deletions queue_job/models/queue_job.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,7 @@ def button_cancelled(self):
def requeue(self):
jobs_to_requeue = self.filtered(lambda job_: job_.state != WAIT_DEPENDENCIES)
jobs_to_requeue._change_job_state(PENDING)
return True
return jobs_to_requeue

def _message_post_on_failure(self):
# subscribe the users now to avoid to subscribe them
Expand Down Expand Up @@ -417,20 +417,23 @@ def autovacuum(self):
break
return True

def requeue_stuck_jobs(self, enqueued_delta=5, started_delta=0):
def requeue_stuck_jobs(self, enqueued_delta=1, started_delta=0):
"""Fix jobs that are in a bad states

:param in_queue_delta: lookup time in minutes for jobs
that are in enqueued state
that are in enqueued state,
0 means that it is not checked

:param started_delta: lookup time in minutes for jobs
that are in enqueued state,
0 means that it is not checked
that are in started state,
0 means that it is not checked,
-1 will use `--limit-time-real` config value
"""
self._get_stuck_jobs_to_requeue(
if started_delta == -1:
started_delta = (config["limit_time_real"] // 60) + 1
return self._get_stuck_jobs_to_requeue(
enqueued_delta=enqueued_delta, started_delta=started_delta
).requeue()
return True

def _get_stuck_jobs_domain(self, queue_dl, started_dl):
domain = []
Expand Down
13 changes: 13 additions & 0 deletions queue_job/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,16 @@

.. [1] It works with the threaded Odoo server too, although this way
of running Odoo is obviously not for production purposes.

* Be sure to check out *Jobs Garbage Collector* CRON and change *enqueued_delta* and *started_delta* parameters to your needs.

* ``enqueued_delta``: Spent time in minutes after which an enqueued job is considered stuck.
Set it to 0 to disable this check.
* ``started_delta``: Spent time in minutes after which a started job is considered stuck.
This parameter should not be less than ``--limit-time-real // 60`` parameter in your configuration.
Set it to 0 to disable this check. Set it to -1 to automate it, based in the server's ``--limit-time-real`` config parameter.

.. code-block:: python

# `model` corresponds to 'queue.job' model
model.requeue_stuck_jobs(enqueued_delta=1, started_delta=-1)
27 changes: 23 additions & 4 deletions queue_job/static/description/index.html
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
Expand All @@ -8,10 +9,11 @@

/*
:Author: David Goodger (goodger@python.org)
:Id: $Id: html4css1.css 8954 2022-01-20 10:10:25Z milde $
:Id: $Id: html4css1.css 9511 2024-01-13 09:50:07Z milde $
:Copyright: This stylesheet has been placed in the public domain.

Default cascading style sheet for the HTML output of Docutils.
Despite the name, some widely supported CSS2 features are used.

See https://docutils.sourceforge.io/docs/howto/html-stylesheets.html for how to
customize this style sheet.
Expand Down Expand Up @@ -274,7 +276,7 @@
margin-left: 2em ;
margin-right: 2em }

pre.code .ln { color: grey; } /* line numbers */
pre.code .ln { color: gray; } /* line numbers */
pre.code, code { background-color: #eeeeee }
pre.code .comment, code .comment { color: #5C6576 }
pre.code .keyword, code .keyword { color: #3B0D06; font-weight: bold }
Expand All @@ -300,7 +302,7 @@
span.pre {
white-space: pre }

span.problematic {
span.problematic, pre.problematic {
color: red }

span.section-subtitle {
Expand Down Expand Up @@ -491,6 +493,21 @@ <h1><a class="toc-backref" href="#toc-entry-2">Configuration</a></h1>
of running Odoo is obviously not for production purposes.</td></tr>
</tbody>
</table>
<ul>
<li><p class="first">Be sure to check out <em>Jobs Garbage Collector</em> CRON and change <em>enqueued_delta</em> and <em>started_delta</em> parameters to your needs.</p>
<ul class="simple">
<li><tt class="docutils literal">enqueued_delta</tt>: Spent time in minutes after which an enqueued job is considered stuck.
Set it to 0 to disable this check.</li>
<li><tt class="docutils literal">started_delta</tt>: Spent time in minutes after which a started job is considered stuck.
This parameter should not be less than <tt class="docutils literal"><span class="pre">--limit-time-real</span> // 60</tt> parameter in your configuration.
Set it to 0 to disable this check. Set it to -1 to automate it, based in the server’s <tt class="docutils literal"><span class="pre">--limit-time-real</span></tt> config parameter.</li>
</ul>
<pre class="code python literal-block">
<span class="c1"># `model` corresponds to 'queue.job' model</span><span class="w">
</span><span class="n">model</span><span class="o">.</span><span class="n">requeue_stuck_jobs</span><span class="p">(</span><span class="n">enqueued_delta</span><span class="o">=</span><span class="mi">1</span><span class="p">,</span> <span class="n">started_delta</span><span class="o">=-</span><span class="mi">1</span><span class="p">)</span>
</pre>
</li>
</ul>
</div>
<div class="section" id="usage">
<h1><a class="toc-backref" href="#toc-entry-3">Usage</a></h1>
Expand Down Expand Up @@ -939,7 +956,9 @@ <h2><a class="toc-backref" href="#toc-entry-17">Contributors</a></h2>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#toc-entry-18">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<a class="reference external image-reference" href="https://odoo-community.org">
<img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" />
</a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.</p>
Expand Down