[FIX] multicorn: WorkerLongPolling watch for parent change
authorChristophe Simonis <chs@openerp.com>
Thu, 30 May 2013 15:45:37 +0000 (17:45 +0200)
committerChristophe Simonis <chs@openerp.com>
Thu, 30 May 2013 15:45:37 +0000 (17:45 +0200)
[IMP] multicorn: WorkerLongPolling log into logger
[IMP] multicorn: Workers closes unwanted sockets

bzr revid: chs@openerp.com-20130530154537-89qrbgi5q1n6fgmh

openerp/service/workers.py

index 6843347..2215259 100644 (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: