summaryrefslogtreecommitdiff
path: root/ironic/conductor
diff options
context:
space:
mode:
authorRuby Loo <rloo@verizonmedia.com>2020-01-16 15:55:29 +0000
committerRuby Loo <rloo@verizonmedia.com>2020-01-16 17:10:05 +0000
commitdd18c70543db6f42e531db24606ed8008015828f (patch)
treec929522dc906e26829f38fbcf7a0b35b888ec8f0 /ironic/conductor
parentc4352b66fe0987249a71d9992000bb6b8fd48c9d (diff)
downloadironic-dd18c70543db6f42e531db24606ed8008015828f.tar.gz
Nodes in maintenance didn't fail, when they should have
In this code in base_manager.py, _fail_if_in_state() [1]: if the node is in maintenance, nothing is done. This means that when a node in maintenance is in mid deployment or cleaning and their conductor dies, it won't get put into a failed state [2]. This fixes it. [1] https://opendev.org/openstack/ironic/src/commit/8294afa6231629f9734f19ea5b3b0253ee9b8957/ironic/conductor/base_manager.py#L485 [2] https://opendev.org/openstack/ironic/src/commit/8294afa6231629f9734f19ea5b3b0253ee9b8957/ironic/conductor/base_manager.py#L235 Story #2007098 Task #38134 Change-Id: Ide70619271455685d09671ae16d744fc9ae58a02
Diffstat (limited to 'ironic/conductor')
-rw-r--r--ironic/conductor/base_manager.py12
-rw-r--r--ironic/conductor/manager.py1
2 files changed, 9 insertions, 4 deletions
diff --git a/ironic/conductor/base_manager.py b/ironic/conductor/base_manager.py
index d610d2163..8ef568d83 100644
--- a/ironic/conductor/base_manager.py
+++ b/ironic/conductor/base_manager.py
@@ -476,15 +476,19 @@ class BaseConductorManager(object):
node_iter = self.iter_nodes(filters=filters,
sort_key=sort_key,
sort_dir='asc')
-
+ desired_maintenance = filters.get('maintenance')
workers_count = 0
for node_uuid, driver, conductor_group in node_iter:
try:
with task_manager.acquire(context, node_uuid,
purpose='node state check') as task:
- if (task.node.maintenance
- or task.node.provision_state
- not in provision_state):
+ # Check maintenance value since it could have changed
+ # after the filtering was done.
+ if (desired_maintenance is not None
+ and desired_maintenance != task.node.maintenance):
+ continue
+
+ if task.node.provision_state not in provision_state:
continue
target_state = (None if not keep_target_state else
diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py
index 8cc5a1c0b..05abed1e1 100644
--- a/ironic/conductor/manager.py
+++ b/ironic/conductor/manager.py
@@ -3188,6 +3188,7 @@ class ConductorManager(base_manager.BaseConductorManager):
callback_timeout = CONF.conductor.inspect_wait_timeout
filters = {'reserved': False,
+ 'maintenance': False,
'provision_state': states.INSPECTWAIT,
'inspection_started_before': callback_timeout}
sort_key = 'inspection_started_at'