Skip to content

Commit 4dec0b6

Browse files
committed
[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 813ad66 commit 4dec0b6

File tree

2 files changed

+36
-0
lines changed

2 files changed

+36
-0
lines changed

queue_job/jobrunner/runner.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,16 @@ def __init__(
367367
self._stop = False
368368
self._stop_pipe = os.pipe()
369369

370+
def __del__(self):
371+
try:
372+
os.close(self._stop_pipe[0])
373+
except OSError:
374+
pass
375+
try:
376+
os.close(self._stop_pipe[1])
377+
except OSError:
378+
pass
379+
370380
@classmethod
371381
def from_environ_or_config(cls):
372382
scheme = os.environ.get("ODOO_QUEUE_JOB_SCHEME") or queue_job_config.get(

queue_job/tests/test_runner_runner.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,34 @@
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+
def test_runner_file_descriptor(self):
20+
def is_fd_open(fd):
21+
try:
22+
os.fstat(fd) # Vérifie si le fd est valide
23+
return True # Pas d'erreur => le fd est ouvert
24+
except OSError:
25+
return False # Erreur => le fd est fermé
26+
27+
a_runner = runner.QueueJobRunner.from_environ_or_config()
28+
29+
read_fd, write_fd = a_runner._stop_pipe
30+
self.assertTrue(is_fd_open(read_fd))
31+
self.assertTrue(is_fd_open(write_fd))
32+
33+
del a_runner
34+
35+
self.assertFalse(is_fd_open(read_fd))
36+
self.assertFalse(is_fd_open(write_fd))

0 commit comments

Comments
 (0)