1
0
Fork 0
mirror of https://github.com/ansible-collections/community.general.git synced 2024-09-14 20:13:21 +02:00

Re-use logic from StrategyBase._load_included_file in StrategyModule.run for free and linear (#36470)

This improves include_role performance and recursion limits
This commit is contained in:
Matt Martz 2018-02-21 09:53:15 -06:00 committed by GitHub
parent 7a55fe99ef
commit 10fefc7156
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 11 deletions

View file

@ -750,6 +750,20 @@ class StrategyBase:
return changed return changed
def _copy_included_file(self, included_file):
'''
A proven safe and performant way to create a copy of an included file
'''
ti_copy = included_file._task.copy(exclude_parent=True)
ti_copy._parent = included_file._task._parent
temp_vars = ti_copy.vars.copy()
temp_vars.update(included_file._args)
ti_copy.vars = temp_vars
return ti_copy
def _load_included_file(self, included_file, iterator, is_handler=False): def _load_included_file(self, included_file, iterator, is_handler=False):
''' '''
Loads an included YAML file of tasks, applying the optional set of variables. Loads an included YAML file of tasks, applying the optional set of variables.
@ -763,10 +777,7 @@ class StrategyBase:
elif not isinstance(data, list): elif not isinstance(data, list):
raise AnsibleError("included task files must contain a list of tasks") raise AnsibleError("included task files must contain a list of tasks")
ti_copy = included_file._task.copy(exclude_parent=True) ti_copy = self._copy_included_file(included_file)
ti_copy._parent = included_file._task._parent
temp_vars = ti_copy.vars.copy()
temp_vars.update(included_file._args)
# pop tags out of the include args, if they were specified there, and assign # pop tags out of the include args, if they were specified there, and assign
# them to the include. If the include already had tags specified, we raise an # them to the include. If the include already had tags specified, we raise an
# error so that users know not to specify them both ways # error so that users know not to specify them both ways
@ -781,8 +792,6 @@ class StrategyBase:
display.deprecated("You should not specify tags in the include parameters. All tags should be specified using the task-level option") display.deprecated("You should not specify tags in the include parameters. All tags should be specified using the task-level option")
included_file._task.tags = tags included_file._task.tags = tags
ti_copy.vars = temp_vars
block_list = load_list_of_blocks( block_list = load_list_of_blocks(
data, data,
play=iterator._play, play=iterator._play,

View file

@ -193,10 +193,9 @@ class StrategyModule(StrategyBase):
display.debug("collecting new blocks for %s" % included_file) display.debug("collecting new blocks for %s" % included_file)
try: try:
if included_file._is_role: if included_file._is_role:
new_ir = included_file._task.copy() new_ir = self._copy_included_file(included_file)
new_ir.vars.update(included_file._args)
new_blocks, handler_blocks = included_file._task.get_block_list( new_blocks, handler_blocks = new_ir.get_block_list(
play=iterator._play, play=iterator._play,
variable_manager=self._variable_manager, variable_manager=self._variable_manager,
loader=self._loader, loader=self._loader,

View file

@ -324,8 +324,7 @@ class StrategyModule(StrategyBase):
# list of noop tasks, to make sure that they continue running in lock-step # list of noop tasks, to make sure that they continue running in lock-step
try: try:
if included_file._is_role: if included_file._is_role:
new_ir = included_file._task.copy() new_ir = self._copy_included_file(included_file)
new_ir.vars.update(included_file._args)
new_blocks, handler_blocks = new_ir.get_block_list( new_blocks, handler_blocks = new_ir.get_block_list(
play=iterator._play, play=iterator._play,