Enable rewinding for edgeless node entries.
PiperOrigin-RevId: 324925689
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
index dbf6bb1..2c6fd0c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
@@ -501,17 +501,26 @@
return DirtyBuildingState.create(dirtyType, directDeps, value);
}
+ private static final GroupedList<SkyKey> EMPTY_LIST = new GroupedList<>();
+
@Override
public synchronized MarkedDirtyResult markDirty(DirtyType dirtyType) {
- // Can't process a dirty node without its deps.
- assertKeepDeps();
+ if (!DirtyType.FORCE_REBUILD.equals(dirtyType)) {
+ // A node can't be found to be dirty without deps unless it's force-rebuilt.
+ assertKeepDeps();
+ }
if (isDone()) {
- dirtyBuildingState =
- createDirtyBuildingStateForDoneNode(
- dirtyType, GroupedList.create(getCompressedDirectDepsForDoneEntry()), value);
+ GroupedList<SkyKey> directDeps =
+ KeepEdgesPolicy.NONE.equals(keepEdges())
+ ? EMPTY_LIST
+ : GroupedList.create(getCompressedDirectDepsForDoneEntry());
+ dirtyBuildingState = createDirtyBuildingStateForDoneNode(dirtyType, directDeps, value);
value = null;
- directDeps = null;
- return new MarkedDirtyResult(ReverseDepsUtility.getReverseDeps(this));
+ this.directDeps = null;
+ return new MarkedDirtyResult(
+ KeepEdgesPolicy.ALL.equals(keepEdges())
+ ? ReverseDepsUtility.getReverseDeps(this)
+ : ImmutableList.of());
}
if (dirtyType.equals(DirtyType.FORCE_REBUILD)) {
if (dirtyBuildingState != null) {