From bc989cdccd9e6c4a0f2fab16499f9b04d6fe58ed Mon Sep 17 00:00:00 2001 From: Thomas Herve Date: Wed, 16 Nov 2016 17:33:30 +0100 Subject: [PATCH] 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 --- heat/engine/stack.py | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/heat/engine/stack.py b/heat/engine/stack.py index eeeec19d47..f05c7881d1 100644 --- a/heat/engine/stack.py +++ b/heat/engine/stack.py @@ -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."""