diff --git a/queue_job/jobrunner/runner.py b/queue_job/jobrunner/runner.py
index 46cb3b3d82..04b163bd4a 100644
--- a/queue_job/jobrunner/runner.py
+++ b/queue_job/jobrunner/runner.py
@@ -383,6 +383,17 @@ def __init__(
self._stop = False
self._stop_pipe = os.pipe()
+ def __del__(self):
+ # pylint: disable=except-pass
+ try:
+ os.close(self._stop_pipe[0])
+ except OSError:
+ pass
+ try:
+ os.close(self._stop_pipe[1])
+ except OSError:
+ pass
+
@classmethod
def from_environ_or_config(cls):
scheme = os.environ.get("ODOO_QUEUE_JOB_SCHEME") or queue_job_config.get(
diff --git a/queue_job/models/queue_job.py b/queue_job/models/queue_job.py
index c4f1faaef5..23254fef54 100644
--- a/queue_job/models/queue_job.py
+++ b/queue_job/models/queue_job.py
@@ -89,7 +89,7 @@ class QueueJob(models.Model):
func_string = fields.Char(string="Task", readonly=True)
state = fields.Selection(STATES, readonly=True, required=True, index=True)
- priority = fields.Integer()
+ priority = fields.Integer(aggregator=False)
exc_name = fields.Char(string="Exception", readonly=True)
exc_message = fields.Char(string="Exception Message", readonly=True, tracking=True)
exc_info = fields.Text(string="Exception Info", readonly=True)
diff --git a/queue_job/tests/test_runner_runner.py b/queue_job/tests/test_runner_runner.py
index c6486e27ef..131ce6322d 100644
--- a/queue_job/tests/test_runner_runner.py
+++ b/queue_job/tests/test_runner_runner.py
@@ -3,8 +3,57 @@
# pylint: disable=odoo-addons-relative-import
# we are testing, we want to test as we were an external consumer of the API
+import os
+
+from odoo.tests import BaseCase, tagged
+
from odoo.addons.queue_job.jobrunner import runner
from .common import load_doctests
load_tests = load_doctests(runner)
+
+
+@tagged("-at_install", "post_install")
+class TestRunner(BaseCase):
+ @classmethod
+ def _is_open_file_descriptor(cls, fd):
+ try:
+ os.fstat(fd)
+ return True
+ except OSError:
+ return False
+
+ def test_runner_file_descriptor(self):
+ a_runner = runner.QueueJobRunner.from_environ_or_config()
+
+ read_fd, write_fd = a_runner._stop_pipe
+ self.assertTrue(self._is_open_file_descriptor(read_fd))
+ self.assertTrue(self._is_open_file_descriptor(write_fd))
+
+ del a_runner
+
+ self.assertFalse(self._is_open_file_descriptor(read_fd))
+ self.assertFalse(self._is_open_file_descriptor(write_fd))
+
+ def test_runner_file_closed_read_descriptor(self):
+ a_runner = runner.QueueJobRunner.from_environ_or_config()
+
+ read_fd, write_fd = a_runner._stop_pipe
+ os.close(read_fd)
+
+ del a_runner
+
+ self.assertFalse(self._is_open_file_descriptor(read_fd))
+ self.assertFalse(self._is_open_file_descriptor(write_fd))
+
+ def test_runner_file_closed_write_descriptor(self):
+ a_runner = runner.QueueJobRunner.from_environ_or_config()
+
+ read_fd, write_fd = a_runner._stop_pipe
+ os.close(write_fd)
+
+ del a_runner
+
+ self.assertFalse(self._is_open_file_descriptor(read_fd))
+ self.assertFalse(self._is_open_file_descriptor(write_fd))
diff --git a/queue_job/views/queue_job_views.xml b/queue_job/views/queue_job_views.xml
index ac53afe6a5..94cd9a8047 100644
--- a/queue_job/views/queue_job_views.xml
+++ b/queue_job/views/queue_job_views.xml
@@ -163,6 +163,7 @@
+
@@ -207,6 +208,7 @@
+
@@ -279,6 +281,11 @@
string="State"
context="{'group_by': 'state'}"
/>
+