Mitigate unordered dirtying of rewound nodes by allowing repeats

When a Skyframe node is restarted, and it dirties some of its transitive
dependencies, it does not dirty those dependencies as a single atomic
action, nor does it dirty them in a reverse topological order (i.e.
starting from the leaves of the dirtied subgraph and proceeding to the
subgraph's root(s)).

This leaves rewinding vulnerable to a race where e.g. a sibling action
requests the to-be-dirtied subgraph's root artifact node (corresponding
to the lost input) after it's been dirtied, but before its child
generating action node has been dirtied.

That artifact node may then evaluate to completion, and become done,
before its child is dirtied. Then, when the failed action node (which
requested the rewinding) restarts, and requests its inputs, it will find
the lost input's node is done and proceed with its evaluation, despite
that its lost input's generating action has yet to run.

A proper fix will ensure that no node in a rewinding's to-be-dirtied
subgraph is scheduled for evaluation before its transitive deps in that
subgraph are dirtied.

Drive-by limiting of action toString length in rewinding log statements.

RELNOTES: None.
PiperOrigin-RevId: 235625329
1 file changed
tree: 822fb56878d8674ed30028acec1396e5be8a40b9
  1. .bazelci/
  2. examples/
  3. scripts/
  4. site/
  5. src/
  6. third_party/
  7. tools/
  8. .gitattributes
  9. .gitignore
  10. AUTHORS
  11. BUILD
  12. CHANGELOG.md
  13. CODEOWNERS
  14. combine_distfiles.py
  15. combine_distfiles_to_tar.sh
  16. compile.sh
  17. CONTRIBUTING.md
  18. CONTRIBUTORS
  19. distdir.bzl
  20. ISSUE_TEMPLATE.md
  21. LICENSE
  22. README.md
  23. WORKSPACE
README.md

Bazel

{Fast, Correct} - Choose two

Build and test software of any size, quickly and reliably.

  • Speed up your builds and tests: Bazel only rebuilds what is necessary. With advanced local and distributed caching, optimized dependency analysis and parallel execution, you get fast and incremental builds.

  • One tool, multiple languages: Build and test Java, C++, Android, iOS, Go, and a wide variety of other language platforms. Bazel runs on Windows, macOS, and Linux.

  • Scalable: Bazel helps you scale your organization, codebase, and continuous integration solution. It handles codebases of any size, in multiple repositories or a huge monorepo.

  • Extensible to your needs: Easily add support for new languages and platforms with Bazel's familiar extension language. Share and re-use language rules written by the growing Bazel community.

Getting Started

Documentation

Contributing to Bazel

See CONTRIBUTING.md

Build status

Bazel is released in ‘Beta’. See the product roadmap to learn about the path toward a stable 1.0 release.