Allow giving up on incrementality based on the evaluating version diff.
PiperOrigin-RevId: 848247192
Change-Id: I4ed16d0745b05644b28e6211feb08d192dd84382
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BazelSkyframeExecutorConstants.java b/src/main/java/com/google/devtools/build/lib/skyframe/BazelSkyframeExecutorConstants.java
index cddc0463..df6d5a8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BazelSkyframeExecutorConstants.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BazelSkyframeExecutorConstants.java
@@ -14,12 +14,15 @@
package com.google.devtools.build.lib.skyframe;
import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.packages.BuildFileName;
import com.google.devtools.build.lib.server.FailureDetails;
+import com.google.devtools.build.lib.skyframe.DiffAwarenessManager.EvaluatingVersionDiff;
import com.google.devtools.build.lib.skyframe.PackageFunction.ActionOnFilesystemErrorCodeLoadingBzlFile;
import com.google.devtools.build.lib.skyframe.PackageFunction.ActionOnIOExceptionReadingBuildFile;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor.DiffCheckNotificationOptions;
+import com.google.devtools.common.options.OptionsProvider;
import java.time.Duration;
/** Hardcoded constants describing bazel-on-skyframe behavior. */
@@ -45,6 +48,12 @@
public static final DiffCheckNotificationOptions DIFF_CHECK_NOTIFICATION_OPTIONS =
new DiffCheckNotificationOptions() {
@Override
+ public boolean allowDiffCheck(
+ EvaluatingVersionDiff versionDiff, EventHandler eventHandler, OptionsProvider options) {
+ return true;
+ }
+
+ @Override
public String getStatusMessage() {
return "Checking for file changes...";
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index ebeb50c..82c16c6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -269,7 +269,18 @@
for (Root pkgRoot : packageLocator.getPathEntries()) {
Optional<EvaluatingVersionDiff> evaluatingVersionDiff =
diffAwarenessManager.getEvaluatingVersionDiff(pkgRoot, options);
- evaluatingVersionDiff.ifPresent(eventHandler::post);
+ if (evaluatingVersionDiff.isPresent()) {
+ EvaluatingVersionDiff versionDiff = evaluatingVersionDiff.get();
+ eventHandler.post(versionDiff);
+ if (!evaluatorNeedsReset
+ && diffCheckNotificationOptions.isPresent()
+ && !diffCheckNotificationOptions
+ .get()
+ .allowDiffCheck(versionDiff, eventHandler, options)) {
+ evaluatorNeedsReset = true;
+ needGcAfterResettingEvaluator = true;
+ }
+ }
}
}
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 91eb88d..2c76019 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
@@ -196,6 +196,7 @@
import com.google.devtools.build.lib.skyframe.AspectKeyCreator.TopLevelAspectsKey;
import com.google.devtools.build.lib.skyframe.BuildDriverFunction.AdditionalPostAnalysisDepsRequestedAndAvailable;
import com.google.devtools.build.lib.skyframe.BuildDriverFunction.TestTypeResolver;
+import com.google.devtools.build.lib.skyframe.DiffAwarenessManager.EvaluatingVersionDiff;
import com.google.devtools.build.lib.skyframe.DiffAwarenessManager.ProcessableModifiedFileSet;
import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.ExternalDirtinessChecker;
import com.google.devtools.build.lib.skyframe.DirtinessCheckerUtils.FileDirtinessChecker;
@@ -541,7 +542,7 @@
private final AtomicInteger analysisCount = new AtomicInteger();
- private final Optional<DiffCheckNotificationOptions> diffCheckNotificationOptions;
+ protected final Optional<DiffCheckNotificationOptions> diffCheckNotificationOptions;
private boolean isCleanBuild = true;
@@ -4740,8 +4741,19 @@
return Multisets.copyHighestCountFirst(counts);
}
- /** Defines configuration for the progress message shown during a slow diff check. */
+ /**
+ * Defines configuration for the diff checking and the progress message shown during a slow diff
+ * check.
+ */
public interface DiffCheckNotificationOptions {
+
+ /**
+ * Whether to allow a diff check for the given {@link EvaluatingVersionDiff}. A return of false
+ * results in starting with a fresh Skyframe graph instead of an incremental build.
+ */
+ boolean allowDiffCheck(
+ EvaluatingVersionDiff versionDiff, EventHandler eventHandler, OptionsProvider options);
+
String getStatusMessage();
Duration getStatusUpdateDelay();