summaryrefslogtreecommitdiffstats
path: root/nova/wsgi.py
diff options
context:
space:
mode:
authorJohannes Erdfelt <johannes.erdfelt@rackspace.com>2012-03-25 02:06:01 +0800
committerJohannes Erdfelt <johannes.erdfelt@rackspace.com>2012-06-28 19:57:37 +0000
commit46c1b6eaee4ca00c256c5c403c6d6bfeaf3b63f8 (patch)
tree365480c3ce477dffa80db3e650d24fc705e52fc2 /nova/wsgi.py
parent2264c1c0b6ccfe7dc3e4c7e448b4a5eac92758d4 (diff)
downloadnova-46c1b6eaee4ca00c256c5c403c6d6bfeaf3b63f8.tar.gz
nova-46c1b6eaee4ca00c256c5c403c6d6bfeaf3b63f8.tar.xz
nova-46c1b6eaee4ca00c256c5c403c6d6bfeaf3b63f8.zip
Add multi-process support for API services
Implements blueprint multi-process-api-service This is based on Huang Zhiteng's patch. This patch adds support for running services as multiple processes. This is primarily intended to be used with the API service as a way to provide more concurrency than eventlet can sometimes provide. A SIGTERM or SIGINT signal will cause the parent process to gracefully terminate the child processes, allowing them to finish processing the requests currently being processed. The parent will wait for the children to finish before exiting. Change-Id: Ie6d6802626eb42d5e64c4167be363fbf6cea2a1b
Diffstat (limited to 'nova/wsgi.py')
-rw-r--r--nova/wsgi.py52
1 files changed, 23 insertions, 29 deletions
diff --git a/nova/wsgi.py b/nova/wsgi.py
index 436f4df2e..a02fdcc18 100644
--- a/nova/wsgi.py
+++ b/nova/wsgi.py
@@ -44,8 +44,8 @@ class Server(object):
default_pool_size = 1000
- def __init__(self, name, app, host=None, port=None, pool_size=None,
- protocol=eventlet.wsgi.HttpProtocol):
+ def __init__(self, name, app, host='0.0.0.0', port=0, pool_size=None,
+ protocol=eventlet.wsgi.HttpProtocol, backlog=128):
"""Initialize, but do not start, a WSGI server.
:param name: Pretty name for logging.
@@ -53,47 +53,37 @@ class Server(object):
:param host: IP address to serve the application.
:param port: Port number to server the application.
:param pool_size: Maximum number of eventlets to spawn concurrently.
+ :param backlog: Maximum number of queued connections.
:returns: None
-
+ :raises: nova.exception.InvalidInput
"""
self.name = name
self.app = app
- self.host = host or "0.0.0.0"
- self.port = port or 0
self._server = None
- self._socket = None
self._protocol = protocol
self._pool = eventlet.GreenPool(pool_size or self.default_pool_size)
- self._logger = logging.getLogger("eventlet.wsgi.server")
+ self._logger = logging.getLogger("nova.%s.wsgi.server" % self.name)
self._wsgi_logger = logging.WritableLogger(self._logger)
- def _start(self):
- """Run the blocking eventlet WSGI server.
-
- :returns: None
+ if backlog < 1:
+ raise exception.InvalidInput(
+ reason='The backlog must be more than 1')
- """
- eventlet.wsgi.server(self._socket,
- self.app,
- protocol=self._protocol,
- custom_pool=self._pool,
- log=self._wsgi_logger)
+ self._socket = eventlet.listen((host, port), backlog=backlog)
+ (self.host, self.port) = self._socket.getsockname()
+ LOG.info(_("%(name)s listening on %(host)s:%(port)s") % self.__dict__)
- def start(self, backlog=128):
+ def start(self):
"""Start serving a WSGI application.
- :param backlog: Maximum number of queued connections.
:returns: None
- :raises: nova.exception.InvalidInput
-
"""
- if backlog < 1:
- raise exception.InvalidInput(
- reason='The backlog must be more than 1')
- self._socket = eventlet.listen((self.host, self.port), backlog=backlog)
- self._server = eventlet.spawn(self._start)
- (self.host, self.port) = self._socket.getsockname()
- LOG.info(_("Started %(name)s on %(host)s:%(port)s") % self.__dict__)
+ self._server = eventlet.spawn(eventlet.wsgi.server,
+ self._socket,
+ self.app,
+ protocol=self._protocol,
+ custom_pool=self._pool,
+ log=self._wsgi_logger)
def stop(self):
"""Stop this server.
@@ -105,7 +95,11 @@ class Server(object):
"""
LOG.info(_("Stopping WSGI server."))
- self._server.kill()
+
+ if self._server is not None:
+ # Resize pool to stop new requests from being processed
+ self._pool.resize(0)
+ self._server.kill()
def wait(self):
"""Block, until the server has stopped.