Replace the per-`SkyKey` caches used by `PackageFunction` with the new `SkyKeyComputeState` mechanism.
The new mechanism is just as good but doesn't have the downsides of the explicit per-`SkyKey` caches. See the "Background and motivation" section of the description of https://github.com/bazelbuild/bazel/commit/ed279ab4fa2d4356be00b54266f56edcc5aeae78.
This CL is expected to be performance neutral in all situations.
N.B. `PackageFunctionTest#testDiscrepancyBetweenGlobbingErrors` was ironically [very subtly] making use of the fact that the entry inside of `packageFunctionCache` for a `PackageValue` node with a dep in error does *not* get cleared inside of a `--nokeep_going` evaluation. Since this CL changes that behavior I had to change the test case to use a `--keep_going` evaluation in order to exercise the situation it wants to exercise.
PiperOrigin-RevId: 415564015
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
index 74ae317..9d24aa5 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java
@@ -16,7 +16,6 @@
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
-import com.github.benmanes.caffeine.cache.Cache;
import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -107,8 +106,6 @@
private final PackageFactory packageFactory;
private final CachingPackageLocator packageLocator;
- private final Cache<PackageIdentifier, LoadedPackageCacheEntry> packageFunctionCache;
- private final Cache<PackageIdentifier, CompiledBuildFile> compiledBuildFileCache;
private final AtomicBoolean showLoadingProgress;
private final AtomicInteger numPackagesLoaded;
@Nullable private final PackageProgressReceiver packageProgress;
@@ -128,9 +125,7 @@
* call site to its {@code generator_name} attribute value.
*/
// TODO(adonovan): when we split PackageCompileFunction out, move this there, and make it
- // non-public. The only reason it is public is because various places want to construct a
- // cache of them, but that hack can go away when it's a first-class Skyframe function.
- // (Since CompiledBuildFile contains a Module (the prelude), when we split it out,
+ // non-public. (Since CompiledBuildFile contains a Module (the prelude), when we split it out,
// the code path that requests it will have to support inlining a la BzlLoadFunction.)
public static class CompiledBuildFile {
// Either errors is null, or all the other fields are.
@@ -175,8 +170,6 @@
PackageFactory packageFactory,
CachingPackageLocator pkgLocator,
AtomicBoolean showLoadingProgress,
- Cache<PackageIdentifier, LoadedPackageCacheEntry> packageFunctionCache,
- Cache<PackageIdentifier, CompiledBuildFile> compiledBuildFileCache,
AtomicInteger numPackagesLoaded,
@Nullable BzlLoadFunction bzlLoadFunctionForInlining,
@Nullable PackageProgressReceiver packageProgress,
@@ -187,8 +180,6 @@
this.packageFactory = packageFactory;
this.packageLocator = pkgLocator;
this.showLoadingProgress = showLoadingProgress;
- this.packageFunctionCache = packageFunctionCache;
- this.compiledBuildFileCache = compiledBuildFileCache;
this.numPackagesLoaded = numPackagesLoaded;
this.packageProgress = packageProgress;
this.actionOnIOExceptionReadingBuildFile = actionOnIOExceptionReadingBuildFile;
@@ -240,20 +231,6 @@
}
}
- /** An entry in {@link PackageFunction} internal cache. */
- public static class LoadedPackageCacheEntry {
- private final Package.Builder builder;
- private final Set<SkyKey> globDepKeys;
- private final long loadTimeNanos;
-
- private LoadedPackageCacheEntry(
- Package.Builder builder, Set<SkyKey> globDepKeys, long loadTimeNanos) {
- this.builder = builder;
- this.globDepKeys = globDepKeys;
- this.loadTimeNanos = loadTimeNanos;
- }
- }
-
/**
* A declaration to {@link PackageFunction} about how it will be used, for the sake of making
* use-case-driven performance optimizations.
@@ -380,15 +357,48 @@
}
@Override
+ public boolean supportsSkyKeyComputeState() {
+ return true;
+ }
+
+ @Override
+ public SkyKeyComputeState createNewSkyKeyComputeState() {
+ return new State();
+ }
+
+ private static class LoadedPackage {
+ private final Package.Builder builder;
+ private final Set<SkyKey> globDepKeys;
+ private final long loadTimeNanos;
+
+ private LoadedPackage(Package.Builder builder, Set<SkyKey> globDepKeys, long loadTimeNanos) {
+ this.builder = builder;
+ this.globDepKeys = globDepKeys;
+ this.loadTimeNanos = loadTimeNanos;
+ }
+ }
+
+ private static class State implements SkyKeyComputeState {
+ @Nullable private CompiledBuildFile compiledBuildFile;
+ @Nullable private LoadedPackage loadedPackage;
+ }
+
+ @Override
public SkyValue compute(SkyKey key, Environment env)
throws PackageFunctionException, InterruptedException {
+ return compute(key, createNewSkyKeyComputeState(), env);
+ }
+
+ @Override
+ public SkyValue compute(SkyKey key, SkyKeyComputeState skyKeyComputeState, Environment env)
+ throws PackageFunctionException, InterruptedException {
PackageIdentifier packageId = (PackageIdentifier) key.argument();
if (packageId.equals(LabelConstants.EXTERNAL_PACKAGE_IDENTIFIER)) {
return getExternalPackage(env);
}
- // TODO(adonovan): opt: can't all the following statements be moved
- // into the packageFunctionCache.getIfPresent cache-miss case?
+ // TODO(b/209701268): opt: can't all the following statements be moved
+ // into the state.loadedPackage cache-miss case?
SkyKey packageLookupKey = PackageLookupValue.key(packageId);
PackageLookupValue packageLookupValue;
@@ -515,9 +525,11 @@
// TODO(adonovan): put BUILD compilation from BUILD execution in separate Skyframe functions
// like we do for .bzl files, so that we don't need to recompile BUILD files each time their
// .bzl dependencies change.
- LoadedPackageCacheEntry packageCacheEntry = packageFunctionCache.getIfPresent(packageId);
- if (packageCacheEntry == null) {
- packageCacheEntry =
+
+ State state = (State) skyKeyComputeState;
+ LoadedPackage loadedPackage = state.loadedPackage;
+ if (loadedPackage == null) {
+ loadedPackage =
loadPackage(
workspaceName,
repositoryMapping,
@@ -531,14 +543,15 @@
preludeLabel,
packageLookupValue.getRoot(),
env,
- key);
- if (packageCacheEntry == null) {
+ key,
+ state);
+ if (loadedPackage == null) {
return null; // skyframe restart
}
- packageFunctionCache.put(packageId, packageCacheEntry);
+ state.loadedPackage = loadedPackage;
}
PackageFunctionException pfeFromNonSkyframeGlobbing = null;
- Package.Builder pkgBuilder = packageCacheEntry.builder;
+ Package.Builder pkgBuilder = loadedPackage.builder;
try {
pkgBuilder.buildPartial();
// Since the Skyframe dependencies we request below in
@@ -564,18 +577,15 @@
? Transience.PERSISTENT
: Transience.TRANSIENT);
} catch (InternalInconsistentFilesystemException e) {
- packageFunctionCache.invalidate(packageId);
throw e.throwPackageFunctionException();
}
- Set<SkyKey> globKeys = packageCacheEntry.globDepKeys;
+ Set<SkyKey> globKeys = loadedPackage.globDepKeys;
try {
handleGlobDepsAndPropagateFilesystemExceptions(
packageId, globKeys, env, pkgBuilder.containsErrors());
} catch (InternalInconsistentFilesystemException e) {
- packageFunctionCache.invalidate(packageId);
throw e.throwPackageFunctionException();
} catch (FileSymlinkException e) {
- packageFunctionCache.invalidate(packageId);
String message = "Symlink issue while evaluating globs: " + e.getUserFriendlyMessage();
throw PackageFunctionException.builder()
.setType(PackageFunctionException.Type.NO_SUCH_PACKAGE)
@@ -589,7 +599,6 @@
if (pfeFromNonSkyframeGlobbing != null) {
// Throw before checking for missing values, since this may be our last chance to throw if in
// nokeep-going error bubbling.
- packageFunctionCache.invalidate(packageId);
throw pfeFromNonSkyframeGlobbing;
}
@@ -597,9 +606,6 @@
return null;
}
- // We know this SkyFunction will not be called again, so we can remove the cache entry.
- packageFunctionCache.invalidate(packageId);
-
Package pkg = pkgBuilder.finishBuild();
Event.replayEventsOn(env.getListener(), pkgBuilder.getEvents());
@@ -611,7 +617,7 @@
packageFactory.afterDoneLoadingPackage(
pkg,
starlarkBuiltinsValue.starlarkSemantics,
- packageCacheEntry.loadTimeNanos,
+ loadedPackage.loadTimeNanos,
env.getListener());
} catch (InvalidPackageException e) {
throw new PackageFunctionException(e, Transience.PERSISTENT);
@@ -1224,7 +1230,7 @@
* <p>May return null if the computation has to be restarted.
*/
@Nullable
- private LoadedPackageCacheEntry loadPackage(
+ private LoadedPackage loadPackage(
String workspaceName,
RepositoryMapping repositoryMapping,
ImmutableSet<PathFragment> repositoryIgnoredPatterns,
@@ -1237,7 +1243,8 @@
@Nullable Label preludeLabel,
Root packageRoot,
Environment env,
- SkyKey keyForMetrics)
+ SkyKey keyForMetrics,
+ State state)
throws InterruptedException, PackageFunctionException {
// TODO(adonovan): opt: evaluate splitting this part out as a separate Skyframe
@@ -1254,11 +1261,7 @@
boolean committed = false;
try (SilentCloseable c =
Profiler.instance().profile(ProfilerTask.CREATE_PACKAGE, packageId.toString())) {
- // Using separate get/put operations on this cache is safe because there will
- // never be two concurrent calls for the same packageId. The cache is designed
- // to save work across a sequence of restarted Skyframe PackageFunction invocations
- // for the same key.
- CompiledBuildFile compiled = compiledBuildFileCache.getIfPresent(packageId);
+ CompiledBuildFile compiled = state.compiledBuildFile;
if (compiled == null) {
if (showLoadingProgress.get()) {
env.getListener().handle(Event.progress("Loading package: " + packageId));
@@ -1269,9 +1272,7 @@
if (compiled == null) {
return null; // skyframe restart
}
-
- // Cache this first step so we needn't redo it if .bzl loading fails.
- compiledBuildFileCache.put(packageId, compiled);
+ state.compiledBuildFile = compiled;
}
// ^^ ---- end PackageCompileFunction ---- ^^
@@ -1316,7 +1317,7 @@
// From this point on, no matter whether the function returns
// successfully or throws an exception, there will be no more
- // Skyframe restarts, so we can dispense with the cache entry.
+ // Skyframe restarts.
committed = true;
long startTimeNanos = BlazeClock.nanoTime();
@@ -1376,14 +1377,14 @@
numPackagesLoaded.incrementAndGet();
long loadTimeNanos = Math.max(BlazeClock.nanoTime() - startTimeNanos, 0L);
- return new LoadedPackageCacheEntry(pkgBuilder, globDepKeys, loadTimeNanos);
+ return new LoadedPackage(pkgBuilder, globDepKeys, loadTimeNanos);
} finally {
- // Discard the cache entry and declare completion
- // only if we reached the point of no return.
if (committed) {
- compiledBuildFileCache.invalidate(packageId);
+ // We're done executing the BUILD file. Therefore, we can discard the compiled BUILD file...
+ state.compiledBuildFile = null;
if (packageProgress != null) {
+ // ... and also note that we're done.
packageProgress.doneReadPackage(packageId);
}
}
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 4b3abcf..4f08836 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
@@ -170,7 +170,6 @@
import com.google.devtools.build.lib.skyframe.MetadataConsumerForMetrics.FilesMetricConsumer;
import com.google.devtools.build.lib.skyframe.PackageFunction.ActionOnIOExceptionReadingBuildFile;
import com.google.devtools.build.lib.skyframe.PackageFunction.IncrementalityIntent;
-import com.google.devtools.build.lib.skyframe.PackageFunction.LoadedPackageCacheEntry;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier;
@@ -284,16 +283,6 @@
// target parsing exception.
private static final int EXCEPTION_TRAVERSAL_LIMIT = 10;
- // Cache of partially constructed Package instances, stored between reruns of the PackageFunction
- // (because of missing dependencies, within the same evaluate() run) to avoid loading the same
- // package twice (first time loading to find load()ed bzl files and declare Skyframe
- // dependencies).
- private final Cache<PackageIdentifier, LoadedPackageCacheEntry> packageFunctionCache =
- Caffeine.newBuilder().build();
- // Cache of parsed BUILD files, for PackageFunction. Same motivation as above.
- private final Cache<PackageIdentifier, PackageFunction.CompiledBuildFile> compiledBuildFileCache =
- Caffeine.newBuilder().build();
-
// Cache of parsed bzl files, for use when we're inlining BzlCompileFunction in
// BzlLoadFunction. See the comments in BzlLoadFunction for motivations and details.
private final Cache<BzlCompileValue.Key, BzlCompileValue> bzlCompileCache =
@@ -547,8 +536,6 @@
pkgFactory,
packageManager,
showLoadingProgress,
- packageFunctionCache,
- compiledBuildFileCache,
numPackagesLoaded,
bzlLoadFunctionForInliningPackageAndWorkspaceNodes,
packageProgress,
@@ -1448,8 +1435,6 @@
// Clear internal caches used by SkyFunctions used for package loading. If the SkyFunctions
// never had a chance to restart (e.g. due to user interrupt, or an error in a --nokeep_going
// build), these may have stale entries.
- packageFunctionCache.invalidateAll();
- compiledBuildFileCache.invalidateAll();
bzlCompileCache.invalidateAll();
numPackagesLoaded.set(0);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index 11818be..f8760d0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -15,7 +15,6 @@
import static com.google.common.base.Preconditions.checkState;
-import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
@@ -72,7 +71,6 @@
import com.google.devtools.build.lib.skyframe.PackageFunction;
import com.google.devtools.build.lib.skyframe.PackageFunction.ActionOnIOExceptionReadingBuildFile;
import com.google.devtools.build.lib.skyframe.PackageFunction.IncrementalityIntent;
-import com.google.devtools.build.lib.skyframe.PackageFunction.LoadedPackageCacheEntry;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.PackageValue;
@@ -443,8 +441,6 @@
private ImmutableMap<SkyFunctionName, SkyFunction> makeFreshSkyFunctions() {
AtomicReference<TimestampGranularityMonitor> tsgm =
new AtomicReference<>(new TimestampGranularityMonitor(BlazeClock.instance()));
- Cache<PackageIdentifier, LoadedPackageCacheEntry> packageFunctionCache =
- Caffeine.newBuilder().build();
AtomicReference<FilesystemCalls> syscallCacheRef =
new AtomicReference<>(
PerBuildSyscallCache.newBuilder()
@@ -513,8 +509,6 @@
pkgFactory,
cachingPackageLocator,
/*showLoadingProgress=*/ new AtomicBoolean(false),
- packageFunctionCache,
- /*compiledBuildFileCache=*/ Caffeine.newBuilder().build(),
/*numPackagesLoaded=*/ new AtomicInteger(0),
/*bzlLoadFunctionForInlining=*/ null,
/*packageProgress=*/ null,
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
index 9b40ace..627d621 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/BzlmodRepoRuleFunctionTest.java
@@ -148,8 +148,6 @@
/*packageFactory=*/ null,
/*pkgLocator=*/ null,
/*showLoadingProgress=*/ null,
- /*packageFunctionCache=*/ null,
- /*compiledBuildFileCache=*/ null,
/*numPackagesLoaded=*/ null,
/*bzlLoadFunctionForInlining=*/ null,
/*packageProgress=*/ null,
diff --git a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
index aa72101..84659c6 100644
--- a/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/bazel/bzlmod/ModuleExtensionResolutionTest.java
@@ -178,8 +178,6 @@
/*packageFactory=*/ null,
/*pkgLocator=*/ null,
/*showLoadingProgress=*/ null,
- /*packageFunctionCache=*/ null,
- /*compiledBuildFileCache=*/ null,
/*numPackagesLoaded=*/ null,
/*bzlLoadFunctionForInlining=*/ null,
/*packageProgress=*/ null,
diff --git a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
index 949959c..2ea1058 100644
--- a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
+++ b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageHelperTest.java
@@ -162,8 +162,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException.INSTANCE,
PackageFunction.IncrementalityIntent.INCREMENTAL,
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index 094689a2..8b59dc2 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -192,8 +192,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException
.INSTANCE,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
index 5d0f271..648b3d3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
@@ -119,8 +119,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException
.INSTANCE,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 4092351..c05f551 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -119,8 +119,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException.INSTANCE,
PackageFunction.IncrementalityIntent.INCREMENTAL,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index dc3f06a..77ad3f3 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -187,8 +187,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException
.INSTANCE,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 0689a2b..fb7fc00 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -156,8 +156,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException.INSTANCE,
PackageFunction.IncrementalityIntent.INCREMENTAL,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index c959539..d7c0550 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -182,18 +182,21 @@
return value.getPackage();
}
+ private Exception evaluatePackageToException(String pkg) throws Exception {
+ return evaluatePackageToException(pkg, /*keepGoing=*/ false);
+ }
+
/**
* Helper that evaluates the given package and returns the expected exception.
*
* <p>Disables the failFastHandler as a side-effect.
*/
- private Exception evaluatePackageToException(String pkg) throws Exception {
+ private Exception evaluatePackageToException(String pkg, boolean keepGoing) throws Exception {
reporter.removeHandler(failFastHandler);
SkyKey skyKey = PackageValue.key(PackageIdentifier.parse(pkg));
EvaluationResult<PackageValue> result =
- SkyframeExecutorTestUtils.evaluate(
- getSkyframeExecutor(), skyKey, /*keepGoing=*/ false, reporter);
+ SkyframeExecutorTestUtils.evaluate(getSkyframeExecutor(), skyKey, keepGoing, reporter);
assertThat(result.hasError()).isTrue();
return result.getError(skyKey).getException();
}
@@ -401,7 +404,18 @@
scratch.file("foo/bar/baz.sh");
fs.scheduleMakeUnreadableAfterReaddir(barDir);
- Exception ex = evaluatePackageToException("@//foo");
+ Exception ex =
+ evaluatePackageToException(
+ "@//foo",
+ // Use --keep_going, not --nokeep_going, semantics so as to exercise the situation we
+ // want to exercise.
+ //
+ // In --nokeep_going semantics, the GlobValue node's error would halt normal evaluation
+ // and trigger error bubbling. Then, during error bubbling we would freshly compute the
+ // PackageValue node again, meaning we would do non-Skyframe globbing except this time
+ // non-Skyframe globbing would encounter the io error, meaning there actually wouldn't
+ // be a discrepancy.
+ /*keepGoing=*/ true);
String msg = ex.getMessage();
assertThat(msg).contains("Inconsistent filesystem operations");
assertThat(msg).contains("Encountered error '/workspace/foo/bar (Permission denied)'");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index c4a0baa..baca435 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -127,8 +127,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException.INSTANCE,
PackageFunction.IncrementalityIntent.INCREMENTAL,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index 7d4752b..3f35d57 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -174,8 +174,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException.INSTANCE,
PackageFunction.IncrementalityIntent.INCREMENTAL,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index a96156f..a8a5cf9 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -286,8 +286,6 @@
null,
null,
null,
- null,
- null,
/*packageProgress=*/ null,
PackageFunction.ActionOnIOExceptionReadingBuildFile.UseOriginalIOException
.INSTANCE,