diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build')
4 files changed, 60 insertions, 8 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/NotifyOnActionCacheHit.java b/src/main/java/com/google/devtools/build/lib/actions/NotifyOnActionCacheHit.java index ac58b89f4a..89c9a20c2e 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/NotifyOnActionCacheHit.java +++ b/src/main/java/com/google/devtools/build/lib/actions/NotifyOnActionCacheHit.java @@ -14,17 +14,47 @@ package com.google.devtools.build.lib.actions; +import com.google.common.eventbus.EventBus; +import com.google.devtools.build.lib.actions.Executor.ActionContext; +import com.google.devtools.build.lib.events.EventHandler; +import com.google.devtools.build.lib.vfs.Path; + /** * An action which must know when it is skipped due to an action cache hit. * * Use should be rare, as the action graph is a functional model. */ public interface NotifyOnActionCacheHit extends Action { + /** + * A custom interface similar to {@link ActionExecutionContext}, but specific to cache hits. + */ + public interface ActionCachedContext { + /** + * An event listener to report messages to. Errors that signal a action failure should + * use ActionExecutionException. + */ + EventHandler getEventHandler(); + + /** The EventBus for the current build. */ + EventBus getEventBus(); + + /** + * Returns the execution root. This is the directory underneath which Blaze builds its entire + * output working tree, including the source symlink forest. All build actions are executed + * relative to this directory. + */ + Path getExecRoot(); + + /** + * Looks up and returns an action context implementation of the given interface type. + */ + <T extends ActionContext> T getContext(Class<? extends T> type); + } /** * Called when action has "cache hit", and therefore need not be executed. * - * @param executor the executor + * @param context the action context for a cache hit */ - void actionCacheHit(Executor executor); + void actionCacheHit(ActionCachedContext context); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java b/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java index 7f42c03889..a38cef2433 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java @@ -32,7 +32,6 @@ import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.vfs.PathFragment; - import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; @@ -95,8 +94,8 @@ public final class BaselineCoverageAction extends AbstractFileWriteAction } @Override - public void actionCacheHit(Executor executor) { - notifyAboutBaselineCoverage(executor.getEventBus()); + public void actionCacheHit(ActionCachedContext context) { + notifyAboutBaselineCoverage(context.getEventBus()); } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java index 6db48d097e..dec8790a47 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestRunnerAction.java @@ -25,7 +25,6 @@ import com.google.devtools.build.lib.actions.ActionInputHelper; import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ExecException; -import com.google.devtools.build.lib.actions.Executor; import com.google.devtools.build.lib.actions.NotifyOnActionCacheHit; import com.google.devtools.build.lib.actions.UserExecException; import com.google.devtools.build.lib.analysis.RunfilesSupplierImpl; @@ -301,7 +300,7 @@ public class TestRunnerAction extends AbstractAction implements NotifyOnActionCa } @Override - public void actionCacheHit(Executor executor) { + public void actionCacheHit(ActionCachedContext executor) { unconditionalExecution = null; try { executor.getEventBus().post( 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 d93fd76669..f80bf85598 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 @@ -47,10 +47,12 @@ import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; import com.google.devtools.build.lib.actions.CachedActionEvent; import com.google.devtools.build.lib.actions.EnvironmentalExecException; import com.google.devtools.build.lib.actions.Executor; +import com.google.devtools.build.lib.actions.Executor.ActionContext; import com.google.devtools.build.lib.actions.MapBasedActionGraph; import com.google.devtools.build.lib.actions.MutableActionGraph; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.NotifyOnActionCacheHit; +import com.google.devtools.build.lib.actions.NotifyOnActionCacheHit.ActionCachedContext; import com.google.devtools.build.lib.actions.PackageRootResolver; import com.google.devtools.build.lib.actions.TargetOutOfDateException; import com.google.devtools.build.lib.actions.cache.MetadataHandler; @@ -59,6 +61,7 @@ import com.google.devtools.build.lib.concurrent.ExecutorUtil; import com.google.devtools.build.lib.concurrent.Sharder; import com.google.devtools.build.lib.concurrent.ThrowableRecordingRunnableWrapper; import com.google.devtools.build.lib.events.Event; +import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.exec.OutputService; import com.google.devtools.build.lib.profiler.Profiler; @@ -486,7 +489,28 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto if (action instanceof NotifyOnActionCacheHit) { NotifyOnActionCacheHit notify = (NotifyOnActionCacheHit) action; - notify.actionCacheHit(executorEngine); + ActionCachedContext context = new ActionCachedContext() { + @Override + public EventHandler getEventHandler() { + return executorEngine.getEventHandler(); + } + + @Override + public EventBus getEventBus() { + return executorEngine.getEventBus(); + } + + @Override + public Path getExecRoot() { + return executorEngine.getExecRoot(); + } + + @Override + public <T extends ActionContext> T getContext(Class<? extends T> type) { + return executorEngine.getContext(type); + } + }; + notify.actionCacheHit(context); } // We still need to check the outputs so that output file data is available to the value. |