summaryrefslogtreecommitdiff
path: root/odoo/service/server.py
diff options
context:
space:
mode:
Diffstat (limited to 'odoo/service/server.py')
-rw-r--r--odoo/service/server.py29
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