From 83186053c16d7536f90b4e6b3f95bd16d26bfb8c Mon Sep 17 00:00:00 2001 From: Davanum Srinivas Date: Tue, 27 Nov 2012 22:11:40 -0500 Subject: Use Service thread group for WSGI request handling - Reuse the pool from thread group in service.Service instead of creating a new green pool - Add ability to control the size of the pool in service.Service - Add a couple of tests for wsgi.Service() to test the size of pool a start/stop as well - Get rid of the wait method by using tg.add_thread - Get rid of pool in wsgi.Service - Added explicit property for host and port Fixes LP #1050379 Change-Id: I40507dc7887fb036ec594bb167cdaa42c278607e --- openstack/common/service.py | 4 ++-- openstack/common/wsgi.py | 24 ++++++++++++------------ tests/unit/test_wsgi.py | 16 ++++++++++++++++ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/openstack/common/service.py b/openstack/common/service.py index 3186d56..0df0dec 100644 --- a/openstack/common/service.py +++ b/openstack/common/service.py @@ -302,8 +302,8 @@ class ProcessLauncher(object): class Service(object): """Service object for binaries running on hosts.""" - def __init__(self): - self.tg = threadgroup.ThreadGroup('service') + def __init__(self, threads=1000): + self.tg = threadgroup.ThreadGroup('service', threads) def start(self): pass diff --git a/openstack/common/wsgi.py b/openstack/common/wsgi.py index aaeb07b..dc49931 100644 --- a/openstack/common/wsgi.py +++ b/openstack/common/wsgi.py @@ -56,8 +56,7 @@ class Service(service.Service): """ def __init__(self, threads=1000): - super(Service, self).__init__() - self.pool = eventlet.GreenPool(threads) + super(Service, self).__init__(threads) def start(self, application, port, host='0.0.0.0', backlog=128): """Start serving this service using the provided server instance. @@ -67,7 +66,16 @@ class Service(service.Service): """ super(Service, self).start() socket = eventlet.listen((host, port), backlog=backlog) - self.pool.spawn_n(self._run, application, socket) + (self._host, self._port) = socket.getsockname() + self.tg.add_thread(self._run, application, socket) + + @property + def host(self): + return self._host + + @property + def port(self): + return self._port def stop(self): """Stop serving this API. @@ -77,18 +85,10 @@ class Service(service.Service): """ super(Service, self).stop() - def wait(self): - """Wait until all servers have completed running.""" - super(Service, self).wait() - try: - self.pool.waitall() - except KeyboardInterrupt: - pass - def _run(self, application, socket): """Start a WSGI server in a new green thread.""" logger = logging.getLogger('eventlet.wsgi.server') - eventlet.wsgi.server(socket, application, custom_pool=self.pool, + eventlet.wsgi.server(socket, application, custom_pool=self.tg.pool, log=logging.WritableLogger(logger)) diff --git a/tests/unit/test_wsgi.py b/tests/unit/test_wsgi.py index 94f12b7..25c0dcf 100644 --- a/tests/unit/test_wsgi.py +++ b/tests/unit/test_wsgi.py @@ -444,3 +444,19 @@ class ServerTest(unittest.TestCase): finally: listen_patcher.stop() server_patcher.stop() + + +class WSGIServerTest(unittest.TestCase): + + def test_pool(self): + server = wsgi.Service() + self.assertTrue(server.tg) + self.assertTrue(server.tg.pool) + self.assertEqual(server.tg.pool.free(), 1000) + + def test_start_random_port(self): + server = wsgi.Service() + server.start("test_random_port", 0) + self.assertEqual("0.0.0.0", server.host) + self.assertNotEqual(0, server.port) + server.stop() -- cgit