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)
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])
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()
def start(self):
Worker.start(self)
+ self.multi.long_polling_socket.close()
self.server = WorkerBaseWSGIServer(self.multi.app)
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')
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):
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()
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:
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: