Only return latest instance fault for instances
This patch addresses slowness that can occur when doing a list servers API operation when there are many thousands of records in the instance_faults table. Previously, in the Instance.fill_faults() method, we were getting all instance fault records for a set of instances having one of a set of supplied instance UUIDs and then iterating over those faults and returning a dict of instance UUID to the first fault returned (which happened to be the latest fault because of ordering the SQL query by created_at). This patch adds a new InstanceFaultList.get_latest_by_instance_uuids() method that does some SQL-fu to only return the latest fault records for each instance being inspected. Closes-Bug: #1632247 Co-Authored-By: Roman Podoliaka <rpodolyaka@mirantis.com> Change-Id: I8f2227b3969791ebb2d04d74a316b9d97a4b1571
This commit is contained in:
committed by
Roman Podoliaka
parent
c2ee7ca620
commit
3932d0c26d
@@ -96,12 +96,22 @@ class InstanceFaultList(base.ObjectListBase, base.NovaObject):
|
||||
# Version 1.0: Initial version
|
||||
# InstanceFault <= version 1.1
|
||||
# Version 1.1: InstanceFault version 1.2
|
||||
VERSION = '1.1'
|
||||
# Version 1.2: Added get_latest_by_instance_uuids() method
|
||||
VERSION = '1.2'
|
||||
|
||||
fields = {
|
||||
'objects': fields.ListOfObjectsField('InstanceFault'),
|
||||
}
|
||||
|
||||
@base.remotable_classmethod
|
||||
def get_latest_by_instance_uuids(cls, context, instance_uuids):
|
||||
db_faultdict = db.instance_fault_get_by_instance_uuids(context,
|
||||
instance_uuids,
|
||||
latest=True)
|
||||
db_faultlist = itertools.chain(*db_faultdict.values())
|
||||
return base.obj_make_list(context, cls(context), objects.InstanceFault,
|
||||
db_faultlist)
|
||||
|
||||
@base.remotable_classmethod
|
||||
def get_by_instance_uuids(cls, context, instance_uuids):
|
||||
db_faultdict = db.instance_fault_get_by_instance_uuids(context,
|
||||
|
||||
Reference in New Issue
Block a user