Move rewinding-related classes to a `rewinding` package and make some related cleanups. PiperOrigin-RevId: 440414212
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 3a22a1b..a748ce7 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -345,6 +345,7 @@ "//src/main/java/com/google/devtools/build/lib/skyframe:top_level_aspects_value", "//src/main/java/com/google/devtools/build/lib/skyframe:workspace_info", "//src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2:actiongraph_v2", + "//src/main/java/com/google/devtools/build/lib/skyframe/rewinding", "//src/main/java/com/google/devtools/build/lib/unix", "//src/main/java/com/google/devtools/build/lib/util", "//src/main/java/com/google/devtools/build/lib/util:TestType",
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java b/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java index a322f12..3491b33 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/CriticalPathComputer.java
@@ -27,7 +27,6 @@ import com.google.devtools.build.lib.actions.ActionCompletionEvent; import com.google.devtools.build.lib.actions.ActionKeyContext; import com.google.devtools.build.lib.actions.ActionMiddlemanEvent; -import com.google.devtools.build.lib.actions.ActionRewoundEvent; import com.google.devtools.build.lib.actions.ActionStartedEvent; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.AggregatedSpawnMetrics; @@ -38,6 +37,7 @@ import com.google.devtools.build.lib.actions.SpawnMetrics; import com.google.devtools.build.lib.actions.SpawnResult; import com.google.devtools.build.lib.clock.Clock; +import com.google.devtools.build.lib.skyframe.rewinding.ActionRewoundEvent; import java.time.Duration; import java.util.Comparator; import java.util.List;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java index 957a74a..b1bf5c0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java
@@ -43,7 +43,6 @@ import com.google.devtools.build.lib.actions.ActionInputMap; import com.google.devtools.build.lib.actions.ActionInputMapSink; import com.google.devtools.build.lib.actions.ActionLookupData; -import com.google.devtools.build.lib.actions.ActionRewoundEvent; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.AlreadyReportedActionExecutionException; import com.google.devtools.build.lib.actions.Artifact; @@ -80,11 +79,13 @@ import com.google.devtools.build.lib.server.FailureDetails.Execution; import com.google.devtools.build.lib.server.FailureDetails.Execution.Code; import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; -import com.google.devtools.build.lib.skyframe.ActionRewindStrategy.RewindPlan; import com.google.devtools.build.lib.skyframe.ArtifactFunction.MissingArtifactValue; import com.google.devtools.build.lib.skyframe.ArtifactFunction.SourceArtifactException; import com.google.devtools.build.lib.skyframe.ArtifactNestedSetFunction.ArtifactNestedSetEvalException; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionPostprocessing; +import com.google.devtools.build.lib.skyframe.rewinding.ActionRewindStrategy; +import com.google.devtools.build.lib.skyframe.rewinding.ActionRewindStrategy.RewindPlan; +import com.google.devtools.build.lib.skyframe.rewinding.ActionRewoundEvent; import com.google.devtools.build.lib.util.DetailedExitCode; import com.google.devtools.build.lib.util.DetailedExitCode.DetailedExitCodeComparator; import com.google.devtools.build.lib.util.Pair; @@ -136,7 +137,7 @@ * in-flight primary shared action's execution, this function can abort after declaring an external * dep on the execution's completion future. */ -public class ActionExecutionFunction implements SkyFunction { +public final class ActionExecutionFunction implements SkyFunction { private final ActionRewindStrategy actionRewindStrategy = new ActionRewindStrategy(); private final SkyframeActionExecutor skyframeActionExecutor; @@ -1099,7 +1100,7 @@ return Predicates.alwaysTrue(); } - return new Predicate<Artifact>() { + return new Predicate<>() { // Lazily flatten the NestedSet in case the predicate is never needed. It's only used in the // exceptional case of a missing artifact. private ImmutableSet<Artifact> mandatoryInputs = null;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionUtils.java index 3e9897b..aa0f702 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionUtils.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionUtils.java
@@ -23,7 +23,7 @@ public final class ActionUtils { @Nullable - static Action getActionForLookupData(Environment env, ActionLookupData actionLookupData) + public static Action getActionForLookupData(Environment env, ActionLookupData actionLookupData) throws InterruptedException { ActionLookupValue actionLookupValue = ArtifactFunction.getActionLookupValue(actionLookupData.getActionLookupKey(), env);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java index d6350cc..7f2b07f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
@@ -29,7 +29,6 @@ import com.google.devtools.build.lib.actions.Artifact.DerivedArtifact; import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; -import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.FilesetTraversalParams.DirectTraversalRoot; @@ -40,6 +39,7 @@ import com.google.devtools.build.lib.server.FailureDetails.Execution; import com.google.devtools.build.lib.server.FailureDetails.Execution.Code; import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; +import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalFunction.RecursiveFilesystemTraversalException; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.ResolvedFile; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalValue.TraversalRequest; @@ -68,7 +68,8 @@ * directly from the corresponding {@link ActionExecutionValue}. This SkyFunction is therefore only * usable for source, middleman, and tree artifacts. */ -class ArtifactFunction implements SkyFunction { +public final class ArtifactFunction implements SkyFunction { + private final Supplier<Boolean> mkdirForTreeArtifacts; private final MetadataConsumerForMetrics sourceArtifactsSeen; private final XattrProvider xattrProvider; @@ -184,21 +185,17 @@ private static TreeArtifactValue createTreeArtifactValueFromActionKey( ArtifactDependencies artifactDependencies, Environment env) throws InterruptedException { - // Request the list of expanded actions from the ActionTemplate. - ActionTemplateExpansion actionTemplateExpansion = - artifactDependencies.getActionTemplateExpansion(env); - if (actionTemplateExpansion == null) { - // The expanded actions are not yet available. - return null; - } + // Request the list of expanded action keys from the ActionTemplate. ImmutableList<ActionLookupData> expandedActionExecutionKeys = - actionTemplateExpansion.getExpandedActionExecutionKeys(); + artifactDependencies.getActionTemplateExpansionKeys(env); + if (expandedActionExecutionKeys == null) { + return null; // The expanded actions are not yet available. + } - SkyframeIterableResult expandedActionValueMap = + SkyframeIterableResult expandedActionValues = env.getOrderedValuesAndExceptions(expandedActionExecutionKeys); if (env.valuesMissing()) { - // The execution values of the expanded actions are not yet all available. - return null; + return null; // The execution values of the expanded actions are not yet all available. } // Aggregate the metadata for individual TreeFileArtifacts into a TreeArtifactValue for the @@ -210,7 +207,7 @@ for (ActionLookupData actionKey : expandedActionExecutionKeys) { boolean sawTreeChild = false; ActionExecutionValue actionExecutionValue = - (ActionExecutionValue) expandedActionValueMap.next(); + (ActionExecutionValue) expandedActionValues.next(); if (actionExecutionValue == null) { return null; } @@ -416,15 +413,8 @@ return Label.print(((Artifact) skyKey).getOwner()); } - static ActionLookupKey getActionLookupKey(Artifact artifact) { - ArtifactOwner artifactOwner = artifact.getArtifactOwner(); - Preconditions.checkState( - artifactOwner instanceof ActionLookupKey, "%s %s", artifact, artifactOwner); - return (ActionLookupKey) artifactOwner; - } - @Nullable - static ActionLookupValue getActionLookupValue( + public static ActionLookupValue getActionLookupValue( ActionLookupKey actionLookupKey, SkyFunction.Environment env) throws InterruptedException { ActionLookupValue value = (ActionLookupValue) env.getValue(actionLookupKey); if (value == null) { @@ -484,7 +474,7 @@ /** Describes dependencies of derived artifacts. */ // TODO(b/19539699): extend this to comprehensively support all special artifact types (e.g. // middleman, etc). - static class ArtifactDependencies { + public static final class ArtifactDependencies { private final DerivedArtifact artifact; private final ActionLookupValue actionLookupValue; @@ -498,7 +488,7 @@ * {@code null} if any dependencies are not yet ready. */ @Nullable - static ArtifactDependencies discoverDependencies( + public static ArtifactDependencies discoverDependencies( Artifact.DerivedArtifact derivedArtifact, SkyFunction.Environment env) throws InterruptedException { @@ -512,10 +502,11 @@ return new ArtifactDependencies(derivedArtifact, actionLookupValue); } - boolean isTemplateActionForTreeArtifact() { + public boolean isTemplateActionForTreeArtifact() { return maybeGetTemplateActionForTreeArtifact() != null; } + @Nullable ActionTemplate<?> maybeGetTemplateActionForTreeArtifact() { if (!artifact.isTreeArtifact()) { return null; @@ -526,22 +517,29 @@ } /** - * Returns action template expansion information or {@code null} if that information is - * unavailable. + * Returns action template expansion keys or {@code null} if that information is unavailable. * - * <p>Must not be called if {@code !isTemplateActionForTreeArtifact()}. + * <p>Must only be called if {@link #isTemplateActionForTreeArtifact} returns {@code true}. */ @Nullable - ActionTemplateExpansion getActionTemplateExpansion(SkyFunction.Environment env) - throws InterruptedException { + public ImmutableList<ActionLookupData> getActionTemplateExpansionKeys( + SkyFunction.Environment env) throws InterruptedException { Preconditions.checkState( isTemplateActionForTreeArtifact(), "Action is unexpectedly non-template: %s", this); - ActionTemplateExpansionValue.ActionTemplateExpansionKey key = + ActionTemplateExpansionKey key = ActionTemplateExpansionValue.key( artifact.getArtifactOwner(), artifact.getGeneratingActionKey().getActionIndex()); - // This call may throw an ActionExecutionFunction that bubbles up. ActionTemplateExpansionValue value = (ActionTemplateExpansionValue) env.getValue(key); - return value == null ? null : new ActionTemplateExpansion(value); + if (value == null) { + return null; + } + ImmutableList.Builder<ActionLookupData> expandedActionExecutionKeys = + ImmutableList.builderWithExpectedSize(value.getNumActions()); + for (ActionAnalysisMetadata action : value.getActions()) { + expandedActionExecutionKeys.add( + ((DerivedArtifact) action.getPrimaryOutput()).getGeneratingActionKey()); + } + return expandedActionExecutionKeys.build(); } @Override @@ -554,29 +552,6 @@ } } - static class ActionTemplateExpansion { - private final ActionTemplateExpansionValue value; - - private ActionTemplateExpansion(ActionTemplateExpansionValue value) { - this.value = value; - } - - ActionTemplateExpansionValue getValue() { - return value; - } - - ImmutableList<ActionLookupData> getExpandedActionExecutionKeys() { - int numActions = value.getNumActions(); - ImmutableList.Builder<ActionLookupData> expandedActionExecutionKeys = - ImmutableList.builderWithExpectedSize(numActions); - for (ActionAnalysisMetadata action : value.getActions()) { - expandedActionExecutionKeys.add( - ((DerivedArtifact) action.getPrimaryOutput()).getGeneratingActionKey()); - } - return expandedActionExecutionKeys.build(); - } - } - static final class SourceArtifactException extends Exception implements DetailedException { private final DetailedExitCode detailedExitCode;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD index 9bcaa0e..4ff1187 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -8,6 +8,7 @@ "//src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2:srcs", "//src/main/java/com/google/devtools/build/lib/skyframe/packages:srcs", "//src/main/java/com/google/devtools/build/lib/skyframe/proto:srcs", + "//src/main/java/com/google/devtools/build/lib/skyframe/rewinding:srcs", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization:srcs", ], visibility = ["//src:__subpackages__"], @@ -88,7 +89,6 @@ ":action_input_map_helper", ":action_lookup_conflict_finding_value", ":action_metadata_handler", - ":action_rewind_strategy", ":action_template_expansion_function", ":action_template_expansion_value", ":action_utils", @@ -312,6 +312,7 @@ "//src/main/java/com/google/devtools/build/lib/rules:repository/resolved_file_value", "//src/main/java/com/google/devtools/build/lib/rules:repository/workspace_file_helper", "//src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2:actiongraph_v2", + "//src/main/java/com/google/devtools/build/lib/skyframe/rewinding", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec:serialization-constant", "//src/main/java/com/google/devtools/build/lib/util", @@ -485,35 +486,6 @@ ) java_library( - name = "action_rewind_strategy", - srcs = [ - "ActionRewindStrategy.java", - "ActionRewindingStats.java", - ], - deps = [ - ":action_utils", - ":artifact_function", - ":artifact_nested_set_key", - ":skyframe_aware_action", - "//src/main/java/com/google/devtools/build/lib/actions", - "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_data", - "//src/main/java/com/google/devtools/build/lib/actions:artifacts", - "//src/main/java/com/google/devtools/build/lib/bugreport", - "//src/main/java/com/google/devtools/build/lib/collect/nestedset", - "//src/main/java/com/google/devtools/build/lib/events", - "//src/main/java/com/google/devtools/build/lib/skyframe/proto:action_rewind_event_java_proto", - "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code", - "//src/main/java/com/google/devtools/build/skyframe", - "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", - "//src/main/protobuf:failure_details_java_proto", - "//third_party:auto_value", - "//third_party:flogger", - "//third_party:guava", - "//third_party:jsr305", - ], -) - -java_library( name = "action_template_expansion_function", srcs = ["ActionTemplateExpansionFunction.java"], deps = [ @@ -641,7 +613,6 @@ "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_data", "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_key", - "//src/main/java/com/google/devtools/build/lib/actions:artifact_owner", "//src/main/java/com/google/devtools/build/lib/actions:artifacts", "//src/main/java/com/google/devtools/build/lib/actions:file_metadata", "//src/main/java/com/google/devtools/build/lib/actions:middleman_type",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindStrategy.java b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindStrategy.java similarity index 94% rename from src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindStrategy.java rename to src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindStrategy.java index 5539f97..b25bd25 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindStrategy.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindStrategy.java
@@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.skyframe; +package com.google.devtools.build.lib.skyframe.rewinding; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkNotNull; @@ -23,7 +23,6 @@ import com.google.auto.value.AutoValue; import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.Collections2; import com.google.common.collect.ConcurrentHashMultiset; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -53,6 +52,10 @@ import com.google.devtools.build.lib.server.FailureDetails.ActionRewinding; import com.google.devtools.build.lib.server.FailureDetails.ActionRewinding.Code; import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; +import com.google.devtools.build.lib.skyframe.ActionUtils; +import com.google.devtools.build.lib.skyframe.ArtifactFunction.ArtifactDependencies; +import com.google.devtools.build.lib.skyframe.ArtifactNestedSetKey; +import com.google.devtools.build.lib.skyframe.SkyframeAwareAction; import com.google.devtools.build.lib.skyframe.proto.ActionRewind.ActionRewindEvent; import com.google.devtools.build.lib.util.DetailedExitCode; import com.google.devtools.build.skyframe.SkyFunction.Environment; @@ -73,7 +76,8 @@ * actions, this finds the actions which generated them and the set of Skyframe nodes which must be * restarted in order to recreate the lost inputs. */ -public class ActionRewindStrategy { +public final class ActionRewindStrategy { + private static final GoogleLogger logger = GoogleLogger.forEnclosingClass(); @VisibleForTesting public static final int MAX_REPEATED_LOST_INPUTS = 20; @VisibleForTesting public static final int MAX_ACTION_REWIND_EVENTS = 5; @@ -91,8 +95,9 @@ * <ol> * <li>the Skyframe nodes to restart to recreate the lost inputs specified by {@code * lostInputsException} - * <li>the actions whose execution state (in {@link SkyframeActionExecutor}) must be reset - * (aside from failedAction, which the caller already knows must be reset) + * <li>the actions whose execution state (in {@link + * com.google.devtools.build.lib.skyframe.SkyframeActionExecutor}) must be reset (aside from + * failedAction, which the caller already knows must be reset) * </ol> * * <p>Note that all Skyframe nodes between the currently executing (failed) action's node and the @@ -103,7 +108,7 @@ * @throws ActionExecutionException if any lost inputs have been seen by this action as lost * before, or if any lost inputs are not the outputs of previously executed actions */ - RewindPlan getRewindPlan( + public RewindPlan getRewindPlan( Action failedAction, ActionLookupData actionLookupData, Set<SkyKey> failedActionDeps, @@ -136,7 +141,7 @@ inputDepOwners, ImmutableSet.<SkyKey>builder() .addAll(failedActionDeps) - .addAll(Collections2.transform(nestedSetKeys.keySet(), Artifact::key)) + .addAll(Artifact.keys(nestedSetKeys.keySet())) .build(), failedAction, lostInputsException); @@ -182,7 +187,7 @@ * Log the top N action rewind events and clear the history of failed actions' lost inputs and * rewind plans. */ - void reset(ExtendedEventHandler eventHandler) { + public void reset(ExtendedEventHandler eventHandler) { ImmutableList<ActionRewindEvent> topActionRewindEvents = rewindPlansStats.stream() .collect( @@ -535,8 +540,8 @@ if (!lostInput.isTreeArtifact()) { return ImmutableSet.of(lostInput.getGeneratingActionKey()); } - ArtifactFunction.ArtifactDependencies artifactDependencies = - ArtifactFunction.ArtifactDependencies.discoverDependencies(lostInput, env); + ArtifactDependencies artifactDependencies = + ArtifactDependencies.discoverDependencies(lostInput, env); if (artifactDependencies == null) { return null; } @@ -544,14 +549,15 @@ if (!artifactDependencies.isTemplateActionForTreeArtifact()) { return ImmutableSet.of(lostInput.getGeneratingActionKey()); } - ArtifactFunction.ActionTemplateExpansion actionTemplateExpansion = - artifactDependencies.getActionTemplateExpansion(env); - if (actionTemplateExpansion == null) { - return null; - } + // This ignores the ActionTemplateExpansionKey dependency of the template artifact because we // expect to never need to rewind that. - return ImmutableSet.copyOf(actionTemplateExpansion.getExpandedActionExecutionKeys()); + ImmutableList<ActionLookupData> actionTemplateExpansionKeys = + artifactDependencies.getActionTemplateExpansionKeys(env); + if (actionTemplateExpansionKeys == null) { + return null; + } + return ImmutableSet.copyOf(actionTemplateExpansionKeys); } private static void assertSkyframeAwareRewindingGraph( @@ -614,20 +620,24 @@ .build())); } - static class RewindPlan { + /** + * Specifies the Skyframe nodes and actions that need to be restarted in order to recreate lost + * inputs. + */ + public static final class RewindPlan { private final Restart nodesToRestart; private final ImmutableList<Action> additionalActionsToRestart; - RewindPlan(Restart nodesToRestart, ImmutableList<Action> additionalActionsToRestart) { + private RewindPlan(Restart nodesToRestart, ImmutableList<Action> additionalActionsToRestart) { this.nodesToRestart = nodesToRestart; this.additionalActionsToRestart = additionalActionsToRestart; } - Restart getNodesToRestart() { + public Restart getNodesToRestart() { return nodesToRestart; } - ImmutableList<Action> getAdditionalActionsToRestart() { + public ImmutableList<Action> getAdditionalActionsToRestart() { return additionalActionsToRestart; } } @@ -701,9 +711,10 @@ * <p>More formally, a key-value pair {@code (Artifact k, ArtifactNestedSetKey v)} is present in * the returned map iff {@code deps.contains(v) && v.getSet().toList().contains(k)}. * - * <p>When {@link ActionExecutionFunction} requests input deps, it unwraps a single layer of - * {@linkplain Action#getInputs the action's inputs}, thus requesting an {@link - * ArtifactNestedSetKey} for each of {@code action.getInputs().getNonLeaves()}. + * <p>When {@link com.google.devtools.build.lib.skyframe.ActionExecutionFunction} requests input + * deps, it unwraps a single layer of {@linkplain Action#getInputs the action's inputs}, thus + * requesting an {@link ArtifactNestedSetKey} for each of {@code + * action.getInputs().getNonLeaves()}. */ private static Multimap<Artifact, ArtifactNestedSetKey> expandNestedSetKeys(Set<SkyKey> deps) { Multimap<Artifact, ArtifactNestedSetKey> map =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindingStats.java b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindingStats.java similarity index 85% rename from src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindingStats.java rename to src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindingStats.java index 2d306eb..5b0f1cf 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionRewindingStats.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewindingStats.java
@@ -12,26 +12,28 @@ // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.skyframe; +package com.google.devtools.build.lib.skyframe.rewinding; +import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.collect.ImmutableList.toImmutableList; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.events.ExtendedEventHandler; -import com.google.devtools.build.lib.skyframe.ActionRewindStrategy.RewindPlanStats; import com.google.devtools.build.lib.skyframe.proto.ActionRewind.ActionDescription; import com.google.devtools.build.lib.skyframe.proto.ActionRewind.ActionRewindEvent; import com.google.devtools.build.lib.skyframe.proto.ActionRewind.LostInput; +import com.google.devtools.build.lib.skyframe.rewinding.ActionRewindStrategy.RewindPlanStats; /** Event that encapsulates data about action rewinding during a build. */ -public class ActionRewindingStats implements ExtendedEventHandler.Postable { +public final class ActionRewindingStats implements ExtendedEventHandler.Postable { + private final int lostInputsCount; private final ImmutableList<ActionRewindEvent> actionRewindEvents; ActionRewindingStats(int lostInputsCount, ImmutableList<ActionRewindEvent> actionRewindEvents) { this.lostInputsCount = lostInputsCount; - this.actionRewindEvents = actionRewindEvents; + this.actionRewindEvents = checkNotNull(actionRewindEvents); } public int lostInputsCount() { @@ -42,7 +44,7 @@ return actionRewindEvents; } - public static ActionRewindEvent toActionRewindEventProto(RewindPlanStats rewindPlanStats) { + static ActionRewindEvent toActionRewindEventProto(RewindPlanStats rewindPlanStats) { ActionOwner failedActionOwner = rewindPlanStats.failedAction().getOwner(); return ActionRewindEvent.newBuilder() .setActionDescription(
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionRewoundEvent.java b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewoundEvent.java similarity index 86% rename from src/main/java/com/google/devtools/build/lib/actions/ActionRewoundEvent.java rename to src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewoundEvent.java index ee5f8b9..76c9af1 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionRewoundEvent.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/ActionRewoundEvent.java
@@ -11,16 +11,16 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.actions; +package com.google.devtools.build.lib.skyframe.rewinding; +import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.events.ExtendedEventHandler.ProgressLike; /** * This event is fired during the build for an action that failed because of lost inputs, and that - * will try to recover through rewinding (see {@link - * com.google.devtools.build.lib.skyframe.ActionRewindStrategy}). + * will try to recover through rewinding (see {@link ActionRewindStrategy}). */ -public class ActionRewoundEvent implements ProgressLike { +public final class ActionRewoundEvent implements ProgressLike { private final long relativeActionStartTime; private final Action failedRewoundAction;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/BUILD new file mode 100644 index 0000000..cb08b65 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/rewinding/BUILD
@@ -0,0 +1,41 @@ +load("@rules_java//java:defs.bzl", "java_library") + +package(default_visibility = ["//src:__subpackages__"]) + +licenses(["notice"]) + +filegroup( + name = "srcs", + srcs = glob(["**"]), + visibility = ["//src:__subpackages__"], +) + +java_library( + name = "rewinding", + srcs = [ + "ActionRewindStrategy.java", + "ActionRewindingStats.java", + "ActionRewoundEvent.java", + ], + deps = [ + "//src/main/java/com/google/devtools/build/lib/actions", + "//src/main/java/com/google/devtools/build/lib/actions:action_lookup_data", + "//src/main/java/com/google/devtools/build/lib/actions:artifacts", + "//src/main/java/com/google/devtools/build/lib/bugreport", + "//src/main/java/com/google/devtools/build/lib/collect/nestedset", + "//src/main/java/com/google/devtools/build/lib/events", + "//src/main/java/com/google/devtools/build/lib/skyframe:action_utils", + "//src/main/java/com/google/devtools/build/lib/skyframe:artifact_function", + "//src/main/java/com/google/devtools/build/lib/skyframe:artifact_nested_set_key", + "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_aware_action", + "//src/main/java/com/google/devtools/build/lib/skyframe/proto:action_rewind_event_java_proto", + "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code", + "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", + "//src/main/protobuf:failure_details_java_proto", + "//third_party:auto_value", + "//third_party:flogger", + "//third_party:guava", + "//third_party:jsr305", + ], +)