diff --git a/nova/compute/resource_tracker.py b/nova/compute/resource_tracker.py index c6860a5d4b..0d3cd4fa67 100644 --- a/nova/compute/resource_tracker.py +++ b/nova/compute/resource_tracker.py @@ -824,9 +824,13 @@ class ResourceTracker(object): # filter to most recently updated migration for each instance: other_migration = filtered.get(uuid, None) # NOTE(claudiub): In Python 3, you cannot compare NoneTypes. - if (not other_migration or ( - migration.updated_at and other_migration.updated_at and - migration.updated_at >= other_migration.updated_at)): + if other_migration: + om = other_migration + other_time = om.updated_at or om.created_at + migration_time = migration.updated_at or migration.created_at + if migration_time > other_time: + filtered[uuid] = migration + else: filtered[uuid] = migration for migration in filtered.values(): diff --git a/nova/tests/unit/compute/test_resource_tracker.py b/nova/tests/unit/compute/test_resource_tracker.py index 0f713c88c2..211bad443e 100644 --- a/nova/tests/unit/compute/test_resource_tracker.py +++ b/nova/tests/unit/compute/test_resource_tracker.py @@ -2054,6 +2054,7 @@ class TestUpdateUsageFromMigrations(BaseTestCase): instance = objects.Instance(vm_state=vm_states.RESIZED, task_state=None) ts1 = timeutils.utcnow() + ts0 = ts1 - datetime.timedelta(seconds=10) ts2 = ts1 + datetime.timedelta(seconds=10) migrations = [ @@ -2062,6 +2063,7 @@ class TestUpdateUsageFromMigrations(BaseTestCase): dest_compute=_HOSTNAME, dest_node=_NODENAME, instance_uuid=uuids.instance, + created_at=ts0, updated_at=ts1, instance=instance), objects.Migration(source_compute=_HOSTNAME, @@ -2069,6 +2071,7 @@ class TestUpdateUsageFromMigrations(BaseTestCase): dest_compute=_HOSTNAME, dest_node=_NODENAME, instance_uuid=uuids.instance, + created_at=ts0, updated_at=ts2, instance=instance) ] @@ -2078,10 +2081,7 @@ class TestUpdateUsageFromMigrations(BaseTestCase): upd_mock.assert_called_once_with(mock.sentinel.ctx, instance, mig2) upd_mock.reset_mock() - mig1.updated_at = None - - # For some reason, the code thinks None should always take - # precedence over any datetime in the updated_at attribute... + mig2.updated_at = None self.rt._update_usage_from_migrations(mock.sentinel.ctx, mig_list) upd_mock.assert_called_once_with(mock.sentinel.ctx, instance, mig1)