diff options
Diffstat (limited to 'src/main')
52 files changed, 388 insertions, 331 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java index 968c7213da..00f918a17a 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java +++ b/src/main/java/com/google/devtools/build/lib/actions/AbstractAction.java @@ -395,7 +395,7 @@ public abstract class AbstractAction implements Action, SkylarkValue { } @Override - public boolean shouldReportPathPrefixConflict(Action action) { + public boolean shouldReportPathPrefixConflict(ActionAnalysisMetadata action) { return this != action; } diff --git a/src/main/java/com/google/devtools/build/lib/actions/Action.java b/src/main/java/com/google/devtools/build/lib/actions/Action.java index 51514af534..85d22ef304 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Action.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Action.java @@ -77,7 +77,7 @@ import javax.annotation.Nullable; * known set of fields is covered, not that all fields are covered), so carefully check all changes * to action subclasses. */ -public interface Action extends ActionMetadata, Describable { +public interface Action extends ActionExecutionMetadata, Describable { /** * Prepares for executing this action; called by the Builder prior to @@ -192,14 +192,6 @@ public interface Action extends ActionMetadata, Describable { @Nullable ResourceSet estimateResourceConsumption(Executor executor); /** - * @return true iff path prefix conflict (conflict where two actions generate - * two output artifacts with one of the artifact's path being the - * prefix for another) between this action and another action should - * be reported. - */ - boolean shouldReportPathPrefixConflict(Action action); - - /** * Returns true if the output should bypass output filtering. This is used for test actions. */ boolean showsOutputUnconditionally(); @@ -218,38 +210,4 @@ public interface Action extends ActionMetadata, Describable { * a different thread than the one this action is executed on. */ ExtraActionInfo.Builder getExtraActionInfo(); - - /** - * Returns the action type. Must not be {@code null}. - */ - MiddlemanType getActionType(); - - /** - * The action type. - */ - public enum MiddlemanType { - - /** A normal action. */ - NORMAL, - - /** A normal middleman, which just encapsulates a list of artifacts. */ - AGGREGATING_MIDDLEMAN, - - /** - * A middleman that enforces action ordering, is not validated by the dependency checker, but - * allows errors to be propagated. - */ - ERROR_PROPAGATING_MIDDLEMAN, - - /** - * A runfiles middleman, which is validated by the dependency checker, but is not expanded - * in blaze. Instead, the runfiles manifest is sent to remote execution client, which - * performs the expansion. - */ - RUNFILES_MIDDLEMAN; - - public boolean isMiddleman() { - return this != NORMAL; - } - } } diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionMetadata.java b/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java index 08b501c4c6..a3e73b38cf 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionMetadata.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionAnalysisMetadata.java @@ -16,26 +16,11 @@ package com.google.devtools.build.lib.actions; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; -import javax.annotation.Nullable; - /** - * Side-effect free query methods for information about an {@link Action}. - * - * <p>This method is intended for use in situations when the intention is to pass around information - * about an action without allowing actual execution of the action. - * - * <p>The split between {@link Action} and {@link ActionMetadata} is somewhat arbitrary, other than - * that all methods with side effects must belong to the former. + * An Analysis phase interface for an {@link Action} or Action-like object, containing only + * side-effect-free query methods for information needed during action analysis. */ -public interface ActionMetadata { - /** - * If this executable can supply verbose information, returns a string that can be used as a - * progress message while this executable is running. A return value of {@code null} indicates no - * message should be reported. - */ - @Nullable - String getProgressMessage(); - +public interface ActionAnalysisMetadata { /** * Returns the owner of this executable if this executable can supply verbose information. This is * typically the rule that constructed it; see ActionOwner class comment for details. Returns @@ -158,63 +143,40 @@ public interface ActionMetadata { Iterable<Artifact> getMandatoryInputs(); /** - * <p>Returns a string encoding all of the significant behaviour of this - * Action that might affect the output. The general contract of - * <code>getKey</code> is this: if the work to be performed by the - * execution of this action changes, the key must change. </p> - * - * <p>As a corollary, the build system is free to omit the execution of an - * Action <code>a1</code> if (a) at some time in the past, it has already - * executed an Action <code>a0</code> with the same key as - * <code>a1</code>, and (b) the names and contents of the input files listed - * by <code>a1.getInputs()</code> are identical to the names and contents of - * the files listed by <code>a0.getInputs()</code>. </p> - * - * <p>Examples of changes that should affect the key are: - * <ul> - * <li>Changes to the BUILD file that materially affect the rule which gave - * rise to this Action.</li> - * - * <li>Changes to the command-line options, environment, or other global - * configuration resources which affect the behaviour of this kind of Action - * (other than changes to the names of the input/output files, which are - * handled externally).</li> - * - * <li>An upgrade to the build tools which changes the program logic of this - * kind of Action (typically this is achieved by incorporating a UUID into - * the key, which is changed each time the program logic of this action - * changes).</li> - * - * </ul></p> + * @return true iff path prefix conflict (conflict where two actions generate + * two output artifacts with one of the artifact's path being the + * prefix for another) between this action and another action should + * be reported. */ - String getKey(); + boolean shouldReportPathPrefixConflict(ActionAnalysisMetadata action); - /** - * Returns a human-readable description of the inputs to {@link #getKey()}. - * Used in the output from '--explain', and in error messages for - * '--check_up_to_date' and '--check_tests_up_to_date'. - * May return null, meaning no extra information is available. - * - * <p>If the return value is non-null, for consistency it should be a multiline message of the - * form: - * <pre> - * <var>Summary</var> - * <var>Fieldname</var>: <var>value</var> - * <var>Fieldname</var>: <var>value</var> - * ... - * </pre> - * where each line after the first one is intended two spaces, and where any fields that might - * contain newlines or other funny characters are escaped using {@link - * com.google.devtools.build.lib.shell.ShellUtils#shellEscape}. - * For example: - * <pre> - * Compiling foo.cc - * Command: /usr/bin/gcc - * Argument: '-c' - * Argument: foo.cc - * Argument: '-o' - * Argument: foo.o - * </pre> - */ - @Nullable String describeKey(); + /** Returns the action type. Must not be {@code null}. */ + MiddlemanType getActionType(); + + /** The action type. */ + public enum MiddlemanType { + + /** A normal action. */ + NORMAL, + + /** A normal middleman, which just encapsulates a list of artifacts. */ + AGGREGATING_MIDDLEMAN, + + /** + * A middleman that enforces action ordering, is not validated by the dependency checker, but + * allows errors to be propagated. + */ + ERROR_PROPAGATING_MIDDLEMAN, + + /** + * A runfiles middleman, which is validated by the dependency checker, but is not expanded + * in blaze. Instead, the runfiles manifest is sent to remote execution client, which + * performs the expansion. + */ + RUNFILES_MIDDLEMAN; + + public boolean isMiddleman() { + return this != NORMAL; + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java index 4fd06a949f..4a977890a7 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.actions; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import com.google.devtools.build.lib.actions.Action.MiddlemanType; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType; import com.google.devtools.build.lib.actions.cache.ActionCache; import com.google.devtools.build.lib.actions.cache.ActionCache.Entry; import com.google.devtools.build.lib.actions.cache.Digest; diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionMetadata.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionMetadata.java new file mode 100644 index 0000000000..004a37a3f1 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionMetadata.java @@ -0,0 +1,94 @@ +// Copyright 2014 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// 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; + +import javax.annotation.Nullable; + +/** + * An interface for an {@link Action}, containing only side-effect-free query methods for + * information needed during both action analysis and execution. + * + * <p>The split between {@link Action} and {@link ActionExecutionMetadata} is somewhat arbitrary, + * other than that all methods with side effects must belong to the former. + */ +public interface ActionExecutionMetadata extends ActionAnalysisMetadata { + /** + * If this executable can supply verbose information, returns a string that can be used as a + * progress message while this executable is running. A return value of {@code null} indicates no + * message should be reported. + */ + @Nullable + String getProgressMessage(); + + /** + * <p>Returns a string encoding all of the significant behaviour of this + * Action that might affect the output. The general contract of + * <code>getKey</code> is this: if the work to be performed by the + * execution of this action changes, the key must change. </p> + * + * <p>As a corollary, the build system is free to omit the execution of an + * Action <code>a1</code> if (a) at some time in the past, it has already + * executed an Action <code>a0</code> with the same key as + * <code>a1</code>, and (b) the names and contents of the input files listed + * by <code>a1.getInputs()</code> are identical to the names and contents of + * the files listed by <code>a0.getInputs()</code>. </p> + * + * <p>Examples of changes that should affect the key are: + * <ul> + * <li>Changes to the BUILD file that materially affect the rule which gave + * rise to this Action.</li> + * + * <li>Changes to the command-line options, environment, or other global + * configuration resources which affect the behaviour of this kind of Action + * (other than changes to the names of the input/output files, which are + * handled externally).</li> + * + * <li>An upgrade to the build tools which changes the program logic of this + * kind of Action (typically this is achieved by incorporating a UUID into + * the key, which is changed each time the program logic of this action + * changes).</li> + * + * </ul></p> + */ + String getKey(); + + /** + * Returns a human-readable description of the inputs to {@link #getKey()}. + * Used in the output from '--explain', and in error messages for + * '--check_up_to_date' and '--check_tests_up_to_date'. + * May return null, meaning no extra information is available. + * + * <p>If the return value is non-null, for consistency it should be a multiline message of the + * form: + * <pre> + * <var>Summary</var> + * <var>Fieldname</var>: <var>value</var> + * <var>Fieldname</var>: <var>value</var> + * ... + * </pre> + * where each line after the first one is intended two spaces, and where any fields that might + * contain newlines or other funny characters are escaped using {@link + * com.google.devtools.build.lib.shell.ShellUtils#shellEscape}. + * For example: + * <pre> + * Compiling foo.cc + * Command: /usr/bin/gcc + * Argument: '-c' + * Argument: foo.cc + * Argument: '-o' + * Argument: foo.o + * </pre> + */ + @Nullable String describeKey(); +} diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java index 7a2a410d85..fd56653208 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionExecutionStatusReporter.java @@ -57,7 +57,7 @@ public final class ActionExecutionStatusReporter { * The status of each action "in flight", i.e. whose ExecuteBuildAction.call() method is active. * Used for implementing the "still waiting" message. */ - private final Map<ActionMetadata, Pair<String, Long>> actionStatus = + private final Map<ActionExecutionMetadata, Pair<String, Long>> actionStatus = new ConcurrentHashMap<>(100); public static ActionExecutionStatusReporter create(EventHandler eventHandler) { @@ -98,7 +98,7 @@ public final class ActionExecutionStatusReporter { } } - private void setStatus(ActionMetadata action, String message) { + private void setStatus(ActionExecutionMetadata action, String message) { actionStatus.put(action, Pair.of(message, clock.nanoTime())); } @@ -116,14 +116,14 @@ public final class ActionExecutionStatusReporter { updateStatus(ActionStatusMessage.preparingStrategy(action)); } - public void setRunningFromBuildData(ActionMetadata action) { + public void setRunningFromBuildData(ActionExecutionMetadata action) { updateStatus(ActionStatusMessage.runningStrategy(action, "unknown")); } @Subscribe public void updateStatus(ActionStatusMessage statusMsg) { String message = statusMsg.getMessage(); - ActionMetadata action = statusMsg.getActionMetadata(); + ActionExecutionMetadata action = statusMsg.getActionMetadata(); setStatus(action, message); } @@ -132,9 +132,10 @@ public final class ActionExecutionStatusReporter { } private static void appendGroupStatus(StringBuilder buffer, - Map<ActionMetadata, Pair<String, Long>> statusMap, String status, long currentTime) { - List<Pair<Long, ActionMetadata>> actions = new ArrayList<>(); - for (Map.Entry<ActionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) { + Map<ActionExecutionMetadata, Pair<String, Long>> statusMap, String status, + long currentTime) { + List<Pair<Long, ActionExecutionMetadata>> actions = new ArrayList<>(); + for (Map.Entry<ActionExecutionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) { if (entry.getValue().first.equals(status)) { actions.add(Pair.of(entry.getValue().second, entry.getKey())); } @@ -142,12 +143,12 @@ public final class ActionExecutionStatusReporter { if (actions.isEmpty()) { return; } - Collections.sort(actions, Pair.<Long, ActionMetadata>compareByFirst()); + Collections.sort(actions, Pair.<Long, ActionExecutionMetadata>compareByFirst()); buffer.append("\n " + status + ":"); boolean truncateList = actions.size() > MAX_LINES; - for (Pair<Long, ActionMetadata> entry : actions.subList(0, + for (Pair<Long, ActionExecutionMetadata> entry : actions.subList(0, truncateList ? MAX_LINES - 1 : actions.size())) { String message = entry.second.getProgressMessage(); if (message == null) { @@ -167,7 +168,8 @@ public final class ActionExecutionStatusReporter { /** * Get message showing currently executing actions. */ - private String getExecutionStatusMessage(Map<ActionMetadata, Pair<String, Long>> statusMap) { + private String getExecutionStatusMessage( + Map<ActionExecutionMetadata, Pair<String, Long>> statusMap) { int count = statusMap.size(); StringBuilder s = count != 1 ? new StringBuilder("Still waiting for ").append(count).append(" jobs to complete:") @@ -177,7 +179,7 @@ public final class ActionExecutionStatusReporter { // A tree is just as fast as HashSet for small data sets. Set<String> statuses = new TreeSet<>(); - for (Map.Entry<ActionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) { + for (Map.Entry<ActionExecutionMetadata, Pair<String, Long>> entry : statusMap.entrySet()) { statuses.add(entry.getValue().first); } @@ -192,7 +194,7 @@ public final class ActionExecutionStatusReporter { */ public void showCurrentlyExecutingActions(String progressPercentageMessage) { // Defensive copy to ensure thread safety. - Map<ActionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus); + Map<ActionExecutionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus); if (!statusMap.isEmpty()) { eventHandler.handle( Event.progress(progressPercentageMessage + getExecutionStatusMessage(statusMap))); @@ -205,13 +207,13 @@ public final class ActionExecutionStatusReporter { */ void warnAboutCurrentlyExecutingActions() { // Defensive copy to ensure thread safety. - Map<ActionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus); + Map<ActionExecutionMetadata, Pair<String, Long>> statusMap = new HashMap<>(actionStatus); if (statusMap.isEmpty()) { // There are no tasks in the queue so there is nothing to report. eventHandler.handle(Event.warn("There are no active jobs - stopping the build")); return; } - Iterator<ActionMetadata> iterator = statusMap.keySet().iterator(); + Iterator<ActionExecutionMetadata> iterator = statusMap.keySet().iterator(); while (iterator.hasNext()) { // Filter out actions that are not executed yet. if (statusMap.get(iterator.next()).first.equals(ActionStatusMessage.PREPARING)) { diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java b/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java index bd105c4fef..5b850d9022 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionGraph.java @@ -34,5 +34,5 @@ public interface ActionGraph { * are unknown. */ @Nullable - Action getGeneratingAction(Artifact artifact); + ActionAnalysisMetadata getGeneratingAction(Artifact artifact); } diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java b/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java index 7e13e5d2a8..6d335a8f7e 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionGraphVisitor.java @@ -17,7 +17,8 @@ package com.google.devtools.build.lib.actions; * An abstract visitor for the action graph. Specializes {@link BipartiteVisitor} for artifacts and * actions, and takes care of visiting the complete transitive closure. */ -public abstract class ActionGraphVisitor extends BipartiteVisitor<Action, Artifact> { +public abstract class ActionGraphVisitor extends + BipartiteVisitor<ActionAnalysisMetadata, Artifact> { private final ActionGraph actionGraph; @@ -37,7 +38,7 @@ public abstract class ActionGraphVisitor extends BipartiteVisitor<Action, Artifa * * @param action */ - protected void visitAction(Action action) {} + protected void visitAction(ActionAnalysisMetadata action) {} /** * Whether the given action should be visited. If this returns false, the visitation stops here, @@ -45,7 +46,7 @@ public abstract class ActionGraphVisitor extends BipartiteVisitor<Action, Artifa * * @param action */ - protected boolean shouldVisit(Action action) { + protected boolean shouldVisit(ActionAnalysisMetadata action) { return true; } @@ -67,14 +68,14 @@ public abstract class ActionGraphVisitor extends BipartiteVisitor<Action, Artifa } @Override protected void white(Artifact artifact) { - Action action = actionGraph.getGeneratingAction(artifact); + ActionAnalysisMetadata action = actionGraph.getGeneratingAction(artifact); visitArtifact(artifact); if (action != null && shouldVisit(action)) { visitBlackNode(action); } } - @Override protected void black(Action action) { + @Override protected void black(ActionAnalysisMetadata action) { visitAction(action); for (Artifact input : action.getInputs()) { if (shouldVisit(input)) { diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java index a4a85d2677..26bbb6d1af 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInputHelper.java @@ -49,7 +49,7 @@ public final class ActionInputHelper { // going away anyway. Preconditions.checkArgument(mm.isMiddlemanArtifact(), "%s is not a middleman artifact", mm); - Action middlemanAction = actionGraph.getGeneratingAction(mm); + ActionAnalysisMetadata middlemanAction = actionGraph.getGeneratingAction(mm); Preconditions.checkState(middlemanAction != null, mm); // TODO(bazel-team): Consider expanding recursively or throwing an exception here. // Most likely, this code will cause silent errors if we ever have a middleman that diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java b/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java index 8755879758..de85ce9f80 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionRegistry.java @@ -23,7 +23,7 @@ public interface ActionRegistry { /** * This method notifies the registry new actions. */ - void registerAction(Action... actions); + void registerAction(ActionAnalysisMetadata... actions); /** * Get the (Label and BuildConfiguration) of the ConfiguredTarget ultimately responsible for all @@ -37,7 +37,7 @@ public interface ActionRegistry { @VisibleForTesting public static final ActionRegistry NOP = new ActionRegistry() { @Override - public void registerAction(Action... actions) {} + public void registerAction(ActionAnalysisMetadata... actions) {} @Override public ArtifactOwner getOwner() { diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java b/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java index 144e862297..f0ef8d859f 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionStatusMessage.java @@ -20,16 +20,16 @@ package com.google.devtools.build.lib.actions; * used to notify any interested parties. */ public class ActionStatusMessage { - private final ActionMetadata action; + private final ActionExecutionMetadata action; private final String message; public static final String PREPARING = "Preparing"; - private ActionStatusMessage(ActionMetadata action, String message) { + private ActionStatusMessage(ActionExecutionMetadata action, String message) { this.action = action; this.message = message; } - public ActionMetadata getActionMetadata() { + public ActionExecutionMetadata getActionMetadata() { return action; } @@ -38,22 +38,23 @@ public class ActionStatusMessage { } /** Creates "Analyzing" status message. */ - public static ActionStatusMessage analysisStrategy(ActionMetadata action) { + public static ActionStatusMessage analysisStrategy(ActionExecutionMetadata action) { return new ActionStatusMessage(action, "Analyzing"); } /** Creates "Preparing" status message. */ - public static ActionStatusMessage preparingStrategy(ActionMetadata action) { + public static ActionStatusMessage preparingStrategy(ActionExecutionMetadata action) { return new ActionStatusMessage(action, PREPARING); } /** Creates "Scheduling" status message. */ - public static ActionStatusMessage schedulingStrategy(ActionMetadata action) { + public static ActionStatusMessage schedulingStrategy(ActionExecutionMetadata action) { return new ActionStatusMessage(action, "Scheduling"); } /** Creates "Running (strategy)" status message. */ - public static ActionStatusMessage runningStrategy(ActionMetadata action, String strategy) { + public static ActionStatusMessage runningStrategy( + ActionExecutionMetadata action, String strategy) { return new ActionStatusMessage(action, String.format("Running (%s)", strategy)); } } diff --git a/src/main/java/com/google/devtools/build/lib/actions/Actions.java b/src/main/java/com/google/devtools/build/lib/actions/Actions.java index 3878fcd148..9d74e3b30d 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Actions.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Actions.java @@ -51,19 +51,27 @@ public final class Actions { * <p>This method implements an equivalence relationship across actions, based on the action * class, the key, and the list of inputs and outputs. */ - public static boolean canBeShared(Action a, Action b) { + public static boolean canBeShared(ActionAnalysisMetadata a, ActionAnalysisMetadata b) { if (!a.getMnemonic().equals(b.getMnemonic())) { return false; } - if (!a.getKey().equals(b.getKey())) { + + // Non-Actions cannot be shared. + if (!(a instanceof Action) || !(b instanceof Action)) { + return false; + } + + Action actionA = (Action) a; + Action actionB = (Action) b; + if (!actionA.getKey().equals(actionB.getKey())) { return false; } // Don't bother to check input and output counts first; the expected result for these tests is // to always be true (i.e., that this method returns true). - if (!Iterables.elementsEqual(a.getMandatoryInputs(), b.getMandatoryInputs())) { + if (!Iterables.elementsEqual(actionA.getMandatoryInputs(), actionB.getMandatoryInputs())) { return false; } - if (!Iterables.elementsEqual(a.getOutputs(), b.getOutputs())) { + if (!Iterables.elementsEqual(actionA.getOutputs(), actionB.getOutputs())) { return false; } return true; @@ -80,18 +88,19 @@ public final class Actions { * @throws ActionConflictException iff there are two unshareable actions generating the same * output */ - public static Map<Artifact, Action> filterSharedActionsAndThrowActionConflict( - Iterable<Action> actions) throws ActionConflictException { + public static Map<Artifact, ActionAnalysisMetadata> filterSharedActionsAndThrowActionConflict( + Iterable<? extends ActionAnalysisMetadata> actions) throws ActionConflictException { return Actions.maybeFilterSharedActionsAndThrowIfConflict( actions, /*allowSharedAction=*/ true); } - private static Map<Artifact, Action> maybeFilterSharedActionsAndThrowIfConflict( - Iterable<Action> actions, boolean allowSharedAction) throws ActionConflictException { - Map<Artifact, Action> generatingActions = new HashMap<>(); - for (Action action : actions) { + private static Map<Artifact, ActionAnalysisMetadata> maybeFilterSharedActionsAndThrowIfConflict( + Iterable<? extends ActionAnalysisMetadata> actions, boolean allowSharedAction) + throws ActionConflictException { + Map<Artifact, ActionAnalysisMetadata> generatingActions = new HashMap<>(); + for (ActionAnalysisMetadata action : actions) { for (Artifact artifact : action.getOutputs()) { - Action previousAction = generatingActions.put(artifact, action); + ActionAnalysisMetadata previousAction = generatingActions.put(artifact, action); if (previousAction != null && previousAction != action) { if (!allowSharedAction || !Actions.canBeShared(previousAction, action)) { throw new ActionConflictException(artifact, previousAction, action); @@ -112,16 +121,17 @@ public final class Actions { * @return A map between actions that generated the conflicting artifacts and their associated * {@link ArtifactPrefixConflictException}. */ - public static Map<Action, ArtifactPrefixConflictException> findArtifactPrefixConflicts( - ActionGraph actionGraph, SortedMap<PathFragment, Artifact> artifactPathMap) { + public static Map<ActionAnalysisMetadata, ArtifactPrefixConflictException> + findArtifactPrefixConflicts(ActionGraph actionGraph, + SortedMap<PathFragment, Artifact> artifactPathMap) { // No actions in graph -- currently happens only in tests. Special-cased because .next() call // below is unconditional. if (artifactPathMap.isEmpty()) { - return ImmutableMap.<Action, ArtifactPrefixConflictException>of(); + return ImmutableMap.<ActionAnalysisMetadata, ArtifactPrefixConflictException>of(); } // Keep deterministic ordering of bad actions. - Map<Action, ArtifactPrefixConflictException> badActions = new LinkedHashMap(); + Map<ActionAnalysisMetadata, ArtifactPrefixConflictException> badActions = new LinkedHashMap(); Iterator<PathFragment> iter = artifactPathMap.keySet().iterator(); // Report an error for every derived artifact which is a prefix of another. @@ -140,9 +150,9 @@ public final class Actions { if (pathJ.startsWith(pathI)) { // prefix conflict. Artifact artifactI = Preconditions.checkNotNull(artifactPathMap.get(pathI), pathI); Artifact artifactJ = Preconditions.checkNotNull(artifactPathMap.get(pathJ), pathJ); - Action actionI = + ActionAnalysisMetadata actionI = Preconditions.checkNotNull(actionGraph.getGeneratingAction(artifactI), artifactI); - Action actionJ = + ActionAnalysisMetadata actionJ = Preconditions.checkNotNull(actionGraph.getGeneratingAction(artifactJ), artifactJ); if (actionI.shouldReportPathPrefixConflict(actionJ)) { ArtifactPrefixConflictException exception = new ArtifactPrefixConflictException(pathI, diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java index f28683b451..95faf512bd 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java @@ -22,7 +22,7 @@ import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; -import com.google.devtools.build.lib.actions.Action.MiddlemanType; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.shell.ShellUtils; diff --git a/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java b/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java index 8e34389185..2e3a69de29 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java +++ b/src/main/java/com/google/devtools/build/lib/actions/BaseSpawn.java @@ -44,7 +44,7 @@ public class BaseSpawn implements Spawn { private final ImmutableMap<PathFragment, Artifact> runfilesManifests; private final ImmutableSet<PathFragment> optionalOutputFiles; private final RunfilesSupplier runfilesSupplier; - private final ActionMetadata action; + private final ActionExecutionMetadata action; private final ResourceSet localResources; // TODO(bazel-team): When we migrate ActionSpawn to use this constructor decide on and enforce @@ -57,7 +57,7 @@ public class BaseSpawn implements Spawn { Map<String, String> executionInfo, Map<PathFragment, Artifact> runfilesManifests, RunfilesSupplier runfilesSupplier, - ActionMetadata action, + ActionExecutionMetadata action, ResourceSet localResources, Collection<PathFragment> optionalOutputFiles) { this.arguments = ImmutableList.copyOf(arguments); @@ -78,7 +78,7 @@ public class BaseSpawn implements Spawn { Map<String, String> environment, Map<String, String> executionInfo, RunfilesSupplier runfilesSupplier, - ActionMetadata action, + ActionExecutionMetadata action, ResourceSet localResources) { this( arguments, @@ -99,7 +99,7 @@ public class BaseSpawn implements Spawn { Map<String, String> environment, Map<String, String> executionInfo, Map<PathFragment, Artifact> runfilesManifests, - ActionMetadata action, + ActionExecutionMetadata action, ResourceSet localResources) { this( arguments, @@ -118,7 +118,7 @@ public class BaseSpawn implements Spawn { public BaseSpawn(List<String> arguments, Map<String, String> environment, Map<String, String> executionInfo, - ActionMetadata action, + ActionExecutionMetadata action, ResourceSet localResources) { this( arguments, @@ -134,7 +134,7 @@ public class BaseSpawn implements Spawn { Map<String, String> environment, Map<String, String> executionInfo, RunfilesSupplier runfilesSupplier, - ActionMetadata action, + ActionExecutionMetadata action, ResourceSet localResources, Collection<PathFragment> optionalOutputFiles) { this( @@ -258,7 +258,7 @@ public class BaseSpawn implements Spawn { } @Override - public ActionMetadata getResourceOwner() { + public ActionExecutionMetadata getResourceOwner() { return action; } @@ -291,7 +291,8 @@ public class BaseSpawn implements Spawn { * A local spawn requiring zero resources. */ public static class Local extends BaseSpawn { - public Local(List<String> arguments, Map<String, String> environment, ActionMetadata action) { + public Local(List<String> arguments, Map<String, String> environment, + ActionExecutionMetadata action) { super(arguments, environment, ImmutableMap.<String, String>of("local", ""), action, ResourceSet.ZERO); } diff --git a/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java b/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java index acb9cd64d4..d72a686679 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java +++ b/src/main/java/com/google/devtools/build/lib/actions/DelegateSpawn.java @@ -100,7 +100,7 @@ public class DelegateSpawn implements Spawn { } @Override - public ActionMetadata getResourceOwner() { + public ActionExecutionMetadata getResourceOwner() { return spawn.getResourceOwner(); } diff --git a/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java b/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java index 2535a2e7ef..54d3411419 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java +++ b/src/main/java/com/google/devtools/build/lib/actions/MapBasedActionGraph.java @@ -24,19 +24,19 @@ import javax.annotation.concurrent.ThreadSafe; */ @ThreadSafe public final class MapBasedActionGraph implements MutableActionGraph { - private final ConcurrentMultimapWithHeadElement<Artifact, Action> generatingActionMap = - new ConcurrentMultimapWithHeadElement<>(); + private final ConcurrentMultimapWithHeadElement<Artifact, ActionAnalysisMetadata> + generatingActionMap = new ConcurrentMultimapWithHeadElement<>(); @Override @Nullable - public Action getGeneratingAction(Artifact artifact) { + public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) { return generatingActionMap.get(artifact); } @Override - public void registerAction(Action action) throws ActionConflictException { + public void registerAction(ActionAnalysisMetadata action) throws ActionConflictException { for (Artifact artifact : action.getOutputs()) { - Action previousAction = generatingActionMap.putAndGet(artifact, action); + ActionAnalysisMetadata previousAction = generatingActionMap.putAndGet(artifact, action); if (previousAction != null && previousAction != action && !Actions.canBeShared(action, previousAction)) { generatingActionMap.remove(artifact, action); @@ -46,10 +46,10 @@ public final class MapBasedActionGraph implements MutableActionGraph { } @Override - public void unregisterAction(Action action) { + public void unregisterAction(ActionAnalysisMetadata action) { for (Artifact artifact : action.getOutputs()) { generatingActionMap.remove(artifact, action); - Action otherAction = generatingActionMap.get(artifact); + ActionAnalysisMetadata otherAction = generatingActionMap.get(artifact); Preconditions.checkState(otherAction == null || (otherAction != action && Actions.canBeShared(action, otherAction)), "%s %s", action, otherAction); diff --git a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java index 24c436c190..404b0de10d 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java +++ b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanFactory.java @@ -14,7 +14,7 @@ package com.google.devtools.build.lib.actions; import com.google.common.collect.Iterables; -import com.google.devtools.build.lib.actions.Action.MiddlemanType; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.util.Pair; diff --git a/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java b/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java index d5da897c43..50b3fa7886 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java +++ b/src/main/java/com/google/devtools/build/lib/actions/MutableActionGraph.java @@ -42,7 +42,7 @@ public interface MutableActionGraph extends ActionGraph { * then both conflicts are detected; if either A or C is registered first, then only one conflict * is detected. */ - void registerAction(Action action) throws ActionConflictException; + void registerAction(ActionAnalysisMetadata action) throws ActionConflictException; /** * Removes an action from this action graph if it is present. @@ -50,7 +50,7 @@ public interface MutableActionGraph extends ActionGraph { * <p>Throws {@link IllegalStateException} if one of the outputs of the action is in fact * generated by a different {@link Action} instance (even if they are sharable). */ - void unregisterAction(Action action); + void unregisterAction(ActionAnalysisMetadata action); /** * Clear the action graph. @@ -65,13 +65,13 @@ public interface MutableActionGraph extends ActionGraph { public static final class ActionConflictException extends Exception { private final Artifact artifact; - private final Action previousAction; - private final Action attemptedAction; + private final ActionAnalysisMetadata previousAction; + private final ActionAnalysisMetadata attemptedAction; private static final int MAX_DIFF_ARTIFACTS_TO_REPORT = 5; - public ActionConflictException(Artifact artifact, Action previousAction, - Action attemptedAction) { + public ActionConflictException(Artifact artifact, ActionAnalysisMetadata previousAction, + ActionAnalysisMetadata attemptedAction) { super( String.format( "for %s, previous action: %s, attempted action: %s", @@ -145,7 +145,7 @@ public interface MutableActionGraph extends ActionGraph { } // See also Actions.canBeShared() - private String suffix(Action a, Action b) { + private String suffix(ActionAnalysisMetadata a, ActionAnalysisMetadata b) { // Note: the error message reveals to users the names of intermediate files that are not // documented in the BUILD language. This error-reporting logic is rather elaborate but it // does help to diagnose some tricky situations. @@ -162,7 +162,15 @@ public interface MutableActionGraph extends ActionGraph { addStringDetail(sb, "Configuration", aNull ? null : aOwner.getConfigurationChecksum(), bNull ? null : bOwner.getConfigurationChecksum()); addStringDetail(sb, "Mnemonic", a.getMnemonic(), b.getMnemonic()); - addStringDetail(sb, "Progress message", a.getProgressMessage(), b.getProgressMessage()); + + if ((a instanceof ActionExecutionMetadata) && (b instanceof ActionExecutionMetadata)) { + addStringDetail( + sb, + "Progress message", + ((ActionExecutionMetadata) a).getProgressMessage(), + ((ActionExecutionMetadata) b).getProgressMessage()); + } + addStringDetail( sb, "PrimaryInput", diff --git a/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java b/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java index c263b2d05f..3ebaee0036 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ResourceManager.java @@ -61,16 +61,16 @@ import java.util.concurrent.CountDownLatch; public class ResourceManager { /** - * A handle returned by {@link #acquireResources(ActionMetadata, ResourceSet)} that must be closed - * in order to free the resources again. + * A handle returned by {@link #acquireResources(ActionExecutionMetadata, ResourceSet)} that must + * be closed in order to free the resources again. */ public static class ResourceHandle implements AutoCloseable { final ResourceManager rm; - final ActionMetadata actionMetadata; + final ActionExecutionMetadata actionMetadata; final ResourceSet resourceSet; - public ResourceHandle( - ResourceManager rm, ActionMetadata actionMetadata, ResourceSet resources) { + public ResourceHandle(ResourceManager rm, ActionExecutionMetadata actionMetadata, + ResourceSet resources) { this.rm = rm; this.actionMetadata = actionMetadata; this.resourceSet = resources; @@ -200,7 +200,7 @@ public class ResourceManager { * Acquires requested resource set. Will block if resource is not available. * NB! This method must be thread-safe! */ - public ResourceHandle acquireResources(ActionMetadata owner, ResourceSet resources) + public ResourceHandle acquireResources(ActionExecutionMetadata owner, ResourceSet resources) throws InterruptedException { Preconditions.checkNotNull(resources); AutoProfiler p = profiled(owner, ProfilerTask.ACTION_LOCK); @@ -228,7 +228,7 @@ public class ResourceManager { * Acquires the given resources if available immediately. Does not block. * @return true iff the given resources were locked (all or nothing). */ - public boolean tryAcquire(ActionMetadata owner, ResourceSet resources) { + public boolean tryAcquire(ActionExecutionMetadata owner, ResourceSet resources) { boolean acquired = false; synchronized (this) { if (areResourcesAvailable(resources)) { @@ -279,14 +279,14 @@ public class ResourceManager { this.eventBus = null; } - private void waiting(ActionMetadata owner) { + private void waiting(ActionExecutionMetadata owner) { if (eventBus != null) { // Null only in tests. eventBus.post(ActionStatusMessage.schedulingStrategy(owner)); } } - private void acquired(ActionMetadata owner) { + private void acquired(ActionExecutionMetadata owner) { if (eventBus != null) { // Null only in tests. eventBus.post(ActionStatusMessage.runningStrategy(owner, "unknown")); @@ -298,7 +298,7 @@ public class ResourceManager { * * <p>NB! This method must be thread-safe! */ - public void releaseResources(ActionMetadata owner, ResourceSet resources) { + public void releaseResources(ActionExecutionMetadata owner, ResourceSet resources) { boolean isConflict = false; AutoProfiler p = profiled(owner, ProfilerTask.ACTION_RELEASE); try { diff --git a/src/main/java/com/google/devtools/build/lib/actions/Spawn.java b/src/main/java/com/google/devtools/build/lib/actions/Spawn.java index b4ed5c79fa..3e24fdca19 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Spawn.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Spawn.java @@ -129,7 +129,7 @@ public interface Spawn { /** * Returns the resource owner for local fallback. */ - ActionMetadata getResourceOwner(); + ActionExecutionMetadata getResourceOwner(); /** * Returns the amount of resources needed for local fallback. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java index cf1b16b8d7..dd96b3a6de 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisEnvironment.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.analysis; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionRegistry; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.MiddlemanFactory; @@ -105,13 +106,13 @@ public interface AnalysisEnvironment extends ActionRegistry { * If the artifact was created in another analysis environment (e.g. by a different configured * target instance) or the artifact is a source artifact, it returns null. */ - Action getLocalGeneratingAction(Artifact artifact); + ActionAnalysisMetadata getLocalGeneratingAction(Artifact artifact); /** * Returns the actions that were registered so far with this analysis environment, that is, all * the actions that were created by the current target being analyzed. */ - Iterable<Action> getRegisteredActions(); + Iterable<ActionAnalysisMetadata> getRegisteredActions(); /** * Returns the Skyframe SkyFunction.Environment if available. Otherwise, null. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java index fb30f6099f..1251fe1ceb 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java @@ -27,7 +27,7 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionGraph; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactFactory; @@ -552,7 +552,7 @@ public class BuildView { getArtifactFactory(), CoverageReportValue.ARTIFACT_OWNER); if (actionsWrapper != null) { - ImmutableList <Action> actions = actionsWrapper.getActions(); + ImmutableList<ActionAnalysisMetadata> actions = actionsWrapper.getActions(); skyframeExecutor.injectCoverageReportData(actions); artifactsToBuild.addAll(actionsWrapper.getCoverageOutputs()); } @@ -571,7 +571,7 @@ public class BuildView { final ActionGraph actionGraph = new ActionGraph() { @Nullable @Override - public Action getGeneratingAction(Artifact artifact) { + public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) { ArtifactOwner artifactOwner = artifact.getArtifactOwner(); if (artifactOwner instanceof ActionLookupValue.ActionLookupKey) { SkyKey key = ActionLookupValue.key((ActionLookupValue.ActionLookupKey) artifactOwner); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java index 4d1d787095..2f8762d025 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/CachingAnalysisEnvironment.java @@ -17,7 +17,7 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactFactory; import com.google.devtools.build.lib.actions.ArtifactOwner; @@ -90,7 +90,7 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { * The list of actions registered by the configured target this analysis environment is * responsible for. May get cleared out at the end of the analysis of said target. */ - final List<Action> actions = new ArrayList<>(); + final List<ActionAnalysisMetadata> actions = new ArrayList<>(); public CachingAnalysisEnvironment(ArtifactFactory artifactFactory, ArtifactOwner owner, boolean isSystemEnv, boolean extendedSanityChecks, @@ -119,7 +119,7 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { skyframeEnv = null; } - private static StringBuilder shortDescription(Action action) { + private static StringBuilder shortDescription(ActionAnalysisMetadata action) { if (action == null) { return new StringBuilder("null Action"); } @@ -138,7 +138,7 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { List<String> checkedActions = null; if (!orphanArtifacts.isEmpty()) { checkedActions = Lists.newArrayListWithCapacity(actions.size()); - for (Action action : actions) { + for (ActionAnalysisMetadata action : actions) { StringBuilder sb = shortDescription(action); for (Artifact o : action.getOutputs()) { sb.append("\n "); @@ -166,7 +166,7 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { private Map<Artifact, String> getOrphanArtifactMap() { // Construct this set to avoid poor performance under large --runs_per_test. Set<Artifact> artifactsWithActions = new HashSet<>(); - for (Action action : actions) { + for (ActionAnalysisMetadata action : actions) { // Don't bother checking that every Artifact only appears once; that test is performed // elsewhere (see #testNonUniqueOutputs in ActionListenerIntegrationTest). artifactsWithActions.addAll(action.getOutputs()); @@ -258,7 +258,7 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { } @Override - public void registerAction(Action... actions) { + public void registerAction(ActionAnalysisMetadata... actions) { Preconditions.checkState(enabled); if (allowRegisteringActions) { Collections.addAll(this.actions, actions); @@ -266,9 +266,9 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { } @Override - public Action getLocalGeneratingAction(Artifact artifact) { + public ActionAnalysisMetadata getLocalGeneratingAction(Artifact artifact) { Preconditions.checkState(allowRegisteringActions); - for (Action action : actions) { + for (ActionAnalysisMetadata action : actions) { if (action.getOutputs().contains(artifact)) { return action; } @@ -277,7 +277,7 @@ public class CachingAnalysisEnvironment implements AnalysisEnvironment { } @Override - public Collection<Action> getRegisteredActions() { + public Collection<ActionAnalysisMetadata> getRegisteredActions() { return Collections.unmodifiableCollection(actions); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java index 645cd6d889..7f3db2a01e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java @@ -20,7 +20,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.UnmodifiableIterator; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -174,7 +174,8 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider> addProvider( ExtraActionArtifactsProvider.class, createExtraActionProvider( - ImmutableSet.<Action>of() /* actionsWithoutExtraAction */, ruleContext)); + ImmutableSet.<ActionAnalysisMetadata>of() /* actionsWithoutExtraAction */, + ruleContext)); return new ConfiguredAspect(name, ImmutableMap.copyOf(providers)); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java index 829e637956..782eaa2ef1 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.analysis; import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.Multimap; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ExtraActionArtifactsProvider.ExtraArtifactSet; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; @@ -44,7 +44,7 @@ class ExtraActionUtils { * bookkeeping. */ static ExtraActionArtifactsProvider createExtraActionProvider( - Set<Action> actionsWithoutExtraAction, RuleContext ruleContext) { + Set<ActionAnalysisMetadata> actionsWithoutExtraAction, RuleContext ruleContext) { BuildConfiguration configuration = ruleContext.getConfiguration(); if (configuration.isHostConfiguration()) { return ExtraActionArtifactsProvider.EMPTY; @@ -61,7 +61,7 @@ class ExtraActionUtils { // The action list is modified within the body of the loop by the maybeAddExtraAction() call, // thus the copy - for (Action action : + for (ActionAnalysisMetadata action : ImmutableList.copyOf(ruleContext.getAnalysisEnvironment().getRegisteredActions())) { if (!actionsWithoutExtraAction.contains(action)) { visitor.maybeAddExtraAction(action); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java index 3b4069ede4..db1017390d 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionsVisitor.java @@ -17,8 +17,8 @@ package com.google.devtools.build.lib.analysis; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; -import com.google.common.collect.Sets; import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionGraph; import com.google.devtools.build.lib.actions.ActionGraphVisitor; import com.google.devtools.build.lib.actions.Artifact; @@ -26,7 +26,6 @@ import com.google.devtools.build.lib.rules.extra.ExtraActionSpec; import java.util.Collection; import java.util.List; -import java.util.Set; import javax.annotation.Nullable; @@ -37,7 +36,6 @@ final class ExtraActionsVisitor extends ActionGraphVisitor { private final RuleContext ruleContext; private final Multimap<String, ExtraActionSpec> mnemonicToExtraActionMap; private final List<Artifact> extraArtifacts; - public final Set<Action> actions = Sets.newHashSet(); /** Creates a new visitor for the extra actions associated with the given target. */ public ExtraActionsVisitor(RuleContext ruleContext, @@ -48,21 +46,23 @@ final class ExtraActionsVisitor extends ActionGraphVisitor { extraArtifacts = Lists.newArrayList(); } - void maybeAddExtraAction(Action original) { - if (original.extraActionCanAttach()) { - Collection<ExtraActionSpec> extraActions = - mnemonicToExtraActionMap.get(original.getMnemonic()); - if (extraActions != null) { - for (ExtraActionSpec extraAction : extraActions) { - extraArtifacts.addAll(extraAction.addExtraAction(ruleContext, original)); + void maybeAddExtraAction(ActionAnalysisMetadata original) { + if (original instanceof Action) { + Action action = (Action) original; + if (action.extraActionCanAttach()) { + Collection<ExtraActionSpec> extraActions = + mnemonicToExtraActionMap.get(action.getMnemonic()); + if (extraActions != null) { + for (ExtraActionSpec extraAction : extraActions) { + extraArtifacts.addAll(extraAction.addExtraAction(ruleContext, action)); + } } } } } @Override - protected void visitAction(Action action) { - actions.add(action); + protected void visitAction(ActionAnalysisMetadata action) { maybeAddExtraAction(action); } @@ -78,7 +78,7 @@ final class ExtraActionsVisitor extends ActionGraphVisitor { return new ActionGraph() { @Override @Nullable - public Action getGeneratingAction(Artifact artifact) { + public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) { return ruleContext.getAnalysisEnvironment().getLocalGeneratingAction(artifact); } }; diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java b/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java index 287809265f..abe62c1474 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/PrintActionVisitor.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.analysis; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionGraph; import com.google.devtools.build.lib.actions.ActionGraphVisitor; import com.google.devtools.build.lib.actions.ActionOwner; @@ -28,8 +28,8 @@ import java.util.List; */ public final class PrintActionVisitor extends ActionGraphVisitor { private final ConfiguredTarget target; - private final List<Action> actions; - private final Predicate<Action> actionMnemonicMatcher; + private final List<ActionAnalysisMetadata> actions; + private final Predicate<ActionAnalysisMetadata> actionMnemonicMatcher; private final String targetConfigurationChecksum; /** @@ -37,7 +37,7 @@ public final class PrintActionVisitor extends ActionGraphVisitor { * mnemonic. */ public PrintActionVisitor(ActionGraph actionGraph, ConfiguredTarget target, - Predicate<Action> actionMnemonicMatcher) { + Predicate<ActionAnalysisMetadata> actionMnemonicMatcher) { super(actionGraph); this.target = target; this.actionMnemonicMatcher = actionMnemonicMatcher; @@ -46,21 +46,21 @@ public final class PrintActionVisitor extends ActionGraphVisitor { } @Override - protected boolean shouldVisit(Action action) { + protected boolean shouldVisit(ActionAnalysisMetadata action) { ActionOwner owner = action.getOwner(); return owner != null && target.getLabel().equals(owner.getLabel()) && targetConfigurationChecksum.equals(owner.getConfigurationChecksum()); } @Override - protected void visitAction(Action action) { + protected void visitAction(ActionAnalysisMetadata action) { if (actionMnemonicMatcher.apply(action)) { actions.add(action); } } /** Retrieves the collected actions since this method was last called and clears the list. */ - public ImmutableList<Action> getActions() { + public ImmutableList<ActionAnalysisMetadata> getActions() { return ImmutableList.copyOf(actions); } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java index 07b0d863c9..853fdf7caf 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java @@ -18,7 +18,7 @@ import static com.google.devtools.build.lib.analysis.ExtraActionUtils.createExtr import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.LicensesProvider.TargetLicense; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -62,7 +62,7 @@ public final class RuleConfiguredTargetBuilder { private NestedSet<Artifact> filesToBuild = NestedSetBuilder.emptySet(Order.STABLE_ORDER); private RunfilesSupport runfilesSupport; private Artifact executable; - private ImmutableSet<Action> actionsWithoutExtraAction = ImmutableSet.of(); + private ImmutableSet<ActionAnalysisMetadata> actionsWithoutExtraAction = ImmutableSet.of(); public RuleConfiguredTargetBuilder(RuleContext ruleContext) { this.ruleContext = ruleContext; @@ -341,7 +341,8 @@ public final class RuleConfiguredTargetBuilder { /** * Set the extra action pseudo actions. */ - public RuleConfiguredTargetBuilder setActionsWithoutExtraAction(ImmutableSet<Action> actions) { + public RuleConfiguredTargetBuilder setActionsWithoutExtraAction( + ImmutableSet<ActionAnalysisMetadata> actions) { this.actionsWithoutExtraAction = actions; return this; } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java index fef9393d12..cc3118be95 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java @@ -29,6 +29,7 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Multimaps; import com.google.common.collect.Sets; import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.ActionRegistry; import com.google.devtools.build.lib.actions.Artifact; @@ -379,7 +380,7 @@ public final class RuleContext extends TargetContext } @Override - public void registerAction(Action... action) { + public void registerAction(ActionAnalysisMetadata... action) { getAnalysisEnvironment().registerAction(action); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java index 39b1d96f94..18a147e4bf 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/buildinfo/BuildInfoCollection.java @@ -14,7 +14,7 @@ package com.google.devtools.build.lib.analysis.buildinfo; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import java.util.List; @@ -23,19 +23,19 @@ import java.util.List; * A collection of build-info files for both stamped and unstamped modes. */ public final class BuildInfoCollection { - private final ImmutableList<Action> actions; + private final ImmutableList<ActionAnalysisMetadata> actions; private final ImmutableList<Artifact> stampedBuildInfo; private final ImmutableList<Artifact> redactedBuildInfo; - public BuildInfoCollection(List<? extends Action> actions, List<Artifact> stampedBuildInfo, - List<Artifact> redactedBuildInfo) { + public BuildInfoCollection(List<? extends ActionAnalysisMetadata> actions, + List<Artifact> stampedBuildInfo, List<Artifact> redactedBuildInfo) { // Do not remove <Action>: workaround for Java 7 type inference. - this.actions = ImmutableList.<Action>copyOf(actions); + this.actions = ImmutableList.<ActionAnalysisMetadata>copyOf(actions); this.stampedBuildInfo = ImmutableList.copyOf(stampedBuildInfo); this.redactedBuildInfo = ImmutableList.copyOf(redactedBuildInfo); } - public ImmutableList<Action> getActions() { + public ImmutableList<ActionAnalysisMetadata> getActions() { return actions; } diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java index f688fd2191..75ba75ebd5 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnStrategy.java @@ -19,10 +19,10 @@ import com.google.common.hash.Hasher; import com.google.common.hash.Hashing; import com.google.common.util.concurrent.ListenableFuture; import com.google.devtools.build.lib.actions.ActionExecutionContext; +import com.google.devtools.build.lib.actions.ActionExecutionMetadata; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputFileCache; import com.google.devtools.build.lib.actions.ActionInputHelper; -import com.google.devtools.build.lib.actions.ActionMetadata; import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.actions.ExecutionStrategy; import com.google.devtools.build.lib.actions.Executor; @@ -84,7 +84,7 @@ final class RemoteSpawnStrategy implements SpawnActionContext { } Executor executor = actionExecutionContext.getExecutor(); - ActionMetadata actionMetadata = spawn.getResourceOwner(); + ActionExecutionMetadata actionMetadata = spawn.getResourceOwner(); ActionInputFileCache inputFileCache = actionExecutionContext.getActionInputFileCache(); EventHandler eventHandler = executor.getEventHandler(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java index e1c13485cf..9c9b19cc12 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java @@ -19,7 +19,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.AnalysisEnvironment; import com.google.devtools.build.lib.analysis.FileProvider; @@ -72,7 +72,7 @@ public final class CcCommon { public void collectMetadataArtifacts(Iterable<Artifact> objectFiles, AnalysisEnvironment analysisEnvironment, NestedSetBuilder<Artifact> metadataFilesBuilder) { for (Artifact artifact : objectFiles) { - Action action = analysisEnvironment.getLocalGeneratingAction(artifact); + ActionAnalysisMetadata action = analysisEnvironment.getLocalGeneratingAction(artifact); if (action instanceof CppCompileAction) { addOutputs(metadataFilesBuilder, action, CppFileTypes.COVERAGE_NOTES); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java index e3250cabc2..b8a68544a3 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.AbstractAction; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; import com.google.devtools.build.lib.actions.ActionOwner; @@ -224,7 +224,7 @@ public final class SolibSymlinkAction extends AbstractAction { } @Override - public boolean shouldReportPathPrefixConflict(Action action) { + public boolean shouldReportPathPrefixConflict(ActionAnalysisMetadata action) { return false; // Always ignore path prefix conflict for the SolibSymlinkAction. } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java index 7fa48b1f4a..b4650d2fd0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.AnalysisEnvironment; import com.google.devtools.build.lib.analysis.AnalysisUtils; @@ -86,7 +86,7 @@ public class JavaCommon { public void collectMetadataArtifacts(Iterable<Artifact> objectFiles, AnalysisEnvironment analysisEnvironment, NestedSetBuilder<Artifact> metadataFilesBuilder) { for (Artifact artifact : objectFiles) { - Action action = analysisEnvironment.getLocalGeneratingAction(artifact); + ActionAnalysisMetadata action = analysisEnvironment.getLocalGeneratingAction(artifact); if (action instanceof JavaCompileAction) { addOutputs(metadataFilesBuilder, action, JavaSemantics.COVERAGE_METADATA); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index 8fe7df3365..57e5215e23 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -55,6 +55,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ParameterFile; import com.google.devtools.build.lib.analysis.AnalysisEnvironment; @@ -1354,7 +1355,7 @@ public final class CompilationSupport { AnalysisEnvironment analysisEnvironment, NestedSetBuilder<Artifact> metadataFilesBuilder) { for (Artifact artifact : artifacts) { - Action action = analysisEnvironment.getLocalGeneratingAction(artifact); + ActionAnalysisMetadata action = analysisEnvironment.getLocalGeneratingAction(artifact); if (action.getMnemonic().equals("ObjcCompile")) { addOutputs(metadataFilesBuilder, action, ObjcRuleClasses.COVERAGE_NOTES); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java index 3c81ee58d5..621b352f31 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/CoverageReportActionFactory.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.rules.test; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactFactory; import com.google.devtools.build.lib.actions.ArtifactOwner; @@ -43,16 +43,16 @@ public interface CoverageReportActionFactory { */ public static final class CoverageReportActionsWrapper { - private final Action lcovWriteAction; - private final Action coverageReportAction; + private final ActionAnalysisMetadata lcovWriteAction; + private final ActionAnalysisMetadata coverageReportAction; public CoverageReportActionsWrapper ( - Action lcovWriteAction, Action coverageReportAction) { + ActionAnalysisMetadata lcovWriteAction, ActionAnalysisMetadata coverageReportAction) { this.lcovWriteAction = lcovWriteAction; this.coverageReportAction = coverageReportAction; } - public ImmutableList<Action> getActions() { + public ImmutableList<ActionAnalysisMetadata> getActions() { return ImmutableList.of(lcovWriteAction, coverageReportAction); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java index 4b62f41c65..9951f63d46 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java @@ -14,7 +14,7 @@ package com.google.devtools.build.lib.rules.test; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.AnalysisEnvironment; import com.google.devtools.build.lib.analysis.FileProvider; @@ -234,7 +234,7 @@ public final class InstrumentedFilesCollector { * @param fileType the filetype of outputs which should be collected */ protected void addOutputs(NestedSetBuilder<Artifact> metadataFilesBuilder, - Action action, FileType fileType) { + ActionAnalysisMetadata action, FileType fileType) { for (Artifact output : action.getOutputs()) { if (fileType.matches(output.getFilename())) { metadataFilesBuilder.add(output); 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 5a39dbbf8a..a6a110cc51 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 @@ -92,6 +92,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver @Override public SkyValue compute(SkyKey skyKey, Environment env) throws ActionExecutionFunctionException, InterruptedException { + Preconditions.checkArgument(skyKey.argument() instanceof Action); Action action = (Action) skyKey.argument(); // TODO(bazel-team): Non-volatile NotifyOnActionCacheHit actions perform worse in Skyframe than // legacy when they are not at the top of the action graph. In legacy, they are stored diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java index fdce7c69b3..e56ef46f6d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java @@ -18,7 +18,7 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Objects; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Action; -import com.google.devtools.build.lib.actions.Action.MiddlemanType; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java index e40817c137..db23b453ca 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionLookupValue.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactOwner; @@ -34,10 +34,10 @@ import java.util.Map; * actions of target completion values and build info artifacts also fall into this category. */ public class ActionLookupValue implements SkyValue { - protected final ImmutableMap<Artifact, Action> generatingActionMap; + protected final ImmutableMap<Artifact, ActionAnalysisMetadata> generatingActionMap; - private static Map<Artifact, Action> filterSharedActionsAndThrowRuntimeIfConflict( - Iterable<Action> actions) { + private static Map<Artifact, ActionAnalysisMetadata> filterSharedActionsAndThrowRuntimeIfConflict( + Iterable<ActionAnalysisMetadata> actions) { try { return Actions.filterSharedActionsAndThrowActionConflict(actions); } catch (ActionConflictException e) { @@ -46,24 +46,24 @@ public class ActionLookupValue implements SkyValue { } } - ActionLookupValue(Iterable<Action> actions) { + ActionLookupValue(Iterable<ActionAnalysisMetadata> actions) { this(filterSharedActionsAndThrowRuntimeIfConflict(actions)); } - ActionLookupValue(Action action) { + ActionLookupValue(ActionAnalysisMetadata action) { this(ImmutableList.of(action)); } - ActionLookupValue(Map<Artifact, Action> generatingActionMap) { + ActionLookupValue(Map<Artifact, ActionAnalysisMetadata> generatingActionMap) { this.generatingActionMap = ImmutableMap.copyOf(generatingActionMap); } - public Action getGeneratingAction(Artifact artifact) { + public ActionAnalysisMetadata getGeneratingAction(Artifact artifact) { return generatingActionMap.get(artifact); } /** To be used only when checking consistency of the action graph -- not by other values. */ - ImmutableMap<Artifact, Action> getMapForConsistencyCheck() { + ImmutableMap<Artifact, ActionAnalysisMetadata> getMapForConsistencyCheck() { return generatingActionMap; } @@ -71,7 +71,7 @@ public class ActionLookupValue implements SkyValue { * To be used only when setting the owners of deserialized artifacts whose owners were unknown at * creation time -- not by other callers or values. */ - Iterable<Action> getActionsForFindingArtifactOwners() { + Iterable<ActionAnalysisMetadata> getActionsForFindingArtifactOwners() { return generatingActionMap.values(); } 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 312feefcef..c8022d5e89 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 @@ -16,7 +16,8 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Predicate; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Action; -import com.google.devtools.build.lib.actions.Action.MiddlemanType; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType; import com.google.devtools.build.lib.actions.ActionExecutionException; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactOwner; @@ -65,11 +66,16 @@ class ArtifactFunction implements SkyFunction { } } - Action action = extractActionFromArtifact(artifact, env); - if (action == null) { + ActionAnalysisMetadata actionMetadata = extractActionFromArtifact(artifact, env); + if (actionMetadata == null) { return null; } + Preconditions.checkState( + actionMetadata instanceof Action, + "%s is not a proper Action object and therefore cannot be executed", + actionMetadata); + Action action = (Action) actionMetadata; ActionExecutionValue actionValue = (ActionExecutionValue) env.getValue(ActionExecutionValue.key(action)); if (actionValue == null) { @@ -165,8 +171,8 @@ class ArtifactFunction implements SkyFunction { return FileArtifactValue.create(artifact, data); } - private AggregatingArtifactValue createAggregatingValue(Artifact artifact, Action action, - FileArtifactValue value, SkyFunction.Environment env) { + private AggregatingArtifactValue createAggregatingValue(Artifact artifact, + ActionAnalysisMetadata action, FileArtifactValue value, SkyFunction.Environment env) { // This artifact aggregates other artifacts. Keep track of them so callers can find them. ImmutableList.Builder<Pair<Artifact, FileArtifactValue>> inputs = ImmutableList.builder(); for (Map.Entry<SkyKey, SkyValue> entry : @@ -190,7 +196,7 @@ class ArtifactFunction implements SkyFunction { * see if the action is an aggregating middleman action. However, may include runfiles middleman * actions and Fileset artifacts in the future. */ - private static boolean isAggregatingValue(Action action) { + private static boolean isAggregatingValue(ActionAnalysisMetadata action) { return action.getActionType() == MiddlemanType.AGGREGATING_MIDDLEMAN; } @@ -199,7 +205,8 @@ class ArtifactFunction implements SkyFunction { return Label.print(((OwnedArtifact) skyKey.argument()).getArtifact().getOwner()); } - private Action extractActionFromArtifact(Artifact artifact, SkyFunction.Environment env) { + private ActionAnalysisMetadata extractActionFromArtifact( + Artifact artifact, SkyFunction.Environment env) { ArtifactOwner artifactOwner = artifact.getArtifactOwner(); Preconditions.checkState(artifactOwner instanceof ActionLookupKey, "", artifact, artifactOwner); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index 56878b153b..f37e5e2963 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; import com.google.common.collect.ListMultimap; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; @@ -288,7 +288,7 @@ public final class AspectFunction implements SkyFunction { originalTarget.getLabel(), originalTarget.getLocation(), ConfiguredAspect.forAlias(real.getConfiguredAspect()), - ImmutableList.<Action>of(), + ImmutableList.<ActionAnalysisMetadata>of(), transitivePackages); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java index effd33f2a4..33cf880a6a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java @@ -15,7 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Objects; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; @@ -247,7 +247,7 @@ public final class AspectValue extends ActionLookupValue { Label label, Location location, ConfiguredAspect configuredAspect, - Iterable<Action> actions, + Iterable<ActionAnalysisMetadata> actions, NestedSet<Package> transitivePackages) { super(actions); this.aspect = aspect; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java index 0a5caf065e..6fb86c8dec 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java @@ -23,7 +23,7 @@ import com.google.common.collect.LinkedListMultimap; import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; @@ -846,7 +846,7 @@ final class ConfiguredTargetFunction implements SkyFunction { analysisEnvironment.disable(target); Preconditions.checkNotNull(configuredTarget, target); - Map<Artifact, Action> generatingActions; + Map<Artifact, ActionAnalysisMetadata> generatingActions; // Check for conflicting actions within this configured target (that indicates a bug in the // rule implementation). try { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java index 3918bf7d09..7f32c1e19b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -46,12 +46,13 @@ public final class ConfiguredTargetValue extends ActionLookupValue { // We overload this variable to check whether the value has been clear()ed. We don't use a // separate variable in order to save memory. - @Nullable private volatile Iterable<Action> actions; + @Nullable private volatile Iterable<ActionAnalysisMetadata> actions; private final NestedSet<Package> transitivePackages; ConfiguredTargetValue(ConfiguredTarget configuredTarget, - Map<Artifact, Action> generatingActionMap, NestedSet<Package> transitivePackages) { + Map<Artifact, ActionAnalysisMetadata> generatingActionMap, + NestedSet<Package> transitivePackages) { super(generatingActionMap); this.configuredTarget = configuredTarget; this.actions = generatingActionMap.values(); @@ -65,7 +66,7 @@ public final class ConfiguredTargetValue extends ActionLookupValue { } @VisibleForTesting - public Iterable<Action> getActions() { + public Iterable<ActionAnalysisMetadata> getActions() { return Preconditions.checkNotNull(actions, configuredTarget); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java index 0a13579afb..53d7a86102 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportFunction.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.skyframe.SkyFunction; @@ -35,14 +35,14 @@ public class CoverageReportFunction implements SkyFunction { CoverageReportValue.SKY_KEY.equals(skyKey), String.format( "Expected %s for SkyKey but got %s instead", CoverageReportValue.SKY_KEY, skyKey)); - ImmutableList <Action> actions = PrecomputedValue.COVERAGE_REPORT_KEY.get(env); + ImmutableList<ActionAnalysisMetadata> actions = PrecomputedValue.COVERAGE_REPORT_KEY.get(env); if (actions == null) { return null; } ImmutableSet.Builder<Artifact> outputs = new ImmutableSet.Builder<>(); - for (Action action : actions) { + for (ActionAnalysisMetadata action : actions) { outputs.addAll(action.getOutputs()); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java index 44722b563e..27ace7605b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.skyframe.SkyFunctionName; @@ -34,7 +34,7 @@ public class CoverageReportValue extends ActionLookupValue { public static final ArtifactOwner ARTIFACT_OWNER = new CoverageReportKey(); public CoverageReportValue(ImmutableSet<Artifact> coverageReportArtifacts, - ImmutableList <Action> coverageReportActions) { + ImmutableList <ActionAnalysisMetadata> coverageReportActions) { super(coverageReportActions); this.coverageReportArtifacts = coverageReportArtifacts; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java index 878caeca08..c33e599412 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java @@ -18,7 +18,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.ListMultimap; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.Dependency; import com.google.devtools.build.lib.analysis.LabelAndConfiguration; @@ -72,14 +72,15 @@ public class PostConfiguredTargetFunction implements SkyFunction { @Override public SkyValue compute(SkyKey skyKey, Environment env) throws SkyFunctionException, InterruptedException { - ImmutableMap<Action, ConflictException> badActions = PrecomputedValue.BAD_ACTIONS.get(env); + ImmutableMap<ActionAnalysisMetadata, ConflictException> badActions = + PrecomputedValue.BAD_ACTIONS.get(env); ConfiguredTargetValue ctValue = (ConfiguredTargetValue) env.getValue(ConfiguredTargetValue.key((ConfiguredTargetKey) skyKey.argument())); if (env.valuesMissing()) { return null; } - for (Action action : ctValue.getActions()) { + for (ActionAnalysisMetadata action : ctValue.getActions()) { if (badActions.containsKey(action)) { throw new ActionConflictFunctionException(badActions.get(action)); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java index 0746b62134..8d20b9ea97 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java @@ -18,7 +18,7 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.TopLevelArtifactContext; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction; @@ -89,7 +89,7 @@ public final class PrecomputedValue implements SkyValue { static final Precomputed<WorkspaceStatusAction> WORKSPACE_STATUS_KEY = new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "workspace_status_action")); - static final Precomputed<ImmutableList<Action>> COVERAGE_REPORT_KEY = + static final Precomputed<ImmutableList<ActionAnalysisMetadata>> COVERAGE_REPORT_KEY = new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "coverage_report_actions")); static final Precomputed<TopLevelArtifactContext> TOP_LEVEL_CONTEXT = @@ -101,7 +101,7 @@ public final class PrecomputedValue implements SkyValue { public static final Precomputed<BlazeDirectories> BLAZE_DIRECTORIES = new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "blaze_directories")); - static final Precomputed<ImmutableMap<Action, ConflictException>> BAD_ACTIONS = + static final Precomputed<ImmutableMap<ActionAnalysisMetadata, ConflictException>> BAD_ACTIONS = new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "bad_actions")); public static final Precomputed<PathPackageLocator> PATH_PACKAGE_LOCATOR = diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java index 520cc0f0b6..3e0f2a5eb3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java @@ -21,6 +21,7 @@ import com.google.common.collect.Maps; import com.google.common.eventbus.EventBus; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionCacheChecker; import com.google.devtools.build.lib.actions.ActionCacheChecker.Token; import com.google.devtools.build.lib.actions.ActionCompletionEvent; @@ -126,7 +127,7 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto // Errors found when examining all actions in the graph are stored here, so that they can be // thrown when execution of the action is requested. This field is set during each call to // findAndStoreArtifactConflicts, and is preserved across builds otherwise. - private ImmutableMap<Action, ConflictException> badActionMap = ImmutableMap.of(); + private ImmutableMap<ActionAnalysisMetadata, ConflictException> badActionMap = ImmutableMap.of(); private boolean keepGoing; private boolean hadExecutionError; private ActionInputFileCache perBuildFileCache; @@ -179,7 +180,7 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto * Return the map of mostly recently executed bad actions to their corresponding exception. * See {#findAndStoreArtifactConflicts()}. */ - public ImmutableMap<Action, ConflictException> badActions() { + public ImmutableMap<ActionAnalysisMetadata, ConflictException> badActions() { // TODO(bazel-team): Move badActions() and findAndStoreArtifactConflicts() to SkyframeBuildView // now that it's done in the analysis phase. return badActionMap; @@ -215,15 +216,16 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto */ void findAndStoreArtifactConflicts(Iterable<ActionLookupValue> actionLookupValues) throws InterruptedException { - ConcurrentMap<Action, ConflictException> temporaryBadActionMap = new ConcurrentHashMap<>(); + ConcurrentMap<ActionAnalysisMetadata, ConflictException> temporaryBadActionMap = + new ConcurrentHashMap<>(); Pair<ActionGraph, SortedMap<PathFragment, Artifact>> result; result = constructActionGraphAndPathMap(actionLookupValues, temporaryBadActionMap); ActionGraph actionGraph = result.first; SortedMap<PathFragment, Artifact> artifactPathMap = result.second; - Map<Action, ArtifactPrefixConflictException> actionsWithArtifactPrefixConflict = + Map<ActionAnalysisMetadata, ArtifactPrefixConflictException> actionsWithArtifactPrefixConflict = Actions.findArtifactPrefixConflicts(actionGraph, artifactPathMap); - for (Map.Entry<Action, ArtifactPrefixConflictException> actionExceptionPair : + for (Map.Entry<ActionAnalysisMetadata, ArtifactPrefixConflictException> actionExceptionPair : actionsWithArtifactPrefixConflict.entrySet()) { temporaryBadActionMap.put( actionExceptionPair.getKey(), new ConflictException(actionExceptionPair.getValue())); @@ -240,7 +242,8 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto private static Pair<ActionGraph, SortedMap<PathFragment, Artifact>> constructActionGraphAndPathMap( Iterable<ActionLookupValue> values, - ConcurrentMap<Action, ConflictException> badActionMap) throws InterruptedException { + ConcurrentMap<ActionAnalysisMetadata, ConflictException> badActionMap) + throws InterruptedException { MutableActionGraph actionGraph = new MapBasedActionGraph(); ConcurrentNavigableMap<PathFragment, Artifact> artifactPathMap = new ConcurrentSkipListMap<>(); // Action graph construction is CPU-bound. @@ -274,14 +277,15 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto final List<ActionLookupValue> values, final MutableActionGraph actionGraph, final ConcurrentMap<PathFragment, Artifact> artifactPathMap, - final ConcurrentMap<Action, ConflictException> badActionMap) { + final ConcurrentMap<ActionAnalysisMetadata, ConflictException> badActionMap) { return new Runnable() { @Override public void run() { for (ActionLookupValue value : values) { - Set<Action> registeredActions = new HashSet<>(); - for (Map.Entry<Artifact, Action> entry : value.getMapForConsistencyCheck().entrySet()) { - Action action = entry.getValue(); + Set<ActionAnalysisMetadata> registeredActions = new HashSet<>(); + for (Map.Entry<Artifact, ActionAnalysisMetadata> entry : + value.getMapForConsistencyCheck().entrySet()) { + ActionAnalysisMetadata action = entry.getValue(); // We have an entry for each <action, artifact> pair. Only try to register each action // once. if (registeredActions.add(action)) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java index fc00b5760c..140dfbc9db 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java @@ -24,7 +24,7 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.eventbus.EventBus; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ArtifactFactory; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; @@ -213,7 +213,8 @@ public final class SkyframeBuildView { } finally { enableAnalysis(false); } - ImmutableMap<Action, ConflictException> badActions = skyframeExecutor.findArtifactConflicts(); + ImmutableMap<ActionAnalysisMetadata, ConflictException> badActions = + skyframeExecutor.findArtifactConflicts(); Collection<AspectValue> goodAspects = Lists.newArrayListWithCapacity(values.size()); NestedSetBuilder<Package> packages = NestedSetBuilder.stableOrder(); @@ -256,7 +257,7 @@ public final class SkyframeBuildView { // TODO(bazel-team): We might want to report the other errors through the event bus but // for keeping this code in parity with legacy we just report the first error for now. if (!keepGoing) { - for (Map.Entry<Action, ConflictException> bad : badActions.entrySet()) { + for (Map.Entry<ActionAnalysisMetadata, ConflictException> bad : badActions.entrySet()) { ConflictException ex = bad.getValue(); try { ex.rethrowTyped(); @@ -339,7 +340,7 @@ public final class SkyframeBuildView { } Collection<Exception> reportedExceptions = Sets.newHashSet(); - for (Map.Entry<Action, ConflictException> bad : badActions.entrySet()) { + for (Map.Entry<ActionAnalysisMetadata, ConflictException> bad : badActions.entrySet()) { ConflictException ex = bad.getValue(); try { ex.rethrowTyped(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 25bfc92688..beea6b5054 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -33,7 +33,7 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Maps; import com.google.common.collect.Range; import com.google.common.eventbus.EventBus; -import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionCacheChecker; import com.google.devtools.build.lib.actions.ActionExecutionContextFactory; import com.google.devtools.build.lib.actions.ActionExecutionStatusReporter; @@ -634,7 +634,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { artifactFactory.get(), WorkspaceStatusValue.ARTIFACT_OWNER, buildId)); } - public void injectCoverageReportData(ImmutableList<Action> actions) { + public void injectCoverageReportData(ImmutableList<ActionAnalysisMetadata> actions) { PrecomputedValue.COVERAGE_REPORT_KEY.set(injectable(), actions); } @@ -1037,8 +1037,8 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { * {@link SkyframeActionExecutor#findAndStoreArtifactConflicts} to do the work, since any * conflicts found will only be reported during execution. */ - ImmutableMap<Action, SkyframeActionExecutor.ConflictException> findArtifactConflicts() - throws InterruptedException { + ImmutableMap<ActionAnalysisMetadata, SkyframeActionExecutor.ConflictException> + findArtifactConflicts() throws InterruptedException { if (skyframeBuildView.isSomeConfiguredTargetEvaluated() || skyframeBuildView.isSomeConfiguredTargetInvalidated()) { // This operation is somewhat expensive, so we only do it if the graph might have changed in @@ -1384,7 +1384,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { */ public EvaluationResult<PostConfiguredTargetValue> postConfigureTargets( EventHandler eventHandler, List<ConfiguredTargetKey> values, boolean keepGoing, - ImmutableMap<Action, SkyframeActionExecutor.ConflictException> badActions) + ImmutableMap<ActionAnalysisMetadata, SkyframeActionExecutor.ConflictException> badActions) throws InterruptedException { checkActive(); PrecomputedValue.BAD_ACTIONS.set(injectable(), badActions); @@ -1464,7 +1464,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { /** * Returns the generating action of a given artifact ({@code null} if it's a source artifact). */ - private Action getGeneratingAction(EventHandler eventHandler, Artifact artifact) + private ActionAnalysisMetadata getGeneratingAction(EventHandler eventHandler, Artifact artifact) throws InterruptedException { if (artifact.isSourceArtifact()) { return null; @@ -1498,11 +1498,11 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { public ActionGraph getActionGraph(final EventHandler eventHandler) { return new ActionGraph() { @Override - public Action getGeneratingAction(final Artifact artifact) { + public ActionAnalysisMetadata getGeneratingAction(final Artifact artifact) { try { - return callUninterruptibly(new Callable<Action>() { + return callUninterruptibly(new Callable<ActionAnalysisMetadata>() { @Override - public Action call() throws InterruptedException { + public ActionAnalysisMetadata call() throws InterruptedException { return SkyframeExecutor.this.getGeneratingAction(eventHandler, artifact); } }); |