Skip to content

Conversation

@bazel-io
Copy link
Member

All the values have to be checked for nullness individually.

Fixes the following two NPEs:

  1. refactor: Remove next batch of WORKSPACE content bazel-contrib/rules_go#4531 (comment)
java.lang.NullPointerException: Cannot invoke "com.google.devtools.build.lib.skyframe.PackageValue.getPackage()" because the return value of "com.google.devtools.build.skyframe.SkyframeLookupResult.getOrThrow(com.google.devtools.build.skyframe.SkyKey, java.lang.Class)" is null
	at com.google.devtools.build.lib.skyframe.TestExpansionFunction.getPrerequisites(TestExpansionFunction.java:169)
	at com.google.devtools.build.lib.skyframe.TestExpansionFunction.computeExpandedTests(TestExpansionFunction.java:85)
...
  1. Crash while DirectoryTreeDigestFunction.getSubDirTreeDigests #27942
java.lang.NullPointerException
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
	at com.google.devtools.build.lib.skyframe.DirectoryTreeDigestFunction.getSubDirTreeDigests(DirectoryTreeDigestFunction.java:140)
	at com.google.devtools.build.lib.skyframe.DirectoryTreeDigestFunction.compute(DirectoryTreeDigestFunction.java:65)

Speculative fix for #27942

Closes #27959.

PiperOrigin-RevId: 843808256
Change-Id: I012756ec8a641c68bca31fe155d230caa00d8a3f

Commit 1025821

All the values have to be checked for nullness individually.

Fixes the following two NPEs:
1. bazel-contrib/rules_go#4531 (comment)
```
java.lang.NullPointerException: Cannot invoke "com.google.devtools.build.lib.skyframe.PackageValue.getPackage()" because the return value of "com.google.devtools.build.skyframe.SkyframeLookupResult.getOrThrow(com.google.devtools.build.skyframe.SkyKey, java.lang.Class)" is null
	at com.google.devtools.build.lib.skyframe.TestExpansionFunction.getPrerequisites(TestExpansionFunction.java:169)
	at com.google.devtools.build.lib.skyframe.TestExpansionFunction.computeExpandedTests(TestExpansionFunction.java:85)
...
```
2. bazelbuild#27942
```
java.lang.NullPointerException
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source)
	at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)
	at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source)
	at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)
	at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source)
	at com.google.devtools.build.lib.skyframe.DirectoryTreeDigestFunction.getSubDirTreeDigests(DirectoryTreeDigestFunction.java:140)
	at com.google.devtools.build.lib.skyframe.DirectoryTreeDigestFunction.compute(DirectoryTreeDigestFunction.java:65)
```

Speculative fix for bazelbuild#27942

Closes bazelbuild#27959.

PiperOrigin-RevId: 843808256
Change-Id: I012756ec8a641c68bca31fe155d230caa00d8a3f
@bazel-io bazel-io added the awaiting-review PR is awaiting review from an assigned reviewer label Dec 12, 2025
@bazel-io bazel-io requested a review from a team as a code owner December 12, 2025 21:18
@bazel-io bazel-io added the awaiting-review PR is awaiting review from an assigned reviewer label Dec 12, 2025
Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request correctly fixes two NullPointerExceptions by adding necessary null checks when handling SkyframeLookupResult. The changes in DirectoryTreeDigestFunction and TestExpansionFunction are correct and prevent the reported crashes. I've included a suggestion to improve performance in DirectoryTreeDigestFunction by refactoring to a single loop.

Comment on lines +133 to +141
if (env.valuesMissing()
|| dirTreeDigestValueKeys.stream().map(result::get).anyMatch(Objects::isNull)) {
return null;
}
return dirTreeDigests;
return dirTreeDigestValueKeys.stream()
.map(result::get)
.map(DirectoryTreeDigestValue.class::cast)
.map(DirectoryTreeDigestValue::hexDigest)
.collect(toImmutableList());

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

This implementation iterates over dirTreeDigestValueKeys twice: once to check for nulls and a second time to collect the digests. This can be inefficient if the collection is large. This can be refactored into a single loop to improve performance and readability.

Suggested change
if (env.valuesMissing()
|| dirTreeDigestValueKeys.stream().map(result::get).anyMatch(Objects::isNull)) {
return null;
}
return dirTreeDigests;
return dirTreeDigestValueKeys.stream()
.map(result::get)
.map(DirectoryTreeDigestValue.class::cast)
.map(DirectoryTreeDigestValue::hexDigest)
.collect(toImmutableList());
if (env.valuesMissing()) {
return null;
}
ImmutableList.Builder<String> digests =
ImmutableList.builderWithExpectedSize(dirTreeDigestValueKeys.size());
for (SkyKey key : dirTreeDigestValueKeys) {
var value = (DirectoryTreeDigestValue) result.get(key);
if (value == null) {
// A dependency might be missing even if env.valuesMissing() is false. This can happen, for
// example, when the dependency is in error and --nokeep_going is not used.
return null;
}
digests.add(value.hexDigest());
}
return digests.build();

@Wyverald Wyverald added this pull request to the merge queue Dec 12, 2025
Merged via the queue into bazelbuild:release-9.0.0 with commit 537e321 Dec 12, 2025
46 checks passed
@github-actions github-actions bot removed the awaiting-review PR is awaiting review from an assigned reviewer label Dec 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants