diff options
author | Jenkins <jenkins@review.openstack.org> | 2015-03-19 14:21:23 +0000 |
---|---|---|
committer | Gerrit Code Review <review@openstack.org> | 2015-03-19 14:21:23 +0000 |
commit | 931c2597687db850a834af6de5c057354b008bcd (patch) | |
tree | 7850f0d099fe65ee6f4bf2adb47235ba1942ba71 | |
parent | bbb0cd4d2da88dd225a23a663f641a18eced5238 (diff) | |
parent | 1c9d7d54f140504b041c575d499a64f1fda3cfca (diff) | |
download | ironic-931c2597687db850a834af6de5c057354b008bcd.tar.gz |
Merge "Use task.spawn_after to maintain lock during cleaning"
-rw-r--r-- | ironic/conductor/manager.py | 34 |
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'), |