diff options
| author | Christophe Simonis <chs@odoo.com> | 2018-11-05 17:51:04 +0100 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2018-11-05 17:51:04 +0100 |
| commit | f66a9cdbcf3a9e9cd4afb8abc249ddd23e1b7085 (patch) | |
| tree | ab6a1f6d6b5a3b97719e528568f84edcdd65138d /odoo/service/server.py | |
| parent | ba239e4cacf468705b012c68fb3b96ba400a0030 (diff) | |
| parent | bab5ccfdd7bd2138eb41db325981dc47641678f9 (diff) | |
[MERGE] forward port branch 11.0 up to bab5ccfdd7b
Diffstat (limited to 'odoo/service/server.py')
| -rw-r--r-- | odoo/service/server.py | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/odoo/service/server.py b/odoo/service/server.py index 7d36ec9a3cc..43cf19073e0 100644 --- a/odoo/service/server.py +++ b/odoo/service/server.py @@ -59,6 +59,14 @@ def memory_info(process): pmem = (getattr(process, 'memory_info', None) or process.get_memory_info)() return (pmem.rss, pmem.vms) +def empty_pipe(fd): + try: + while os.read(fd, 1): + pass + except OSError as e: + if e.errno not in [errno.EAGAIN]: + raise + #---------------------------------------------------------- # Werkzeug WSGI servers patched #---------------------------------------------------------- @@ -562,13 +570,7 @@ class PreforkServer(CommonServer): for fd in ready[0]: if fd in fds: fds[fd].watchdog_time = time.time() - try: - # empty pipe - while os.read(fd, 1): - pass - except OSError as e: - if e.errno not in [errno.EAGAIN]: - raise + empty_pipe(fd) except select.error as e: if e.args[0] not in [errno.EINTR]: raise @@ -659,6 +661,7 @@ class Worker(object): self.watchdog_time = time.time() self.watchdog_pipe = multi.pipe_new() self.eintr_pipe = multi.pipe_new() + self.wakeup_fd_r, self.wakeup_fd_w = self.eintr_pipe # Can be set to None if no watchdog is desired. self.watchdog_timeout = multi.timeout self.ppid = os.getpid() @@ -682,8 +685,9 @@ class Worker(object): def sleep(self): try: - wakeup_fd = self.eintr_pipe[0] - select.select([self.multi.socket, wakeup_fd], [], [], self.multi.beat) + select.select([self.multi.socket, self.wakeup_fd_r], [], [], self.multi.beat) + # clear wakeup pipe if we were interrupted + empty_pipe(self.wakeup_fd_r) except select.error as e: if e.args[0] not in [errno.EINTR]: raise @@ -737,7 +741,7 @@ class Worker(object): signal.signal(signal.SIGINT, self.signal_handler) signal.signal(signal.SIGTERM, signal.SIG_DFL) signal.signal(signal.SIGCHLD, signal.SIG_DFL) - signal.set_wakeup_fd(self.eintr_pipe[1]) + signal.set_wakeup_fd(self.wakeup_fd_w) def stop(self): pass @@ -809,8 +813,9 @@ class WorkerCron(Worker): # simulate interruptible sleep with select(wakeup_fd, timeout) try: - wakeup_fd = self.eintr_pipe[0] - select.select([wakeup_fd], [], [], interval) + select.select([self.wakeup_fd_r], [], [], interval) + # clear wakeup pipe if we were interrupted + empty_pipe(self.wakeup_fd_r) except select.error as e: if e.args[0] != errno.EINTR: raise |
