From b9ea6939db92662f4978866e9d48c43e67568922 Mon Sep 17 00:00:00 2001 From: Vlad Gusev Date: Thu, 16 Aug 2018 13:14:01 +0300 Subject: [PATCH] Fix service list for disabled compute using MC driver In 0df91a7f799060cd2e9b8a0adac1efacb974bcb3 a comparison between ``updated_at`` field from services table and update time from memcache was added if the servergroup_driver is set to be mc. This could be problematic if servergroup_driver=mc and ``[DEFAULT]/enable_new_services`` option in /etc/nova/nova.conf is set to be ``False`` at the same time, as the ``updated_at`` field will always be ``Null`` in services record. This patch fixes the bug by returning ``updated_time_in_mc`` instead under the above mentioned scenario. Closes-Bug: #1781880 Conflict is caused by I10b84a9cc7f0cc8ea213a377e4c4f16168b6e45b not being in Pike. Change-Id: I27160140cbccf3e6914aed2dcff54d547e446c1f (Cherry-picked from 0f4e5c442c0ab446274979dafda873c1e1c20585) --- nova/servicegroup/drivers/mc.py | 6 +++++- nova/tests/unit/servicegroup/test_mc_servicegroup.py | 10 ++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) 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')