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 6c0cf209c2921d..aedb377668620a 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 @@ -431,7 +431,9 @@ public AnalysisResult update( checkForActionConflicts, loadingPhaseThreads, viewOptions.cpuHeavySkyKeysThreadPoolSize, - mergedPhasesExecutionJobsCount); + mergedPhasesExecutionJobsCount, + /*shouldDiscardAnalysisCache=*/ viewOptions.discardAnalysisCache + || !skyframeExecutor.tracksStateForIncrementality()); } } finally { skyframeBuildView.clearInvalidatedActionLookupKeys(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverFunction.java index 38cf4c796eb225..478f9247cf88e7 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildDriverFunction.java @@ -208,8 +208,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) env, topLevelArtifactContext); } else { - env.getListener().post(TopLevelEntityAnalysisConcludedEvent.create(buildDriverKey)); - requestAspectExecution((TopLevelAspectsValue) topLevelSkyValue, env, topLevelArtifactContext); + announceAspectAnalysisDoneAndRequestExecution( + buildDriverKey, (TopLevelAspectsValue) topLevelSkyValue, env, topLevelArtifactContext); } if (env.valuesMissing()) { @@ -345,7 +345,8 @@ private void requestConfiguredTargetExecution( declareDependenciesAndCheckValues(env, artifactsToBuild.build()); } - private void requestAspectExecution( + private void announceAspectAnalysisDoneAndRequestExecution( + BuildDriverKey buildDriverKey, TopLevelAspectsValue topLevelAspectsValue, Environment env, TopLevelArtifactContext topLevelArtifactContext) @@ -362,6 +363,9 @@ private void requestAspectExecution( env.getListener().post(AspectAnalyzedEvent.create(aspectKey, configuredAspect)); aspectCompletionKeys.add(AspectCompletionKey.create(aspectKey, topLevelArtifactContext)); } + // Send the AspectAnalyzedEvents first to make sure the BuildResultListener is up-to-date before + // signaling that the analysis of this top level aspect has concluded. + env.getListener().post(TopLevelEntityAnalysisConcludedEvent.create(buildDriverKey)); declareDependenciesAndCheckValues( env, Iterables.concat(artifactsToBuild.build(), aspectCompletionKeys)); 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 712e0aa330f5e2..55ac165b981e89 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 @@ -362,7 +362,9 @@ public void clearAnalysisCache( ImmutableSet topLevelTargets, ImmutableSet topLevelAspects) { // TODO(bazel-team): Consider clearing packages too to save more memory. skyframeAnalysisWasDiscarded = true; - skyframeExecutor.clearAnalysisCache(topLevelTargets, topLevelAspects); + try (SilentCloseable c = Profiler.instance().profile("skyframeExecutor.clearAnalysisCache")) { + skyframeExecutor.clearAnalysisCache(topLevelTargets, topLevelAspects); + } } /** @@ -633,7 +635,8 @@ public SkyframeAnalysisResult analyzeAndExecuteTargets( boolean checkForActionConflicts, int numThreads, int cpuHeavySkyKeysThreadPoolSize, - int mergedPhasesExecutionJobsCount) + int mergedPhasesExecutionJobsCount, + boolean shouldDiscardAnalysisCache) throws InterruptedException, ViewCreationFailedException, BuildFailedException, TestExecException { enableAnalysis(true); @@ -683,14 +686,11 @@ public SkyframeAnalysisResult analyzeAndExecuteTargets( Sets.newConcurrentHashSet(Sets.union(buildDriverCTKeys, buildDriverAspectKeys)), eventBus, /*finisher=*/ () -> - eventBus.post( - AnalysisPhaseCompleteEvent.fromSkymeld( - buildResultListener.getAnalyzedTargets(), - getEvaluatedCounts(), - getEvaluatedActionCounts(), - analysisWorkTimer.stop().elapsed().toMillis(), - skyframeExecutor.getPackageManager().getAndClearStatistics(), - skyframeExecutor.wasAnalysisCacheInvalidatedAndResetBit())))) { + analysisFinishedCallback( + eventBus, + buildResultListener, + shouldDiscardAnalysisCache, + /*measuredAnalysisTime=*/ analysisWorkTimer.stop().elapsed().toMillis()))) { try { resourceManager.resetResourceUsage(); @@ -814,6 +814,27 @@ public SkyframeAnalysisResult analyzeAndExecuteTargets( } } + /** Handles the required steps after all analysis work in this build is done. */ + private void analysisFinishedCallback( + EventBus eventBus, + BuildResultListener buildResultListener, + boolean shouldDiscardAnalysisCache, + long measuredAnalysisTime) { + if (shouldDiscardAnalysisCache) { + clearAnalysisCache( + buildResultListener.getAnalyzedTargets(), + buildResultListener.getAnalyzedAspects().keySet()); + } + eventBus.post( + AnalysisPhaseCompleteEvent.fromSkymeld( + buildResultListener.getAnalyzedTargets(), + getEvaluatedCounts(), + getEvaluatedActionCounts(), + measuredAnalysisTime, + skyframeExecutor.getPackageManager().getAndClearStatistics(), + skyframeExecutor.wasAnalysisCacheInvalidatedAndResetBit())); + } + /** * Report the appropriate conflicts and return a TopLevelActionConflictReport. *