summaryrefslogtreecommitdiff
path: root/heat/objects
diff options
context:
space:
mode:
authorCrag Wolfe <cwolfe@redhat.com>2017-03-21 01:52:50 -0400
committerZane Bitter <zbitter@redhat.com>2017-07-31 21:13:49 -0400
commit705625cee79a566ad5f13b0969a5b2b58f118987 (patch)
tree38401260885f0d0500c41994a9b1bf6195a3c03b /heat/objects
parent8c7b66a8a35180b5c352279e2800ec89cc8b77dc (diff)
downloadheat-705625cee79a566ad5f13b0969a5b2b58f118987.tar.gz
Eager load resource_properties_data in resource
Eager load resource_properties_data in resources in the typical resource-loading scenarios where properties data will be accessed. Thus, we can save an extra db query per resource when loading all the resources in a stack, for instance. Fall back to lazy loading properties data in other scenarios. Also, the resource object doesn't need to store a copy of its ResourcePropertiesData object in self.rsrc_prop_data, so don't. Change-Id: Ib7684af3fe06f818628fd21f1216de5047872948 Closes-Bug: #1665503
Diffstat (limited to 'heat/objects')
-rw-r--r--heat/objects/resource.py29
1 files changed, 21 insertions, 8 deletions
diff --git a/heat/objects/resource.py b/heat/objects/resource.py
index 102aa45c7..49c21ac7b 100644
--- a/heat/objects/resource.py
+++ b/heat/objects/resource.py
@@ -85,8 +85,6 @@ class Resource(
resource_data.ResourceData,
nullable=True
),
- 'rsrc_prop_data': fields.ObjectField(
- rpd.ResourcePropertiesData, nullable=True),
'rsrc_prop_data_id': fields.ObjectField(
fields.IntegerField(nullable=True)),
'engine_id': fields.StringField(nullable=True),
@@ -114,12 +112,21 @@ class Resource(
elif field != 'attr_data':
resource[field] = db_resource[field]
- if db_resource['rsrc_prop_data'] is not None:
- resource['rsrc_prop_data'] = \
- rpd.ResourcePropertiesData._from_db_object(
- rpd.ResourcePropertiesData(context), context,
- db_resource['rsrc_prop_data'])
- resource._properties_data = resource['rsrc_prop_data'].data
+ if db_resource['rsrc_prop_data_id'] is not None:
+ if hasattr(db_resource, '__dict__'):
+ rpd_obj = db_resource.__dict__.get('rsrc_prop_data')
+ else:
+ rpd_obj = None
+ if rpd_obj is not None:
+ # Object is already eager loaded
+ rpd_obj = (
+ rpd.ResourcePropertiesData._from_db_object(
+ rpd.ResourcePropertiesData(),
+ context,
+ rpd_obj))
+ resource._properties_data = rpd_obj.data
+ else:
+ resource._properties_data = {}
if db_resource['properties_data']:
LOG.error(
'Unexpected condition where resource.rsrc_prop_data '
@@ -155,6 +162,12 @@ class Resource(
@property
def properties_data(self):
+ if (not self._properties_data and
+ self.rsrc_prop_data_id is not None):
+ LOG.info('rsrp_prop_data lazy load')
+ rpd_obj = rpd.ResourcePropertiesData.get_by_id(
+ self._context, self.rsrc_prop_data_id)
+ self._properties_data = rpd_obj.data or {}
return self._properties_data
@classmethod