summaryrefslogtreecommitdiff
path: root/lib/ansible/plugins/strategy/__init__.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/ansible/plugins/strategy/__init__.py')
-rw-r--r--lib/ansible/plugins/strategy/__init__.py11
1 files changed, 8 insertions, 3 deletions
diff --git a/lib/ansible/plugins/strategy/__init__.py b/lib/ansible/plugins/strategy/__init__.py
index d7441b0908..e44914a3ae 100644
--- a/lib/ansible/plugins/strategy/__init__.py
+++ b/lib/ansible/plugins/strategy/__init__.py
@@ -33,6 +33,7 @@ from ansible import constants as C
from ansible.errors import AnsibleError, AnsibleParserError, AnsibleUndefinedVariable
from ansible.executor.play_iterator import PlayIterator
from ansible.executor.process.worker import WorkerProcess
+from ansible.executor.task_queue_manager import WorkerSlot
from ansible.executor.task_result import TaskResult
from ansible.inventory.host import Host
from ansible.inventory.group import Group
@@ -188,12 +189,15 @@ class StrategyBase:
# way to share them with the forked processes
shared_loader_obj = SharedPluginLoaderObj()
+ # make sure the worker pool is safe
+ self._tqm.handle_dead_workers()
+
queued = False
while True:
- (worker_prc, rslt_q) = self._workers[self._cur_worker]
- if worker_prc is None or not worker_prc.is_alive():
+ (worker_slot, rslt_q) = self._workers[self._cur_worker]
+ if worker_slot.proc is None or not worker_slot.proc.is_alive():
worker_prc = WorkerProcess(rslt_q, task_vars, host, task, play_context, self._loader, self._variable_manager, shared_loader_obj)
- self._workers[self._cur_worker][0] = worker_prc
+ self._workers[self._cur_worker][0] = WorkerSlot(proc=worker_prc, host=host, task=task)
worker_prc.start()
queued = True
self._cur_worker += 1
@@ -219,6 +223,7 @@ class StrategyBase:
ret_results = []
+ self._tqm.handle_dead_workers()
while not self._final_q.empty() and not self._tqm._terminated:
try:
result = self._final_q.get()