More playbook executor compatibility fixes

With some earlier changes, continuing to forward failed hosts on
to the iterator with each TQM run() call was causing plays with
max_fail_pct set to fail, as hosts which failed in previous plays
were counting those old failures against the % calculation.

Also changed the linear strategy's calculation to use the internal
failed list, rather than the iterator, as this now represents the
hosts failed during the current run only.
pull/15918/head
James Cammarata 9 years ago
parent aad9f43dda
commit 74a252d0a5

@ -236,13 +236,16 @@ class TaskQueueManager:
start_at_done = self._start_at_done, start_at_done = self._start_at_done,
) )
# because the TQM may survive multiple play runs, we start by # Because the TQM may survive multiple play runs, we start by marking
# marking any hosts as failed in the iterator here which may # any hosts as failed in the iterator here which may have been marked
# have been marked as failed in previous runs. # as failed in previous runs. Then we clear the internal list of failed
# hosts so we know what failed this round.
for host_name in self._failed_hosts.keys(): for host_name in self._failed_hosts.keys():
host = self._inventory.get_host(host_name) host = self._inventory.get_host(host_name)
iterator.mark_host_failed(host) iterator.mark_host_failed(host)
self.clear_failed_hosts()
# during initialization, the PlayContext will clear the start_at_task # during initialization, the PlayContext will clear the start_at_task
# field to signal that a matching task was found, so check that here # field to signal that a matching task was found, so check that here
# and remember it so we don't try to skip tasks on future plays # and remember it so we don't try to skip tasks on future plays
@ -251,6 +254,11 @@ class TaskQueueManager:
# and run the play using the strategy and cleanup on way out # and run the play using the strategy and cleanup on way out
play_return = strategy.run(iterator, play_context) play_return = strategy.run(iterator, play_context)
# now re-save the hosts that failed from the iterator to our internal list
for host_name in iterator.get_failed_hosts():
self._failed_hosts[host_name] = True
self._cleanup_processes() self._cleanup_processes()
return play_return return play_return

@ -367,7 +367,7 @@ class StrategyModule(StrategyBase):
if iterator._play.max_fail_percentage is not None and len(results) > 0: if iterator._play.max_fail_percentage is not None and len(results) > 0:
percentage = iterator._play.max_fail_percentage / 100.0 percentage = iterator._play.max_fail_percentage / 100.0
if (len(iterator.get_failed_hosts()) / len(results)) > percentage: if (len(self._tqm._failed_hosts) / len(results)) > percentage:
for host in hosts_left: for host in hosts_left:
# don't double-mark hosts, or the iterator will potentially # don't double-mark hosts, or the iterator will potentially
# fail them out of the rescue/always states # fail them out of the rescue/always states

Loading…
Cancel
Save