Skip to content

BuildStream crashes if the dependency tree is too deep

If the dependency tree depth exeeds 1000, BuildStream crashes throwing a RecursionError.

I think it shouldn't crash but print something like The dependency tree is too deep.

Below is the full stack trace:

[--:--:--] START   Loading pipeline
Traceback (most recent call last):
  File "/usr/local/bin/bst", line 11, in <module>
    load_entry_point('BuildStream', 'console_scripts', 'bst')()
  File "/usr/lib/python3/dist-packages/click/core.py", line 722, in __call__
    return self.main(*args, **kwargs)
  File "/buildstream/buildstream/_frontend/main.py", line 137, in override_main
    standalone_mode=standalone_mode, **extra)
  File "/usr/lib/python3/dist-packages/click/core.py", line 697, in main
    rv = self.invoke(ctx)
  File "/usr/lib/python3/dist-packages/click/core.py", line 1066, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/usr/lib/python3/dist-packages/click/core.py", line 895, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/usr/lib/python3/dist-packages/click/core.py", line 535, in invoke
    return callback(*args, **kwargs)
  File "/usr/lib/python3/dist-packages/click/decorators.py", line 27, in new_func
    return f(get_current_context().obj, *args, **kwargs)
  File "/buildstream/buildstream/_frontend/main.py", line 459, in show
    app.initialize(elements, except_=except_, use_configured_remote_caches=downloadable)
  File "/buildstream/buildstream/_frontend/main.py", line 864, in initialize
    rewritable=rewritable)
  File "/buildstream/buildstream/_pipeline.py", line 131, in __init__
    meta_elements = loader.load(rewritable, None)
  File "/buildstream/buildstream/_loader.py", line 225, in load
    self.load_file(target, rewritable, ticker)
  File "/buildstream/buildstream/_loader.py", line 282, in load_file
    self.load_file(dep.name, rewritable, ticker)
  File "/buildstream/buildstream/_loader.py", line 282, in load_file
    self.load_file(dep.name, rewritable, ticker)
  File "/buildstream/buildstream/_loader.py", line 282, in load_file
    self.load_file(dep.name, rewritable, ticker)
  [Previous line repeated 946 more times]
  File "/buildstream/buildstream/_loader.py", line 273, in load_file
    data = _yaml.load(fullpath, shortname=filename, copy_tree=rewritable)
  File "/buildstream/buildstream/_yaml.py", line 180, in load
    return load_data(f, shortname=shortname, copy_tree=copy_tree)
  File "/buildstream/buildstream/_yaml.py", line 191, in load_data
    contents = yaml.load(data, yaml.loader.RoundTripLoader)
  File "/usr/lib/python3/dist-packages/ruamel/yaml/main.py", line 636, in load
    return loader._constructor.get_single_data()  # type: ignore
  File "/usr/lib/python3/dist-packages/ruamel/yaml/constructor.py", line 102, in get_single_data
    node = self.composer.get_single_node()
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 75, in get_single_node
    document = self.compose_document()
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 96, in compose_document
    node = self.compose_node(None, None)
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 132, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 194, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 130, in compose_node
    node = self.compose_sequence_node(anchor)
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 163, in compose_sequence_node
    node.value.append(self.compose_node(node, index))
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 132, in compose_node
    node = self.compose_mapping_node(anchor)
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 194, in compose_mapping_node
    item_value = self.compose_node(node, item_key)
  File "/usr/lib/python3/dist-packages/ruamel/yaml/composer.py", line 106, in compose_node
    if self.parser.check_event(AliasEvent):
  File "/usr/lib/python3/dist-packages/ruamel/yaml/parser.py", line 144, in check_event
    self.current_event = self.state()
  File "/usr/lib/python3/dist-packages/ruamel/yaml/parser.py", line 572, in parse_block_mapping_value
    if self.scanner.check_token(ValueToken):
  File "/usr/lib/python3/dist-packages/ruamel/yaml/scanner.py", line 1620, in check_token
    self._gather_comments()
  File "/usr/lib/python3/dist-packages/ruamel/yaml/scanner.py", line 1662, in _gather_comments
    self.fetch_more_tokens()
  File "/usr/lib/python3/dist-packages/ruamel/yaml/scanner.py", line 304, in fetch_more_tokens
    if self.check_plain():
  File "/usr/lib/python3/dist-packages/ruamel/yaml/scanner.py", line 788, in check_plain
    if self.scanner_processing_version == (1, 1):
  File "/usr/lib/python3/dist-packages/ruamel/yaml/scanner.py", line 152, in scanner_processing_version
    return self.loader.processing_version  # type: ignore
  File "/usr/lib/python3/dist-packages/ruamel/yaml/resolver.py", line 443, in processing_version
    version = self.parser.yaml_version
RecursionError: maximum recursion depth exceeded
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information