Skip to content

Commit 6443aba

Browse files
author
Eric Fried
committed
Move retry from _update to _update_to_placement
It was noted [1] that we don't need to wrap all of _update in a retry on ResourceProviderUpdateConflict; only _update_to_placement can raise that exception, and that exception only indicates a need to redrive with data ret-GETted from within that method. So this patch moves the retry decorator further in, to _update_to_placement, to avoid the additional redundant compute node and pci tracker writes. [1] https://review.openstack.org/#/c/615705/20/nova/compute/resource_tracker.py@974 Change-Id: I85e567181cdeefde0a9ef91cd460cd200e79bdba
1 parent f4ec394 commit 6443aba

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

nova/compute/resource_tracker.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -913,6 +913,9 @@ def _resource_change(self, compute_node):
913913
return True
914914
return False
915915

916+
@retrying.retry(stop_max_attempt_number=4,
917+
retry_on_exception=lambda e: isinstance(
918+
e, exception.ResourceProviderUpdateConflict))
916919
def _update_to_placement(self, context, compute_node, startup):
917920
"""Send resource and inventory changes to placement."""
918921
# NOTE(jianghuaw): Some resources(e.g. VGPU) are not saved in the
@@ -969,9 +972,6 @@ def _update_to_placement(self, context, compute_node, startup):
969972
self.reportclient.update_from_provider_tree(context, prov_tree,
970973
allocations=allocs)
971974

972-
@retrying.retry(stop_max_attempt_number=4,
973-
retry_on_exception=lambda e: isinstance(
974-
e, exception.ResourceProviderUpdateConflict))
975975
def _update(self, context, compute_node, startup=False):
976976
"""Update partial stats locally and populate them to Scheduler."""
977977
if self._resource_change(compute_node):

nova/tests/unit/compute/test_resource_tracker.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,8 +1475,9 @@ def fake_upt(ptree, nodename, allocations=None):
14751475
exp_inv[rc_fields.ResourceClass.DISK_GB]['reserved'] = 1
14761476
self.assertEqual(exp_inv, ptree.data(new_compute.uuid).inventory)
14771477

1478-
@mock.patch('nova.objects.ComputeNode.save', new=mock.Mock())
1479-
def test_update_retry_success(self):
1478+
@mock.patch('nova.compute.resource_tracker.ResourceTracker.'
1479+
'_resource_change', return_value=False)
1480+
def test_update_retry_success(self, mock_resource_change):
14801481
self._setup_rt()
14811482
orig_compute = _COMPUTE_NODE_FIXTURES[0].obj_clone()
14821483
self.rt.compute_nodes[_NODENAME] = orig_compute
@@ -1497,9 +1498,12 @@ def test_update_retry_success(self):
14971498
self.rt._update(mock.sentinel.ctx, new_compute)
14981499

14991500
self.assertEqual(2, ufpt_mock.call_count)
1501+
# The retry is restricted to _update_to_placement
1502+
self.assertEqual(1, mock_resource_change.call_count)
15001503

1501-
@mock.patch('nova.objects.ComputeNode.save', new=mock.Mock())
1502-
def test_update_retry_raises(self):
1504+
@mock.patch('nova.compute.resource_tracker.ResourceTracker.'
1505+
'_resource_change', return_value=False)
1506+
def test_update_retry_raises(self, mock_resource_change):
15031507
self._setup_rt()
15041508
orig_compute = _COMPUTE_NODE_FIXTURES[0].obj_clone()
15051509
self.rt.compute_nodes[_NODENAME] = orig_compute
@@ -1521,6 +1525,8 @@ def test_update_retry_raises(self):
15211525
self.rt._update, mock.sentinel.ctx, new_compute)
15221526

15231527
self.assertEqual(4, ufpt_mock.call_count)
1528+
# The retry is restricted to _update_to_placement
1529+
self.assertEqual(1, mock_resource_change.call_count)
15241530

15251531
def test_copy_resources_no_update_allocation_ratios(self):
15261532
"""Tests that a ComputeNode object's allocation ratio fields are

0 commit comments

Comments
 (0)