diff --git a/openerp/cli/server.py b/openerp/cli/server.py index dee78cda4e9..dbb77d72ca6 100644 --- a/openerp/cli/server.py +++ b/openerp/cli/server.py @@ -231,6 +231,7 @@ def main(args): openerp.tools.config.parse_config(args) if openerp.tools.config.options["gevent"]: + openerp.evented = True _logger.info('Using gevent mode') import gevent.monkey gevent.monkey.patch_all() @@ -240,9 +241,6 @@ def main(args): check_postgres_user() openerp.netsvc.init_logger() report_configuration() - - if openerp.tools.config.options["gevent"]: - _logger.info('Using gevent mode') config = openerp.tools.config diff --git a/openerp/service/__init__.py b/openerp/service/__init__.py index a65a46b640f..5be0d29df2a 100644 --- a/openerp/service/__init__.py +++ b/openerp/service/__init__.py @@ -34,6 +34,7 @@ import web_services import web_services import wsgi_server +import openerp import openerp.modules import openerp.netsvc import openerp.osv @@ -91,13 +92,13 @@ def start_services(): # Start the WSGI server. wsgi_server.start_service() # Start the main cron thread. - if not openerp.tools.config.options["gevent"]: + if not openerp.evented: cron.start_service() def stop_services(): """ Stop all services. """ # stop services - if not openerp.tools.config.options["gevent"]: + if not openerp.evented: cron.stop_service() netrpc_server.stop_service() wsgi_server.stop_service() diff --git a/openerp/service/workers.py b/openerp/service/workers.py index 29ae9de10c0..3e8df86fede 100644 --- a/openerp/service/workers.py +++ b/openerp/service/workers.py @@ -35,6 +35,7 @@ class Multicorn(object): def __init__(self, app): # config self.address = (config['xmlrpc_interface'] or '0.0.0.0', config['xmlrpc_port']) + self.long_polling_address = (config['xmlrpc_interface'] or '0.0.0.0', config['longpolling_port']) self.population = config['workers'] self.timeout = config['limit_time_real'] self.limit_request = config['limit_request'] @@ -132,7 +133,8 @@ class Multicorn(object): def process_timeout(self): now = time.time() for (pid, worker) in self.workers.items(): - if now - worker.watchdog_time >= worker.watchdog_timeout: + if (worker.watchdog_timeout is not None) and \ + (now - worker.watchdog_time >= worker.watchdog_timeout): _logger.error("Worker (%s) timeout", pid) self.worker_kill(pid, signal.SIGKILL) @@ -185,7 +187,7 @@ class Multicorn(object): self.long_polling_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.long_polling_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.long_polling_socket.setblocking(0) - self.long_polling_socket.bind(('0.0.0.0', 8072)) + self.long_polling_socket.bind(self.long_polling_address) self.long_polling_socket.listen(8) def stop(self, graceful=True): @@ -230,6 +232,7 @@ class Worker(object): self.multi = multi self.watchdog_time = time.time() self.watchdog_pipe = multi.pipe_new() + # Can be set to None if no watchdog is desired. self.watchdog_timeout = multi.timeout self.ppid = os.getpid() self.pid = None @@ -345,8 +348,13 @@ class WorkerHTTP(Worker): class WorkerLongPolling(Worker): """ Long polling workers """ + def __init__(self, multi): + super(WorkerLongPolling, self).__init__(multi) + # Disable the watchdog feature for this kind of worker. + self.watchdog_timeout = None + def start(self): - config.options["gevent"] = True + openerp.evented = True _logger.info('Using gevent mode') import gevent.monkey gevent.monkey.patch_all() diff --git a/openerp/service/wsgi_server.py b/openerp/service/wsgi_server.py index 85f71ba26f4..f8b73ac30f2 100644 --- a/openerp/service/wsgi_server.py +++ b/openerp/service/wsgi_server.py @@ -418,7 +418,7 @@ def serve(interface, port, threaded): """ global httpd - if not openerp.tools.config.options["gevent"]: + if not openerp.evented: httpd = werkzeug.serving.make_server(interface, port, application, threaded=threaded) else: from gevent.wsgi import WSGIServer diff --git a/openerp/tools/config.py b/openerp/tools/config.py index b212eedc7c9..185d1bffee1 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -121,6 +121,8 @@ class configmanager(object): help="disable the XML-RPC protocol") group.add_option("--proxy-mode", dest="proxy_mode", action="store_true", my_default=False, help="Enable correct behavior when behind a reverse proxy") + group.add_option("--longpolling-port", dest="longpolling_port", my_default=8072, + help="specify the TCP port for longpolling requests", type="int") parser.add_option_group(group) # XML-RPC / HTTPS @@ -378,7 +380,8 @@ class configmanager(object): self.options['pidfile'] = False # if defined dont take the configfile value even if the defined value is None - keys = ['xmlrpc_interface', 'xmlrpc_port', 'db_name', 'db_user', 'db_password', 'db_host', + keys = ['xmlrpc_interface', 'xmlrpc_port', 'longpolling_port', + 'db_name', 'db_user', 'db_password', 'db_host', 'db_port', 'db_template', 'logfile', 'pidfile', 'smtp_port', 'email_from', 'smtp_server', 'smtp_user', 'smtp_password', 'netrpc_interface', 'netrpc_port', 'db_maxconn', 'import_partial', 'addons_path',