Skip to content

Commit 381f637

Browse files
petrus-vflorentx
authored andcommitted
[FIX] queue_job: job runner open pipe that are never closed properly
this make a lot of open file descriptors that we got the limit while instentiate jobrunner from queue_job_cron_jobrunner in the current channel implementation OCA#750
1 parent ceb7edf commit 381f637

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

queue_job/jobrunner/runner.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,16 @@ def __init__(
383383
self._stop = False
384384
self._stop_pipe = os.pipe()
385385

386+
def __del__(self):
387+
try:
388+
os.close(self._stop_pipe[0])
389+
except OSError:
390+
pass
391+
try:
392+
os.close(self._stop_pipe[1])
393+
except OSError:
394+
pass
395+
386396
@classmethod
387397
def from_environ_or_config(cls):
388398
scheme = os.environ.get("ODOO_QUEUE_JOB_SCHEME") or queue_job_config.get(

queue_job/tests/test_runner_runner.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,57 @@
33

44
# pylint: disable=odoo-addons-relative-import
55
# we are testing, we want to test as we were an external consumer of the API
6+
import os
7+
8+
from odoo.tests import BaseCase, tagged
9+
610
from odoo.addons.queue_job.jobrunner import runner
711

812
from .common import load_doctests
913

1014
load_tests = load_doctests(runner)
15+
16+
17+
@tagged("-at_install", "post_install")
18+
class TestRunner(BaseCase):
19+
@classmethod
20+
def _is_open_file_descriptor(cls, fd):
21+
try:
22+
os.fstat(fd)
23+
return True
24+
except OSError:
25+
return False
26+
27+
def test_runner_file_descriptor(self):
28+
a_runner = runner.QueueJobRunner.from_environ_or_config()
29+
30+
read_fd, write_fd = a_runner._stop_pipe
31+
self.assertTrue(self._is_open_file_descriptor(read_fd))
32+
self.assertTrue(self._is_open_file_descriptor(write_fd))
33+
34+
del a_runner
35+
36+
self.assertFalse(self._is_open_file_descriptor(read_fd))
37+
self.assertFalse(self._is_open_file_descriptor(write_fd))
38+
39+
def test_runner_file_closed_read_descriptor(self):
40+
a_runner = runner.QueueJobRunner.from_environ_or_config()
41+
42+
read_fd, write_fd = a_runner._stop_pipe
43+
os.close(read_fd)
44+
45+
del a_runner
46+
47+
self.assertFalse(self._is_open_file_descriptor(read_fd))
48+
self.assertFalse(self._is_open_file_descriptor(write_fd))
49+
50+
def test_runner_file_closed_write_descriptor(self):
51+
a_runner = runner.QueueJobRunner.from_environ_or_config()
52+
53+
read_fd, write_fd = a_runner._stop_pipe
54+
os.close(write_fd)
55+
56+
del a_runner
57+
58+
self.assertFalse(self._is_open_file_descriptor(read_fd))
59+
self.assertFalse(self._is_open_file_descriptor(write_fd))

0 commit comments

Comments
 (0)