Skip to content

Commit

Permalink
Incrementally handle afterAnalysis of some BlazeModules.
Browse files Browse the repository at this point in the history
PiperOrigin-RevId: 462101217
Change-Id: I69d64cc5c0f8e17a47edbe8d3946151380210766
  • Loading branch information
joeleba authored and Copybara-Service committed Jul 20, 2022
1 parent aa94b1b commit b6f580a
Show file tree
Hide file tree
Showing 3 changed files with 79 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@

import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.common.eventbus.Subscribe;
import com.google.common.flogger.GoogleLogger;
import com.google.devtools.build.lib.actions.BuildFailedException;
import com.google.devtools.build.lib.actions.TestExecException;
Expand All @@ -34,13 +36,15 @@
import com.google.devtools.build.lib.profiler.ProfilePhase;
import com.google.devtools.build.lib.profiler.Profiler;
import com.google.devtools.build.lib.profiler.SilentCloseable;
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
import com.google.devtools.build.lib.server.FailureDetails.BuildConfiguration.Code;
import com.google.devtools.build.lib.server.FailureDetails.FailureDetail;
import com.google.devtools.build.lib.skyframe.BuildInfoCollectionFunction;
import com.google.devtools.build.lib.skyframe.BuildResultListener;
import com.google.devtools.build.lib.skyframe.PrecomputedValue;
import com.google.devtools.build.lib.skyframe.TargetPatternPhaseValue;
import com.google.devtools.build.lib.skyframe.TopLevelStatusEvents.TopLevelTargetAnalyzedEvent;
import com.google.devtools.build.lib.util.AbruptExitException;
import com.google.devtools.build.lib.util.DetailedExitCode;
import com.google.devtools.build.lib.util.RegexFilter;
Expand Down Expand Up @@ -110,7 +114,10 @@ static AnalysisAndExecutionResult execute(
BuildInfoCollectionFunction.BUILD_INFO_FACTORIES,
env.getRuntime().getRuleClassProvider().getBuildInfoFactoriesAsMap())));

try (SilentCloseable c = Profiler.instance().profile("runAnalysisAndExecutionPhase")) {
try (SilentCloseable c = Profiler.instance().profile("runAnalysisAndExecutionPhase");
TopLevelTargetAnalysisWatcher watcher =
TopLevelTargetAnalysisWatcher.createAndRegisterWithEventBus(
env.getRuntime().getBlazeModules(), env, request, buildOptions)) {
analysisAndExecutionResult =
runAnalysisAndExecutionPhase(
env, request, loadingResult, buildOptions, request.getMultiCpus());
Expand Down Expand Up @@ -255,4 +262,58 @@ private static ImmutableSet<Label> getExplicitTargetPatterns(

return ImmutableSet.copyOf(explicitTargetPatterns.build());
}

private static class TopLevelTargetAnalysisWatcher implements AutoCloseable {

private final Iterable<BlazeModule> blazeModules;
private final CommandEnvironment env;
private final BuildRequest buildRequest;
private final BuildOptions buildOptions;
private final Set<TopLevelTargetAnalyzedEvent> processedEvents;

private TopLevelTargetAnalysisWatcher(
Iterable<BlazeModule> blazeModules,
CommandEnvironment env,
BuildRequest buildRequest,
BuildOptions buildOptions) {
this.blazeModules = blazeModules;
this.env = env;
this.buildRequest = buildRequest;
this.buildOptions = buildOptions;
this.processedEvents = Sets.newConcurrentHashSet();
}

/** Creates an AnalysisOperationWatcher and registers it with the provided eventBus. */
public static TopLevelTargetAnalysisWatcher createAndRegisterWithEventBus(
Iterable<BlazeModule> blazeModules,
CommandEnvironment env,
BuildRequest buildRequest,
BuildOptions buildOptions) {
TopLevelTargetAnalysisWatcher watcher =
new TopLevelTargetAnalysisWatcher(blazeModules, env, buildRequest, buildOptions);
env.getEventBus().register(watcher);
return watcher;
}

@Subscribe
public void handleTopLevelEntityAnalysisConcluded(TopLevelTargetAnalyzedEvent e)
throws ViewCreationFailedException, InterruptedException {
// TopLevelTargetAnalyzedEvent originates from within Skyframe, which means there'll likely
// be multiple events fired for the same underlying ConfiguredTarget due to SkyFunction
// restarts. We only process them once.
if (!processedEvents.add(e)) {
return;
}

for (BlazeModule blazeModule : blazeModules) {
blazeModule.afterTopLevelTargetAnalysis(
env, buildRequest, buildOptions, e.configuredTarget());
}
}

@Override
public void close() {
env.getEventBus().unregister(this);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.BlazeVersionInfo;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.ServerDirectories;
import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
Expand Down Expand Up @@ -267,6 +268,21 @@ public void afterAnalysis(
AnalysisResult analysisResult)
throws InterruptedException, ViewCreationFailedException {}

/**
* Called after Bazel analyzes a single top-level target.
*
* @param env the command environment
* @param request the build request
* @param buildOptions the build's top-level options
* @param configuredTarget the analyzed top-level target
*/
public void afterTopLevelTargetAnalysis(
CommandEnvironment env,
BuildRequest request,
BuildOptions buildOptions,
ConfiguredTarget configuredTarget)
throws InterruptedException, ViewCreationFailedException {}

/**
* Called when Bazel initializes the action execution subsystem. This is called once per build if
* action execution is enabled. Modules can override this method to affect how execution is
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ private TopLevelStatusEvents() {}
*/
@AutoValue
public abstract static class TopLevelTargetAnalyzedEvent implements Postable {
abstract ConfiguredTarget configuredTarget();
public abstract ConfiguredTarget configuredTarget();

public static TopLevelTargetAnalyzedEvent create(ConfiguredTarget configuredTarget) {
return new AutoValue_TopLevelStatusEvents_TopLevelTargetAnalyzedEvent(configuredTarget);
Expand Down

0 comments on commit b6f580a

Please sign in to comment.