From d0f61e949320e1c281746f9f6b8974c085cbe46a Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Thu, 9 Dec 2021 14:57:51 +0100 Subject: Ignore fake nodes in the power sync loop Fake nodes have power_state None and the power interface returns None as well. Currently we make an update every loop, even though the values are the same. This change fixes it. Change-Id: I5227c058f3f6e1583b54a1cbc7edc6d42e20ae53 --- ironic/conductor/manager.py | 6 ++++-- ironic/tests/unit/conductor/test_manager.py | 9 +++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py index 4935c5110..24305915a 100644 --- a/ironic/conductor/manager.py +++ b/ironic/conductor/manager.py @@ -3656,7 +3656,8 @@ def do_sync_power_state(task, count): # Also make sure to cache the current boot_mode and secure_boot states utils.node_cache_boot_mode(task) - if node.power_state and node.power_state == power_state: + if ((node.power_state and node.power_state == power_state) + or (node.power_state is None and power_state is None)): # No action is needed return 0 @@ -3666,7 +3667,8 @@ def do_sync_power_state(task, count): node = task.node # Repeat all checks with exclusive lock to avoid races - if node.power_state and node.power_state == power_state: + if ((node.power_state and node.power_state == power_state) + or (node.power_state is None and power_state is None)): # Node power state was updated to the correct value return 0 elif node.provision_state in SYNC_EXCLUDED_STATES or node.maintenance: diff --git a/ironic/tests/unit/conductor/test_manager.py b/ironic/tests/unit/conductor/test_manager.py index da1d7574d..542f224bf 100644 --- a/ironic/tests/unit/conductor/test_manager.py +++ b/ironic/tests/unit/conductor/test_manager.py @@ -4985,6 +4985,15 @@ class ManagerDoSyncPowerStateTestCase(db_base.DbTestCase): self.assertFalse(node_power_action.called) self.assertFalse(self.task.upgrade_lock.called) + def test_state_unchanged_for_fake_node(self, node_power_action): + self._do_sync_power_state(None, None) + + self.power.validate.assert_called_once_with(self.task) + self.power.get_power_state.assert_called_once_with(self.task) + self.assertIsNone(self.node.power_state) + self.assertFalse(node_power_action.called) + self.assertFalse(self.task.upgrade_lock.called) + @mock.patch.object(nova, 'power_update', autospec=True) def test_state_not_set(self, mock_power_update, node_power_action): self._do_sync_power_state(None, states.POWER_ON) -- cgit v1.2.1