summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/db/sqlalchemy/api.py5
-rw-r--r--nova/tests/test_db_api.py6
2 files changed, 11 insertions, 0 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index f35f23e56..c98cb716e 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -530,6 +530,11 @@ def compute_node_update(context, compute_id, values, prune_stats=False):
with session.begin():
_update_stats(context, stats, compute_id, session, prune_stats)
compute_ref = _compute_node_get(context, compute_id, session=session)
+ # Always update this, even if there's going to be no other
+ # changes in data. This ensures that we invalidate the
+ # scheduler cache of compute node data in case of races.
+ if 'updated_at' not in values:
+ values['updated_at'] = timeutils.utcnow()
convert_datetimes(values, 'created_at', 'deleted_at', 'updated_at')
compute_ref.update(values)
return compute_ref
diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py
index 2b81f66f7..1653e942c 100644
--- a/nova/tests/test_db_api.py
+++ b/nova/tests/test_db_api.py
@@ -1497,6 +1497,12 @@ class CapacityTestCase(test.TestCase):
self.assertEqual(2, int(stats['num_proj_12345']))
self.assertEqual(1, int(stats['num_tribbles']))
+ def test_compute_node_update_always_updates_updated_at(self):
+ item = self._create_helper('host1')
+ item_updated = db.compute_node_update(self.ctxt,
+ item['id'], {})
+ self.assertNotEqual(item['updated_at'], item_updated['updated_at'])
+
def test_compute_node_stat_prune(self):
item = self._create_helper('host1')
for stat in item['stats']: