From 1e1b85e95b307f6eb61c46ae9149bf96a46f9145 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 22 Sep 2012 14:43:54 +0200 Subject: [PATCH 01/12] gevent first try bzr revid: al@openerp.com-20120922124354-unk1u8a9anst5hwo --- openerp-server | 6 ++++++ openerp/service/__init__.py | 3 ++- openerp/service/wsgi_server.py | 5 ++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/openerp-server b/openerp-server index 9025e2d50c2..4d28a4cb759 100755 --- a/openerp-server +++ b/openerp-server @@ -223,6 +223,12 @@ def main(): check_root_user() openerp.tools.config.parse_config(sys.argv[1:]) + # TODO GEVENT if event + import gevent.monkey + gevent.monkey.patch_all() + import gevent_psycopg2 + gevent_psycopg2.monkey_patch() + check_postgres_user() openerp.netsvc.init_logger() report_configuration() diff --git a/openerp/service/__init__.py b/openerp/service/__init__.py index 30a765b1f60..d3a57135284 100644 --- a/openerp/service/__init__.py +++ b/openerp/service/__init__.py @@ -86,7 +86,8 @@ def start_services(): netrpc_server.init_servers() # Start the main cron thread. - openerp.cron.start_master_thread() + # TODO GEVENT if event use greenlet in cron + # openerp.cron.start_master_thread() # Start the top-level servers threads (normally HTTP, HTTPS, and NETRPC). openerp.netsvc.Server.startAll() diff --git a/openerp/service/wsgi_server.py b/openerp/service/wsgi_server.py index 61556974a00..d15d423818b 100644 --- a/openerp/service/wsgi_server.py +++ b/openerp/service/wsgi_server.py @@ -424,7 +424,10 @@ def serve(): # TODO Change the xmlrpc_* options to http_* interface = config['xmlrpc_interface'] or '0.0.0.0' port = config['xmlrpc_port'] - httpd = werkzeug.serving.make_server(interface, port, application, threaded=True) + #httpd = werkzeug.serving.make_server(interface, port, application, threaded=True) + # TODO GEVENT if event + from gevent.wsgi import WSGIServer + httpd = WSGIServer((interface, port), application) _logger.info('HTTP service (werkzeug) running on %s:%s', interface, port) httpd.serve_forever() From 966cadcdd66dc9518a389d54eece1cc49a9ee247 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 15 Nov 2012 15:47:28 +0100 Subject: [PATCH 02/12] Put back cron thread bzr revid: nicolas.vanhoren@openerp.com-20121115144728-0ts5h9m7873892fd --- openerp/service/__init__.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/openerp/service/__init__.py b/openerp/service/__init__.py index 6e3de89ddff..11fe45aaf31 100644 --- a/openerp/service/__init__.py +++ b/openerp/service/__init__.py @@ -82,10 +82,8 @@ def start_services(): # Initialize the HTTP stack. netrpc_server.init_servers() - # Start the main cron thread. - # TODO GEVENT if event use greenlet in cron - #if openerp.conf.max_cron_threads: - # openerp.cron.start_master_thread() + if openerp.conf.max_cron_threads: + openerp.cron.start_master_thread() # Start the top-level servers threads (normally HTTP, HTTPS, and NETRPC). openerp.netsvc.Server.startAll() From 468652ccf7802f2b39a95144aca9e7eeb51dbca5 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 16 Nov 2012 10:41:18 +0100 Subject: [PATCH 03/12] Had to remove the cron again bzr revid: nicolas.vanhoren@openerp.com-20121116094118-ph3oxmwr5qhcp3c7 --- openerp/service/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/service/__init__.py b/openerp/service/__init__.py index 11fe45aaf31..9f5a7a03009 100644 --- a/openerp/service/__init__.py +++ b/openerp/service/__init__.py @@ -83,7 +83,8 @@ def start_services(): netrpc_server.init_servers() if openerp.conf.max_cron_threads: - openerp.cron.start_master_thread() + #openerp.cron.start_master_thread() + pass # Start the top-level servers threads (normally HTTP, HTTPS, and NETRPC). openerp.netsvc.Server.startAll() From 7137bb0b53f38d1a600d47d0b7b9ec83a824337f Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 22 Nov 2012 15:53:09 +0100 Subject: [PATCH 04/12] [IMP] Added configuration option for gevent bzr revid: nicolas.vanhoren@openerp.com-20121122145309-bim6m10p0q7rf6wj --- openerp-server | 14 +++++++++----- openerp/service/__init__.py | 6 +++--- openerp/service/wsgi_server.py | 9 +++++---- openerp/tools/config.py | 3 ++- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/openerp-server b/openerp-server index f0a858bbe2c..73586e58890 100755 --- a/openerp-server +++ b/openerp-server @@ -224,15 +224,19 @@ def main(): check_root_user() openerp.tools.config.parse_config(sys.argv[1:]) - # TODO GEVENT if event - import gevent.monkey - gevent.monkey.patch_all() - import gevent_psycopg2 - gevent_psycopg2.monkey_patch() + if openerp.tools.config.options["gevent"]: + _logger.info('Using gevent mode') + import gevent.monkey + gevent.monkey.patch_all() + import gevent_psycopg2 + gevent_psycopg2.monkey_patch() 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 9f5a7a03009..154a93df001 100644 --- a/openerp/service/__init__.py +++ b/openerp/service/__init__.py @@ -82,9 +82,9 @@ def start_services(): # Initialize the HTTP stack. netrpc_server.init_servers() - if openerp.conf.max_cron_threads: - #openerp.cron.start_master_thread() - pass + if not openerp.tools.config.options["gevent"]: + if openerp.conf.max_cron_threads: + openerp.cron.start_master_thread() # Start the top-level servers threads (normally HTTP, HTTPS, and NETRPC). openerp.netsvc.Server.startAll() diff --git a/openerp/service/wsgi_server.py b/openerp/service/wsgi_server.py index 8018657fd28..00ad54575b1 100644 --- a/openerp/service/wsgi_server.py +++ b/openerp/service/wsgi_server.py @@ -424,10 +424,11 @@ def serve(): # TODO Change the xmlrpc_* options to http_* interface = config['xmlrpc_interface'] or '0.0.0.0' port = config['xmlrpc_port'] - #httpd = werkzeug.serving.make_server(interface, port, application, threaded=True) - # TODO GEVENT if event - from gevent.wsgi import WSGIServer - httpd = WSGIServer((interface, port), application) + if not openerp.tools.config.options["gevent"]: + httpd = werkzeug.serving.make_server(interface, port, application, threaded=True) + else: + from gevent.wsgi import WSGIServer + httpd = WSGIServer((interface, port), application) _logger.info('HTTP service (werkzeug) running on %s:%s', interface, port) httpd.serve_forever() diff --git a/openerp/tools/config.py b/openerp/tools/config.py index 56f1e5c7b83..e037bf7a6ac 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -106,6 +106,7 @@ class configmanager(object): help="specify additional addons paths (separated by commas).", action="callback", callback=self._check_addons_path, nargs=1, type="string") group.add_option("--load", dest="server_wide_modules", help="Comma-separated list of server-wide modules default=web") + group.add_option("--gevent", dest="gevent", action="store_true", my_default=False, help="Activate the GEvent mode, this also desactivate the cron.") parser.add_option_group(group) # XML-RPC / HTTP @@ -380,7 +381,7 @@ class configmanager(object): 'netrpc', 'xmlrpc', 'syslog', 'without_demo', 'timezone', 'xmlrpcs_interface', 'xmlrpcs_port', 'xmlrpcs', 'static_http_enable', 'static_http_document_root', 'static_http_url_prefix', - 'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level' + 'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level', 'gevent' ] for arg in keys: From c3cb554ab06df9bee9242dbf30bb0117d7751f03 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 22 Nov 2012 16:06:01 +0100 Subject: [PATCH 05/12] Improved config bzr revid: nicolas.vanhoren@openerp.com-20121122150601-7wha9rao9ix2myvv --- openerp/tools/config.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/tools/config.py b/openerp/tools/config.py index e037bf7a6ac..7e5b3e0f334 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -381,7 +381,7 @@ class configmanager(object): 'netrpc', 'xmlrpc', 'syslog', 'without_demo', 'timezone', 'xmlrpcs_interface', 'xmlrpcs_port', 'xmlrpcs', 'static_http_enable', 'static_http_document_root', 'static_http_url_prefix', - 'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level', 'gevent' + 'secure_cert_file', 'secure_pkey_file', 'dbfilter', 'log_handler', 'log_level' ] for arg in keys: @@ -400,7 +400,7 @@ class configmanager(object): 'list_db', 'xmlrpcs', 'proxy_mode', 'test_file', 'test_enable', 'test_commit', 'test_report_directory', 'osv_memory_count_limit', 'osv_memory_age_limit', 'max_cron_threads', 'unaccent', - 'workers', 'limit_memory_hard', 'limit_memory_soft', 'limit_time_cpu', 'limit_time_real', 'limit_request' + 'workers', 'limit_memory_hard', 'limit_memory_soft', 'limit_time_cpu', 'limit_time_real', 'limit_request', 'gevent' ] for arg in keys: From 383314f27381573294351060c7b6a7e01ec075a5 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 10 Jan 2013 17:19:36 +0100 Subject: [PATCH 06/12] First version working with multicorn bzr revid: nicolas.vanhoren@openerp.com-20130110161936-4515hhdlamd3d25r --- openerp/service/workers.py | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/openerp/service/workers.py b/openerp/service/workers.py index 0a54a80b963..9043eac1bcd 100644 --- a/openerp/service/workers.py +++ b/openerp/service/workers.py @@ -45,6 +45,7 @@ class Multicorn(object): self.socket = None self.workers_http = {} self.workers_cron = {} + self.workers_longpolling = {} self.workers = {} self.generation = 0 self.queue = [] @@ -140,6 +141,8 @@ class Multicorn(object): self.worker_spawn(WorkerHTTP, self.workers_http) while len(self.workers_cron) < config['max_cron_threads']: self.worker_spawn(WorkerCron, self.workers_cron) + while len(self.workers_longpolling) < 1: + self.worker_spawn(WorkerLongPolling, self.workers_longpolling) def sleep(self): try: @@ -334,6 +337,21 @@ class WorkerHTTP(Worker): Worker.start(self) self.server = WorkerBaseWSGIServer(self.multi.app) +class WorkerLongPolling(Worker): + """ Long polling workers """ + def start(self): + config.options["gevent"] = True + _logger.info('Using gevent mode') + import gevent.monkey + gevent.monkey.patch_all() + import gevent_psycopg2 + gevent_psycopg2.monkey_patch() + + Worker.start(self) + from gevent.wsgi import WSGIServer + httpd = WSGIServer(('0.0.0.0', 8072), self.multi.app) + httpd.serve_forever() + class WorkerBaseWSGIServer(werkzeug.serving.BaseWSGIServer): """ werkzeug WSGI Server patched to allow using an external listen socket """ From cb33e09d1bedce2aa17d02fc7c8047b4a2753f40 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 10 Jan 2013 17:33:14 +0100 Subject: [PATCH 07/12] Socket is inited by master process bzr revid: nicolas.vanhoren@openerp.com-20130110163314-449euw1z69eebtpz --- openerp/service/workers.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/openerp/service/workers.py b/openerp/service/workers.py index 9043eac1bcd..aee639035a6 100644 --- a/openerp/service/workers.py +++ b/openerp/service/workers.py @@ -181,6 +181,12 @@ class Multicorn(object): self.socket.setblocking(0) self.socket.bind(self.address) self.socket.listen(8) + # long polling socket + 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.listen(8) def stop(self, graceful=True): if graceful: @@ -349,8 +355,8 @@ class WorkerLongPolling(Worker): Worker.start(self) from gevent.wsgi import WSGIServer - httpd = WSGIServer(('0.0.0.0', 8072), self.multi.app) - httpd.serve_forever() + self.server = WSGIServer(self.multi.long_polling_socket, self.multi.app) + self.server.serve_forever() class WorkerBaseWSGIServer(werkzeug.serving.BaseWSGIServer): """ werkzeug WSGI Server patched to allow using an external listen socket From a4120a879adf2b50dd18ed8a6310b9bae65f0209 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 17 Jan 2013 11:30:57 +0100 Subject: [PATCH 08/12] [IMP] long polling: disable the watchdog for the WorkerLongPolling, added command-line option for its port. bzr revid: vmt@openerp.com-20130117103057-12ez48kj48pntb1g --- openerp/service/workers.py | 12 ++++++++++-- openerp/tools/config.py | 5 ++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/openerp/service/workers.py b/openerp/service/workers.py index 29ae9de10c0..7321978e859 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,6 +348,11 @@ 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 _logger.info('Using gevent mode') diff --git a/openerp/tools/config.py b/openerp/tools/config.py index 83a347f0864..dcbf26783e3 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', From ed0a292f5d2f766dd0be3cbf258d1f05a13fbbbf Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 18 Jan 2013 16:25:11 +0100 Subject: [PATCH 09/12] [IMP] gevent: no longer a command-line flag (always used in multi-process, never otherwise) The internal flag is in openerp.__init__ (as the multi_process flag). bzr revid: vmt@openerp.com-20130118152511-57u4gxyolz0hd4y8 --- openerp/__init__.py | 2 ++ openerp/cli/server.py | 10 ---------- openerp/service/__init__.py | 5 +++-- openerp/service/workers.py | 2 +- openerp/service/wsgi_server.py | 2 +- openerp/tools/config.py | 3 +-- 6 files changed, 8 insertions(+), 16 deletions(-) diff --git a/openerp/__init__.py b/openerp/__init__.py index c9db7076e71..307170b9033 100644 --- a/openerp/__init__.py +++ b/openerp/__init__.py @@ -51,6 +51,8 @@ wsgi.register_wsgi_handler = wsgi.wsgi_server.register_wsgi_handler # its own copy of the data structure and we don't need to care about # locks between threads. multi_process = False +# Is the server running with gevent. +evented = False # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/cli/server.py b/openerp/cli/server.py index 0df13ffb3a7..84a818c0c5d 100644 --- a/openerp/cli/server.py +++ b/openerp/cli/server.py @@ -230,20 +230,10 @@ def main(args): check_root_user() openerp.tools.config.parse_config(args) - if openerp.tools.config.options["gevent"]: - _logger.info('Using gevent mode') - import gevent.monkey - gevent.monkey.patch_all() - import gevent_psycopg2 - gevent_psycopg2.monkey_patch() - check_postgres_user() openerp.netsvc.init_logger() report_configuration() - if openerp.tools.config.options["gevent"]: - _logger.info('Using gevent mode') - config = openerp.tools.config configure_babel_localedata_path() diff --git a/openerp/service/__init__.py b/openerp/service/__init__.py index dd8d4fe9152..dd654b4c8a2 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 7321978e859..3e8df86fede 100644 --- a/openerp/service/workers.py +++ b/openerp/service/workers.py @@ -354,7 +354,7 @@ class WorkerLongPolling(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 010a8cde957..196b3f5db7d 100644 --- a/openerp/service/wsgi_server.py +++ b/openerp/service/wsgi_server.py @@ -424,7 +424,7 @@ def serve(): # TODO Change the xmlrpc_* options to http_* interface = config['xmlrpc_interface'] or '0.0.0.0' port = config['xmlrpc_port'] - if not openerp.tools.config.options["gevent"]: + if not openerp.evented: httpd = werkzeug.serving.make_server(interface, port, application, threaded=True) else: from gevent.wsgi import WSGIServer diff --git a/openerp/tools/config.py b/openerp/tools/config.py index dcbf26783e3..c4b52c10b31 100644 --- a/openerp/tools/config.py +++ b/openerp/tools/config.py @@ -108,7 +108,6 @@ class configmanager(object): help="specify additional addons paths (separated by commas).", action="callback", callback=self._check_addons_path, nargs=1, type="string") group.add_option("--load", dest="server_wide_modules", help="Comma-separated list of server-wide modules default=web") - group.add_option("--gevent", dest="gevent", action="store_true", my_default=False, help="Activate the GEvent mode, this also desactivate the cron.") parser.add_option_group(group) # XML-RPC / HTTP @@ -412,7 +411,7 @@ class configmanager(object): 'list_db', 'xmlrpcs', 'proxy_mode', 'test_file', 'test_enable', 'test_commit', 'test_report_directory', 'osv_memory_count_limit', 'osv_memory_age_limit', 'max_cron_threads', 'unaccent', - 'workers', 'limit_memory_hard', 'limit_memory_soft', 'limit_time_cpu', 'limit_time_real', 'limit_request', 'gevent' + 'workers', 'limit_memory_hard', 'limit_memory_soft', 'limit_time_cpu', 'limit_time_real', 'limit_request', ] for arg in keys: From b4aedf0cc65a2ceb4501619652bf2cdd11fce3b2 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 4 Feb 2013 17:59:03 +0100 Subject: [PATCH 10/12] [FIX] cron: Looping over all existing databases seems a bad idea (when -d is not given on the command-line). bzr revid: vmt@openerp.com-20130204165903-gzjghbg7bgjqn5jy --- openerp/service/workers.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openerp/service/workers.py b/openerp/service/workers.py index 3e8df86fede..870aae7fe9d 100644 --- a/openerp/service/workers.py +++ b/openerp/service/workers.py @@ -141,7 +141,8 @@ class Multicorn(object): def process_spawn(self): while len(self.workers_http) < self.population: self.worker_spawn(WorkerHTTP, self.workers_http) - while len(self.workers_cron) < config['max_cron_threads']: + while len(self.workers_cron) < config['max_cron_threads'] \ + and config['db_name']: self.worker_spawn(WorkerCron, self.workers_cron) while len(self.workers_longpolling) < 1: self.worker_spawn(WorkerLongPolling, self.workers_longpolling) @@ -393,7 +394,7 @@ class WorkerCron(Worker): if config['db_name']: db_names = config['db_name'].split(',') else: - db_names = openerp.netsvc.ExportService._services['db'].exp_list(True) + db_names = [] for db_name in db_names: if rpc_request_flag: start_time = time.time() From b30307da329fef4589eae9876934a1a7d3daaae2 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 15 Feb 2013 13:33:24 +0100 Subject: [PATCH 11/12] Revert 4580 bzr revid: nicolas.vanhoren@openerp.com-20130215123324-m10141rj595x30pl --- openerp/service/workers.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openerp/service/workers.py b/openerp/service/workers.py index da3a7a221da..0f962cdb968 100644 --- a/openerp/service/workers.py +++ b/openerp/service/workers.py @@ -141,8 +141,7 @@ class Multicorn(object): def process_spawn(self): while len(self.workers_http) < self.population: self.worker_spawn(WorkerHTTP, self.workers_http) - while len(self.workers_cron) < config['max_cron_threads'] \ - and config['db_name']: + while len(self.workers_cron) < config['max_cron_threads']: self.worker_spawn(WorkerCron, self.workers_cron) while len(self.workers_longpolling) < 1: self.worker_spawn(WorkerLongPolling, self.workers_longpolling) @@ -400,7 +399,7 @@ class WorkerCron(Worker): if config['db_name']: db_names = config['db_name'].split(',') else: - db_names = [] + db_names = openerp.service.db.exp_list(True) for db_name in db_names: if rpc_request_flag: start_time = time.time() From ee256b5664665ce45b9397b5225bf004c0c35754 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 18 Feb 2013 16:31:07 +0100 Subject: [PATCH 12/12] [FIX] service: call stop() instead of shutdown() in the evented case. bzr revid: vmt@openerp.com-20130218153107-m5ikcn10gckk8ik3 --- openerp/service/wsgi_server.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openerp/service/wsgi_server.py b/openerp/service/wsgi_server.py index 0676f8c02b0..0ca7dfcbd94 100644 --- a/openerp/service/wsgi_server.py +++ b/openerp/service/wsgi_server.py @@ -450,8 +450,13 @@ def stop_service(): The server is supposed to have been started by start_server() above. """ if httpd: - httpd.shutdown() - close_socket(httpd.socket) + if not openerp.evented: + httpd.shutdown() + close_socket(httpd.socket) + else: + import gevent + httpd.stop() + gevent.shutdown() def close_socket(sock): """ Closes a socket instance cleanly