Manage discarding of deps and rdeps from `InMemoryNodeEntry` based on the node's `KeepEdgesPolicy` instead of leaving it to an overridable method `postProcessAfterDone`.
Additionally, use the node's `KeepEdgesPolicy` to determine which rdep operation to store bare. This opens up the opportunity for an optimization in `ReverseDepsUtility` - for nodes on their initial build and nodes that do not keep rdeps, we can build one set instead of two because all rdeps are new.
PiperOrigin-RevId: 415541716
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 7084da7..a2efa1d 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java
@@ -22,7 +22,6 @@
import com.google.devtools.build.lib.util.GroupedList;
import com.google.devtools.build.lib.util.GroupedList.GroupedListHelper;
import com.google.devtools.build.skyframe.KeyToConsolidate.Op;
-import com.google.devtools.build.skyframe.KeyToConsolidate.OpToStoreBare;
import com.google.errorprone.annotations.ForOverride;
import java.util.ArrayList;
import java.util.Collection;
@@ -253,21 +252,16 @@
}
protected final synchronized Set<SkyKey> setStateFinishedAndReturnReverseDepsToSignal() {
- Set<SkyKey> reverseDepsToSignal =
- ReverseDepsUtility.consolidateDataAndReturnNewElements(this, getOpToStoreBare());
- this.directDeps = getTemporaryDirectDeps().compress();
-
+ Set<SkyKey> reverseDepsToSignal = ReverseDepsUtility.consolidateDataAndReturnNewElements(this);
+ directDeps = keepEdges() == KeepEdgesPolicy.NONE ? null : getTemporaryDirectDeps().compress();
markDone();
- postProcessAfterDone();
return reverseDepsToSignal;
}
- protected void postProcessAfterDone() {}
-
@Override
public synchronized Set<SkyKey> getInProgressReverseDeps() {
Preconditions.checkState(!isDone(), this);
- return ReverseDepsUtility.returnNewElements(this, getOpToStoreBare());
+ return ReverseDepsUtility.returnNewElements(this);
}
/**
@@ -312,6 +306,9 @@
synchronized (this) {
boolean done = isDone();
+ if (!done && dirtyBuildingState == null) {
+ dirtyBuildingState = DirtyBuildingState.createNew();
+ }
if (reverseDep != null) {
if (done) {
if (keepReverseDeps()) {
@@ -324,9 +321,6 @@
if (done) {
return DependencyState.DONE;
}
- if (dirtyBuildingState == null) {
- dirtyBuildingState = DirtyBuildingState.createNew();
- }
boolean wasEvaluating = dirtyBuildingState.isEvaluating();
if (!wasEvaluating) {
dirtyBuildingState.startEvaluating();
@@ -366,18 +360,7 @@
}
Preconditions.checkState(
isDirty() || op != Op.CHECK, "Not dirty check %s %s", this, reverseDep);
- reverseDepsDataToConsolidate.add(KeyToConsolidate.create(reverseDep, op, getOpToStoreBare()));
- }
-
- /**
- * In order to reduce memory consumption, we want to store reverse deps 'bare', i.e., without
- * wrapping them in a KeyToConsolidate object. To that end, we define a bare op that is used for
- * both storing and retrieving the deps. This method returns said op, and may adjust it depending
- * on whether this is a new node entry (where all deps must be new) or an existing node entry
- * (which most likely checks deps rather than adding new deps).
- */
- protected OpToStoreBare getOpToStoreBare() {
- return isDirty() && dirtyBuildingState.isDirty() ? OpToStoreBare.CHECK : OpToStoreBare.ADD;
+ reverseDepsDataToConsolidate.add(KeyToConsolidate.create(reverseDep, op, this));
}
@Override
@@ -437,7 +420,7 @@
if (!isDone()) {
// This consolidation loses information about pending reverse deps to signal, but that is
// unimportant since this node is being deleted.
- ReverseDepsUtility.consolidateDataAndReturnNewElements(this, getOpToStoreBare());
+ ReverseDepsUtility.consolidateDataAndReturnNewElements(this);
}
return ReverseDepsUtility.getReverseDeps(this, /*checkConsistency=*/ false);
}