[bitbake-devel] [PATCH] layerindexlib: Fix parsing of recursive layer dependencies

Mark Hatle mark.hatle at windriver.com
Fri Aug 9 16:49:46 UTC 2019


Ping.  I haven't seen any feedback on this and it doesn't appear to have been
included in -next.

--Mark

On 8/1/19 3:36 PM, Mark Hatle wrote:
> [YOCTO #13447]
> 
> When running bitbake-layers layerindex-fetch from 'master', there is a
> circular dependency between meta-oe and meta-python.  This triggered a maximum
> recursion depth exception.
> 
> To fix the exception, as we walk down a branch (depth first search), we track
> the layers we've already seen.  If we are about to recurse into a layer we've
> already seen we report a warning and then stop recursion.
> 
> Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
> ---
>  lib/layerindexlib/__init__.py | 21 +++++++++++++++++++--
>  1 file changed, 19 insertions(+), 2 deletions(-)
> 
> diff --git a/lib/layerindexlib/__init__.py b/lib/layerindexlib/__init__.py
> index d231cf6a..77196b40 100644
> --- a/lib/layerindexlib/__init__.py
> +++ b/lib/layerindexlib/__init__.py
> @@ -376,7 +376,7 @@ layerBranches set.  If not, they are effectively blank.'''
>                  invalid.append(name)
>  
>  
> -        def _resolve_dependencies(layerbranches, ignores, dependencies, invalid):
> +        def _resolve_dependencies(layerbranches, ignores, dependencies, invalid, processed=None):
>              for layerbranch in layerbranches:
>                  if ignores and layerbranch.layer.name in ignores:
>                      continue
> @@ -388,6 +388,13 @@ layerBranches set.  If not, they are effectively blank.'''
>                      if ignores and deplayerbranch.layer.name in ignores:
>                          continue
>  
> +                    # Since this is depth first, we need to know what we're currently processing
> +                    # in order to avoid infinite recursion on a loop.
> +                    if processed and deplayerbranch.layer.name in processed:
> +                        # We have found a recursion...
> +                        logger.warning('Circular layer dependency found: %s -> %s' % (processed, deplayerbranch.layer.name))
> +                        continue
> +
>                      # This little block is why we can't re-use the LayerIndexObj version,
>                      # we must be able to satisfy each dependencies across layer indexes and
>                      # use the layer index order for priority.  (r stands for replacement below)
> @@ -411,7 +418,17 @@ layerBranches set.  If not, they are effectively blank.'''
>  
>                      # New dependency, we need to resolve it now... depth-first
>                      if deplayerbranch.layer.name not in dependencies:
> -                        (dependencies, invalid) = _resolve_dependencies([deplayerbranch], ignores, dependencies, invalid)
> +                        # Avoid recursion on this branch.
> +                        # We copy so we don't end up polluting the depth-first branch with other
> +                        # branches.  Duplication between individual branches IS expected and
> +                        # handled by 'dependencies' processing.
> +                        if not processed:
> +                            local_processed = []
> +                        else:
> +                            local_processed = processed.copy()
> +                        local_processed.append(deplayerbranch.layer.name)
> +
> +                        (dependencies, invalid) = _resolve_dependencies([deplayerbranch], ignores, dependencies, invalid, local_processed)
>  
>                      if deplayerbranch.layer.name not in dependencies:
>                          dependencies[deplayerbranch.layer.name] = [deplayerbranch, layerdependency]
> 



More information about the bitbake-devel mailing list