summaryrefslogtreecommitdiffstats
path: root/nova/service.py
diff options
context:
space:
mode:
authorZhiteng Huang <zhiteng.huang@intel.com>2012-03-25 02:06:01 +0800
committerZhiteng Huang <zhiteng.huang@intel.com>2012-06-02 00:34:55 +0800
commite599636d09755f635604f64f17e9f56cac14575e (patch)
treedc729c51267d8ab976422463a3a95b070ddd6135 /nova/service.py
parent31108020fc237624e244f08658646e2f119506db (diff)
downloadnova-e599636d09755f635604f64f17e9f56cac14575e.tar.gz
nova-e599636d09755f635604f64f17e9f56cac14575e.tar.xz
nova-e599636d09755f635604f64f17e9f56cac14575e.zip
blueprint <multi-process-api-service>
Add multiprocess support for API serivces (EC2/OSAPI_Compute/OSAPI_Volume/Metadata). 2012-06-1 v7: * Add unittest to cover worker recovery, service termination functionality in wsgi.py, fix python 2.6 compatibility issue. * Modify generate_uid() to introduce per-process seeds in utils.py to avoid collisions. * Add worker session to nova.conf.sample. 2012-05-21 v6: * Fix 'test_wsgi' unittest error. 2012-04-28 v5: * Add SIGINT handler and fix child-parent race condition when Ctrl+C is pressed. 2012-03-31 v4: * Fixed typo, removed debug code. 2012-03-30 v3: * Fixed localization/pep8 error in unittest, add metadata test. * nova/wsgi.py:Server: use the greenthread pool created for each process. * nova/service.py: remove debug code 2012-03-27 v2: * Fixed unittest error. * nova/wsgi.py:Server: Use self._logger to do logging in multiprocess mode. * nova/wsgi.py:Server: Move self._pool creation into proper place. * code style fix. 2012-03-25 v1: * Modification to nova/service.py and nova/wsgi.py in order to support multiprocess (a.k.a. workers) for various API services. If multiprocess mode is enabled, (i.e. flags 'APINAME_workers' set to positive numbers), corresponding API service will run in target number of process(es). There is also a master_worker process spawned for managing all workers (handling signal/termination). * Add unittest for multiprocess API service, also alter testing/runner.py to adopt new unittest. Change-Id: Ia045e595543ddfd192894b2a05801cc4b7ca90cb
Diffstat (limited to 'nova/service.py')
-rw-r--r--nova/service.py26
1 files changed, 16 insertions, 10 deletions
diff --git a/nova/service.py b/nova/service.py
index b179cda6c..136668311 100644
--- a/nova/service.py
+++ b/nova/service.py
@@ -61,12 +61,18 @@ service_opts = [
cfg.IntOpt('ec2_listen_port',
default=8773,
help='port for ec2 api to listen'),
+ cfg.IntOpt('ec2_workers',
+ default=0,
+ help='Number of workers for EC2 API service'),
cfg.StrOpt('osapi_compute_listen',
default="0.0.0.0",
help='IP address for OpenStack API to listen'),
cfg.IntOpt('osapi_compute_listen_port',
default=8774,
help='list port for osapi compute'),
+ cfg.IntOpt('osapi_compute_workers',
+ default=0,
+ help='Number of workers for OpenStack API service'),
cfg.StrOpt('metadata_manager',
default='nova.api.manager.MetadataManager',
help='OpenStack metadata service manager'),
@@ -76,12 +82,18 @@ service_opts = [
cfg.IntOpt('metadata_listen_port',
default=8775,
help='port for metadata api to listen'),
+ cfg.IntOpt('metadata_workers',
+ default=0,
+ help='Number of workers for metadata service'),
cfg.StrOpt('osapi_volume_listen',
default="0.0.0.0",
help='IP address for OpenStack Volume API to listen'),
cfg.IntOpt('osapi_volume_listen_port',
default=8776,
- help='port for os volume api to listen')
+ help='port for os volume api to listen'),
+ cfg.IntOpt('osapi_volume_workers',
+ default=0,
+ help='Number of workers for OpenStack Volume API service')
]
FLAGS = flags.FLAGS
@@ -135,14 +147,6 @@ class Launcher(object):
:returns: None
"""
- def sigterm(sig, frame):
- LOG.audit(_("SIGTERM received"))
- # NOTE(jk0): Raise a ^C which is caught by the caller and cleanly
- # shuts down the service. This does not yet handle eventlet
- # threads.
- raise KeyboardInterrupt
-
- signal.signal(signal.SIGTERM, sigterm)
for service in self._services:
try:
@@ -362,10 +366,12 @@ class WSGIService(object):
self.app = self.loader.load_app(name)
self.host = getattr(FLAGS, '%s_listen' % name, "0.0.0.0")
self.port = getattr(FLAGS, '%s_listen_port' % name, 0)
+ self.workers = getattr(FLAGS, '%s_workers' % name, 0)
self.server = wsgi.Server(name,
self.app,
host=self.host,
- port=self.port)
+ port=self.port,
+ workers=self.workers)
def _get_manager(self):
"""Initialize a Manager object appropriate for this service.