summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOndřej Kuzník <ondrej.kuznik@credativ.co.uk>2014-08-18 13:35:58 +0100
committerMartin Trigaux <mat@odoo.com>2016-05-26 11:01:42 +0200
commitdbdc8e1ceffc11d80dc336ef471eecffdadd5b02 (patch)
treebc0ae8ab655acd12dc5caac803fd5a3d0c4620ea
parent9c28b6fbfa9344f6cd4a1765ef5d2979cc967957 (diff)
[FIX] server: Do not listen when --no-xmlrpc is set
This is a fix for f04f409943b8bd8f4bd2653e368523d1cc0d8246, which only prevented the workers from being spawned in Prefork mode, while the socket was still being bound to - this is a problem when starting a worker-only server as it cannot coexist with the XMLRPC server on the same machine. Closes #1828
-rw-r--r--openerp/service/server.py34
1 files changed, 20 insertions, 14 deletions
diff --git a/openerp/service/server.py b/openerp/service/server.py
index 46c5c15fe1a..f2d67c000ef 100644
--- a/openerp/service/server.py
+++ b/openerp/service/server.py
@@ -428,7 +428,8 @@ class PreforkServer(CommonServer):
"""
def __init__(self, app):
# config
- self.address = (config['xmlrpc_interface'] or '0.0.0.0', config['xmlrpc_port'])
+ self.address = config['xmlrpc'] and \
+ (config['xmlrpc_interface'] or '0.0.0.0', config['xmlrpc_port'])
self.population = config['workers']
self.timeout = config['limit_time_real']
self.limit_request = config['limit_request']
@@ -603,12 +604,13 @@ class PreforkServer(CommonServer):
signal.signal(signal.SIGQUIT, dumpstacks)
signal.signal(signal.SIGUSR1, log_ormcache_stats)
- # listen to socket
- self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- self.socket.setblocking(0)
- self.socket.bind(self.address)
- self.socket.listen(8 * self.population)
+ if self.address:
+ # listen to socket
+ self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
+ self.socket.setblocking(0)
+ self.socket.bind(self.address)
+ self.socket.listen(8 * self.population)
def stop(self, graceful=True):
if self.long_polling_pid is not None:
@@ -632,7 +634,8 @@ class PreforkServer(CommonServer):
_logger.info("Stopping forcefully")
for pid in self.workers.keys():
self.worker_kill(pid, signal.SIGTERM)
- self.socket.close()
+ if self.socket:
+ self.socket.close()
def run(self, preload, stop):
self.start()
@@ -735,11 +738,13 @@ class Worker(object):
_logger.info("Worker %s (%s) alive", self.__class__.__name__, self.pid)
# Reseed the random number generator
random.seed()
- # Prevent fd inherientence close_on_exec
- flags = fcntl.fcntl(self.multi.socket, fcntl.F_GETFD) | fcntl.FD_CLOEXEC
- fcntl.fcntl(self.multi.socket, fcntl.F_SETFD, flags)
- # reset blocking status
- self.multi.socket.setblocking(0)
+ if self.multi.socket:
+ # Prevent fd inheritance: close_on_exec
+ flags = fcntl.fcntl(self.multi.socket, fcntl.F_GETFD) | fcntl.FD_CLOEXEC
+ fcntl.fcntl(self.multi.socket, fcntl.F_SETFD, flags)
+ # reset blocking status
+ self.multi.socket.setblocking(0)
+
signal.signal(signal.SIGINT, self.signal_handler)
signal.signal(signal.SIGTERM, signal.SIG_DFL)
signal.signal(signal.SIGCHLD, signal.SIG_DFL)
@@ -857,7 +862,8 @@ class WorkerCron(Worker):
def start(self):
os.nice(10) # mommy always told me to be nice with others...
Worker.start(self)
- self.multi.socket.close()
+ if self.multi.socket:
+ self.multi.socket.close()
#----------------------------------------------------------
# start/stop public api