Skip to content

Commit

Permalink
Use smart subclassing in ActionExecutionValue to save memory.
Browse files Browse the repository at this point in the history
There are currently four fields in `ActionExecutionValue`:

1. `ImmutableMap` for file outputs
2. `ImmutableMap` for tree artifact outputs
3. `ImmutableList` for fileset output symlinks
4. `NestedSet` for discovered modules

However, some of these fields are mutually exclusive, and some only occur with a single file output. Subclasses are created for each distinct category of action.

The majority of the memory savings in this change come from the `SingleOutputFile` class, which is used for the vast majority of actions. It saves memory by storing the single `Artifact` and `FileArtifactValue` as fields without even using a `Map`.

Actions which output multiple files or trees still retain an `ImmutableMap`, but for those, additional memory is saved by using `Map#forEach` for iteration instead of `Map#entrySet`, which instantiates and retains a reference to the entry set.

Some unit tests had to be cleaned up to match the newly enforced preconditions checks. Serialization tests for `ActionExecutionValue` are moved to `ActionExecutionValueTest`.

PiperOrigin-RevId: 515420002
Change-Id: If4b84ee938a715733bcd817a7e70a1493413588e
  • Loading branch information
justinhorvitz authored and copybara-github committed Mar 9, 2023
1 parent caf5253 commit f057c74
Show file tree
Hide file tree
Showing 4 changed files with 315 additions and 170 deletions.
Loading

0 comments on commit f057c74

Please sign in to comment.