summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2015-03-19 14:21:23 +0000
committerGerrit Code Review <review@openstack.org>2015-03-19 14:21:23 +0000
commit931c2597687db850a834af6de5c057354b008bcd (patch)
tree7850f0d099fe65ee6f4bf2adb47235ba1942ba71
parentbbb0cd4d2da88dd225a23a663f641a18eced5238 (diff)
parent1c9d7d54f140504b041c575d499a64f1fda3cfca (diff)
downloadironic-931c2597687db850a834af6de5c057354b008bcd.tar.gz
Merge "Use task.spawn_after to maintain lock during cleaning"
-rw-r--r--ironic/conductor/manager.py34
1 files changed, 18 insertions, 16 deletions
diff --git a/ironic/conductor/manager.py b/ironic/conductor/manager.py
index 93b468fde..64f19e1bd 100644
--- a/ironic/conductor/manager.py
+++ b/ironic/conductor/manager.py
@@ -856,7 +856,10 @@ class ConductorManager(periodic_task.PeriodicTasks):
{'node': task.node.uuid,
'state': task.node.provision_state,
'clean_state': states.CLEANING})
- self._spawn_worker(
+ task.set_spawn_error_hook(cleaning_error_handler, task.node,
+ 'Failed to run next clean step')
+ task.spawn_after(
+ self._spawn_worker,
self._do_next_clean_step,
task,
task.node.driver_internal_info.get('clean_steps', []),
@@ -905,10 +908,9 @@ class ConductorManager(periodic_task.PeriodicTasks):
return
set_node_cleaning_steps(task)
-
self._do_next_clean_step(task,
- node.driver_internal_info['clean_steps'],
- node.clean_step)
+ node.driver_internal_info.get('clean_steps', []),
+ node.clean_step)
def _do_next_clean_step(self, task, steps, last_step):
"""Start executing cleaning/zapping steps from the last step (if any).
@@ -920,7 +922,6 @@ class ConductorManager(periodic_task.PeriodicTasks):
from the beginning
"""
node = task.node
-
# Trim already executed steps
if last_step:
try:
@@ -934,9 +935,9 @@ class ConductorManager(periodic_task.PeriodicTasks):
LOG.exception(msg)
return cleaning_error_handler(task, msg)
- LOG.debug('Executing %(state)s on node %(node)s, remaining steps: '
- '%(steps)s', {'node': node.uuid, 'steps': steps,
- 'state': node.provision_state})
+ LOG.info(_LI('Executing %(state)s on node %(node)s, remaining steps: '
+ '%(steps)s'), {'node': node.uuid, 'steps': steps,
+ 'state': node.provision_state})
# Execute each step until we hit an async step or run out of steps
for step in steps:
# Save which step we're about to start so we can restart
@@ -944,14 +945,15 @@ class ConductorManager(periodic_task.PeriodicTasks):
node.clean_step = step
node.save()
interface = getattr(task.driver, step.get('interface'))
- LOG.debug('Executing %(step)s on node %(node)s',
- {'step': step, 'node': node.uuid})
+ LOG.info(_LI('Executing %(step)s on node %(node)s'),
+ {'step': step, 'node': node.uuid})
try:
result = interface.execute_clean_step(task, step)
except Exception as e:
msg = (_('Node %(node)s failed step %(step)s: '
'%(exc)s') %
- {'node': node.uuid, 'exc': e, 'step': node.clean_step})
+ {'node': node.uuid, 'exc': e,
+ 'step': node.clean_step})
LOG.exception(msg)
cleaning_error_handler(task, msg)
return
@@ -962,14 +964,14 @@ class ConductorManager(periodic_task.PeriodicTasks):
if result == states.CLEANING:
# Kill this worker, the async step will make an RPC call to
# continue_node_clean to continue cleaning
- LOG.debug('Waiting for node %(node)s to call continue after '
- 'async clean step %(step)s',
- {'node': node.uuid, 'step': step})
+ LOG.info(_LI('Clean step %(step)s on node %(node)s being '
+ 'executed asynchronously, waiting for driver.') %
+ {'node': node.uuid, 'step': step})
return
elif result is not None:
msg = (_('While executing step %(step)s on node '
- '%(node)s, step returned invalid value: %(val)s') %
- {'step': step, 'node': node.uuid, 'val': result})
+ '%(node)s, step returned invalid value: %(val)s')
+ % {'step': step, 'node': node.uuid, 'val': result})
LOG.error(msg)
return cleaning_error_handler(task, msg)
LOG.info(_LI('Node %(node)s finished clean step %(step)s'),