diff --git a/nova/servicegroup/drivers/mc.py b/nova/servicegroup/drivers/mc.py index d5d3d0832a39..5d62d9b75212 100644 --- a/nova/servicegroup/drivers/mc.py +++ b/nova/servicegroup/drivers/mc.py @@ -78,7 +78,11 @@ class MemcachedDriver(base.Driver): # Change mc time to offset-aware time updated_time_in_mc = \ updated_time_in_mc.replace(tzinfo=iso8601.iso8601.Utc()) - if updated_time_in_db <= updated_time_in_mc: + # If [DEFAULT]/enable_new_services is set to be false, the + # ``updated_time_in_db`` will be None, in this case, use + # ``updated_time_in_mc`` instead. + if (not updated_time_in_db or + updated_time_in_db <= updated_time_in_mc): return updated_time_in_mc return updated_time_in_db diff --git a/nova/tests/unit/servicegroup/test_mc_servicegroup.py b/nova/tests/unit/servicegroup/test_mc_servicegroup.py index 6d432db49a85..67fcc0cb3513 100644 --- a/nova/tests/unit/servicegroup/test_mc_servicegroup.py +++ b/nova/tests/unit/servicegroup/test_mc_servicegroup.py @@ -74,16 +74,19 @@ class MemcachedServiceGroupTestCase(test.NoDBTestCase): 'updated_at': updated_at_time.replace(tzinfo=iso8601.iso8601.Utc()) } + # If no record returned from the mc, return record from DB self.mc_client.get.return_value = None self.assertEqual(service_ref['updated_at'], self.servicegroup_api.get_updated_time(service_ref)) self.mc_client.get.assert_called_once_with('compute:fake-host') + # If the record in mc is newer than DB, return record from mc self.mc_client.reset_mock() retval = timeutils.utcnow() self.mc_client.get.return_value = retval self.assertEqual(retval.replace(tzinfo=iso8601.iso8601.Utc()), self.servicegroup_api.get_updated_time(service_ref)) self.mc_client.get.assert_called_once_with('compute:fake-host') + # If the record in DB is newer than mc, return record from DB self.mc_client.reset_mock() service_ref['updated_at'] = \ retval.replace(tzinfo=iso8601.iso8601.Utc()) @@ -91,3 +94,10 @@ class MemcachedServiceGroupTestCase(test.NoDBTestCase): self.assertEqual(service_ref['updated_at'], self.servicegroup_api.get_updated_time(service_ref)) self.mc_client.get.assert_called_once_with('compute:fake-host') + # If no record returned from the DB, return the record from mc + self.mc_client.reset_mock() + service_ref['updated_at'] = None + self.mc_client.get.return_value = updated_at_time + self.assertEqual(updated_at_time.replace(tzinfo=iso8601.iso8601.Utc()), + self.servicegroup_api.get_updated_time(service_ref)) + self.mc_client.get.assert_called_once_with('compute:fake-host')