diff options
author | Crag Wolfe <cwolfe@redhat.com> | 2017-03-21 01:52:50 -0400 |
---|---|---|
committer | Zane Bitter <zbitter@redhat.com> | 2017-07-31 21:13:49 -0400 |
commit | 705625cee79a566ad5f13b0969a5b2b58f118987 (patch) | |
tree | 38401260885f0d0500c41994a9b1bf6195a3c03b /heat/objects | |
parent | 8c7b66a8a35180b5c352279e2800ec89cc8b77dc (diff) | |
download | heat-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.py | 29 |
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 |