[FIX] multicorn: WorkerLongPolling watch for parent change

[IMP] multicorn: WorkerLongPolling log into logger
[IMP] multicorn: Workers closes unwanted sockets

bzr revid: chs@openerp.com-20130530154537-89qrbgi5q1n6fgmh
This commit is contained in:
Christophe Simonis 2013-05-30 17:45:37 +02:00
parent 98bce97f27
commit 185f7552fd
1 changed files with 28 additions and 3 deletions

View File

@ -182,7 +182,7 @@ class Multicorn(object):
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.setblocking(0)
self.socket.bind(self.address)
self.socket.listen(8)
self.socket.listen(8*self.population)
# 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)
@ -241,6 +241,9 @@ class Worker(object):
self.request_max = multi.limit_request
self.request_count = 0
def setproctitle(self, title=""):
setproctitle('openerp: %s %s %s' % (self.__class__.__name__, self.pid, title))
def close(self):
os.close(self.watchdog_pipe[0])
os.close(self.watchdog_pipe[1])
@ -290,7 +293,7 @@ class Worker(object):
def start(self):
self.pid = os.getpid()
setproctitle('openerp: %s %s' % (self.__class__.__name__, self.pid))
self.setproctitle()
_logger.info("Worker %s (%s) alive", self.__class__.__name__, self.pid)
# Reseed the random number generator
random.seed()
@ -350,6 +353,7 @@ class WorkerHTTP(Worker):
def start(self):
Worker.start(self)
self.multi.long_polling_socket.close()
self.server = WorkerBaseWSGIServer(self.multi.app)
class WorkerLongPolling(Worker):
@ -359,6 +363,15 @@ class WorkerLongPolling(Worker):
# Disable the watchdog feature for this kind of worker.
self.watchdog_timeout = None
def watch_parent(self):
import gevent
while True:
if self.ppid != os.getppid():
_logger.info("WorkerLongPolling (%s) Parent changed", self.pid)
os.kill(os.getpid(), signal.SIGTERM)
return
gevent.sleep(self.multi.beat)
def start(self):
openerp.evented = True
_logger.info('Using gevent mode')
@ -368,8 +381,16 @@ class WorkerLongPolling(Worker):
gevent_psycopg2.monkey_patch()
Worker.start(self)
self.multi.socket.close()
import gevent
watcher = gevent.spawn(self.watch_parent)
log = _logger.getChild(self.__class__.__name__)
log.write = lambda msg: log.info(msg.strip())
from gevent.wsgi import WSGIServer
self.server = WSGIServer(self.multi.long_polling_socket, self.multi.app)
self.server = WSGIServer(self.multi.long_polling_socket, self.multi.app, log=log)
self.server.serve_forever()
class WorkerBaseWSGIServer(werkzeug.serving.BaseWSGIServer):
@ -413,6 +434,7 @@ class WorkerCron(Worker):
if len(db_names):
self.db_index = (self.db_index + 1) % len(db_names)
db_name = db_names[self.db_index]
self.setproctitle(db_name)
if rpc_request_flag:
start_time = time.time()
start_rss, start_vms = psutil.Process(os.getpid()).get_memory_info()
@ -422,6 +444,7 @@ class WorkerCron(Worker):
import openerp.addons.base as base
acquired = base.ir.ir_cron.ir_cron._acquire_job(db_name)
if not acquired:
openerp.modules.registry.RegistryManager.delete(db_name)
break
# dont keep cursors in multi database mode
if len(db_names) > 1:
@ -442,6 +465,8 @@ class WorkerCron(Worker):
def start(self):
Worker.start(self)
self.multi.socket.close()
self.multi.long_polling_socket.close()
openerp.service.start_internal()
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: