[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:
parent
98bce97f27
commit
185f7552fd
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue