Remove extra resource definition loading

With the current resource list implementation, we end up recreating
resource definitions for every single resource, as we cache the
template, but not the definitions. Caching that instead improves
resource listing by a good chunk.

Change-Id: Ic3b252cd9c2d61abbe2b247375e5e917562a4952
This commit is contained in:
Thomas Herve 2016-11-16 17:33:30 +01:00
parent ac0f0cda46
commit bc989cdccd
1 changed files with 16 additions and 11 deletions

View File

@ -313,14 +313,14 @@ class Stack(collections.Mapping):
return self._resources
def _find_filtered_resources(self, filters=None):
template_cache = {self.t.id: self.t}
rsrc_def_cache = {self.t.id: self.t.resource_definitions(self)}
if filters:
resources = resource_objects.Resource.get_all_by_stack(
self.context, self.id, filters)
else:
resources = self._db_resources_get()
for rsc in six.itervalues(resources):
yield self._resource_from_db_resource(rsc, template_cache)
yield self._resource_from_db_resource(rsc, rsrc_def_cache)
def iter_resources(self, nested_depth=0, filters=None):
"""Iterates over all the resources in a stack.
@ -361,19 +361,24 @@ class Stack(collections.Mapping):
self._db_resources = _db_resources
return self._db_resources
def _resource_from_db_resource(self, db_res, template_cache=None):
def _resource_from_db_resource(self, db_res, rsrc_def_cache=None):
tid = db_res.current_template_id
if tid is None or tid == self.t.id:
t = self.t
elif template_cache and tid in template_cache:
t = template_cache[tid]
if tid is None:
tid = self.t.id
if rsrc_def_cache and tid in rsrc_def_cache:
rsrc_def = rsrc_def_cache[tid]
elif tid == self.t.id:
rsrc_def = self.t.resource_definitions(self)
if rsrc_def_cache:
rsrc_def_cache[tid] = rsrc_def
else:
t = tmpl.Template.load(self.context, tid)
if template_cache:
template_cache[tid] = t
rsrc_def = t.resource_definitions(self)
if rsrc_def_cache:
rsrc_def_cache[tid] = rsrc_def
res_defn = t.resource_definitions(self)[db_res.name]
return resource.Resource(db_res.name, res_defn, self)
return resource.Resource(db_res.name, rsrc_def[db_res.name], self)
def resource_get(self, name):
"""Return a stack resource, even if not in the current template."""