summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2013-02-13 03:12:46 +0000
committerGerrit Code Review <review@openstack.org>2013-02-13 03:12:46 +0000
commit04ebd61386314820da9feb6ca65af98051bc04f4 (patch)
treec1024c34133975ae06b0006b72964562609ecc8a /nova/api
parentd9d7d5902f0dfb7e27b0ac6498575d775c478cdb (diff)
parent80bd1de65a3b8e7502ece9cedca3c027d176de39 (diff)
Merge "Simplify and optimize az server output extension."
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/compute/contrib/extended_availability_zone.py27
1 files changed, 16 insertions, 11 deletions
diff --git a/nova/api/openstack/compute/contrib/extended_availability_zone.py b/nova/api/openstack/compute/contrib/extended_availability_zone.py
index b7451cb6a..734ddf7c8 100644
--- a/nova/api/openstack/compute/contrib/extended_availability_zone.py
+++ b/nova/api/openstack/compute/contrib/extended_availability_zone.py
@@ -21,26 +21,35 @@ from nova.api.openstack import extensions
from nova.api.openstack import wsgi
from nova.api.openstack import xmlutil
from nova import availability_zones
+from nova.common import memorycache
from nova.openstack.common import log as logging
LOG = logging.getLogger(__name__)
+# NOTE(vish): azs don't change that often, so cache them for an hour to
+# avoid hitting the db multiple times on every request.
+AZ_CACHE_SECONDS = 60 * 60
authorize = extensions.soft_extension_authorizer('compute',
'extended_availability_zone')
class ExtendedAZController(wsgi.Controller):
+ def __init__(self):
+ self.mc = memorycache.get_client()
def _get_host_az(self, context, instance):
- admin_context = context.elevated()
- if instance['host']:
- return availability_zones.get_host_availability_zone(
- admin_context, instance['host'])
+ host = instance.get('host')
+ if not host:
+ return None
+ cache_key = "azcache-%s" % host
+ az = self.mc.get(cache_key)
+ if not az:
+ elevated = context.elevated()
+ az = availability_zones.get_host_availability_zone(elevated, host)
+ self.mc.set(cache_key, az, AZ_CACHE_SECONDS)
+ return az
def _extend_server(self, context, server, instance):
key = "%s:availability_zone" % Extended_availability_zone.alias
- server[key] = instance.get('availability_zone', None)
-
- key = "%s:host_availability_zone" % Extended_availability_zone.alias
server[key] = self._get_host_az(context, instance)
@wsgi.extends
@@ -81,10 +90,6 @@ class Extended_availability_zone(extensions.ExtensionDescriptor):
def make_server(elem):
elem.set('{%s}availability_zone' % Extended_availability_zone.namespace,
'%s:availability_zone' % Extended_availability_zone.alias)
- elem.set('{%s}host_availability_zone' %
- Extended_availability_zone.namespace,
- '%s:host_availability_zone' %
- Extended_availability_zone.alias)
class ExtendedAZTemplate(xmlutil.TemplateBuilder):