Handle external mutations to completionFuture in ActionExecutionState. The class assumes that the future will never be mutated except under its synchronized lock, but that is false: https://github.com/bazelbuild/bazel/blob/146d51aa1ec9dcb721a7483479ef0b1ac21d39f1/src/main/java/com/google/devtools/build/lib/concurrent/AbstractQueueVisitor.java#L485 cancels the combined future it's passed if it's interrupted, and more generally any registered futures will be canceled when the pool is interrupted.

In the case that there are three shared actions, this can trigger the following bug: action A starts executing. Actions B and C start executing. The build is interrupted at some point between here and later, but neither B's nor C's threads notice yet. Action B notices action A is already executing and sets completionFuture. It then exits, returning control to AbstractParallelEvaluator$Evaluate#run code. That code tries to register the future with AbstractQueueVisitor. Either here or later, the future is canceled when the pool is interrupted. Action A's execution thread takes some time to notice. After this cancellation, Action C starts running. It too notices Action A is already executing. But then it unexpectedly finds that the future is done.

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

Bazel

{Fast, Correct} - Choose two

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

  • Speed up your builds and tests: Bazel rebuilds only 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