Remove the boolean `keepEdges` field from `InMemoryGraphImpl`.
It is somewhat confusing that a subclass can override `newNodeEntry()`, rendering the value passed to `keepEdges` irrelevant.
PiperOrigin-RevId: 417829239
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
index e4e423e..1eafcdd 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraph.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.skyframe;
import com.google.common.collect.Maps;
+import com.google.devtools.build.skyframe.InMemoryGraphImpl.EdgelessInMemoryGraphImpl;
import java.util.Collections;
import java.util.Map;
import java.util.Objects;
@@ -22,6 +23,20 @@
/** {@link ProcessableGraph} that exposes the contents of the entire graph. */
public interface InMemoryGraph extends ProcessableGraph {
+
+ /** Creates a new in-memory graph suitable for incremental builds. */
+ static InMemoryGraph create() {
+ return new InMemoryGraphImpl();
+ }
+
+ /**
+ * Creates a new in-memory graph that discards graph edges to save memory and cannot be used for
+ * incremental builds.
+ */
+ static InMemoryGraph createEdgeless() {
+ return new EdgelessInMemoryGraphImpl();
+ }
+
@Override
Map<SkyKey, ? extends NodeEntry> createIfAbsentBatch(
@Nullable SkyKey requestor, Reason reason, Iterable<SkyKey> keys);
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
index b6b0fcb..7ea56bd 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryGraphImpl.java
@@ -13,10 +13,10 @@
// limitations under the License.
package com.google.devtools.build.skyframe;
-import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.Iterables;
import com.google.common.collect.Maps;
import com.google.devtools.build.lib.collect.compacthashmap.CompactHashMap;
+import com.google.errorprone.annotations.ForOverride;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -32,20 +32,14 @@
* <p>This class is public only for use in alternative graph implementations.
*/
public class InMemoryGraphImpl implements InMemoryGraph {
+
protected final ConcurrentHashMap<SkyKey, InMemoryNodeEntry> nodeMap;
- private final boolean keepEdges;
- @VisibleForTesting
- public InMemoryGraphImpl() {
- this(/*keepEdges=*/ true);
+ InMemoryGraphImpl() {
+ this(/*initialCapacity=*/ 1 << 10);
}
- public InMemoryGraphImpl(boolean keepEdges) {
- this(keepEdges, /*initialCapacity=*/ 1 << 10);
- }
-
- protected InMemoryGraphImpl(boolean keepEdges, int initialCapacity) {
- this.keepEdges = keepEdges;
+ protected InMemoryGraphImpl(int initialCapacity) {
this.nodeMap = new ConcurrentHashMap<>(initialCapacity);
}
@@ -74,8 +68,9 @@
return result;
}
+ @ForOverride
protected InMemoryNodeEntry newNodeEntry(SkyKey key) {
- return keepEdges ? new InMemoryNodeEntry() : new EdgelessInMemoryNodeEntry();
+ return new InMemoryNodeEntry();
}
/**
@@ -114,4 +109,11 @@
public ConcurrentHashMap<SkyKey, InMemoryNodeEntry> getAllValuesMutable() {
return nodeMap;
}
+
+ static final class EdgelessInMemoryGraphImpl extends InMemoryGraphImpl {
+ @Override
+ protected InMemoryNodeEntry newNodeEntry(SkyKey key) {
+ return new EdgelessInMemoryNodeEntry();
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
index 5798910..0526095 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -112,7 +112,7 @@
this.progressReceiver = new DirtyTrackingProgressReceiver(progressReceiver);
this.graphInconsistencyReceiver = Preconditions.checkNotNull(graphInconsistencyReceiver);
this.eventFilter = eventFilter;
- this.graph = new InMemoryGraphImpl(keepEdges);
+ this.graph = keepEdges ? InMemoryGraph.create() : InMemoryGraph.createEdgeless();
this.emittedEventState = emittedEventState;
this.keepEdges = keepEdges;
}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index 434f6ed..2d99f0f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -126,7 +126,6 @@
import com.google.devtools.build.skyframe.EvaluationContext;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.InMemoryGraph;
-import com.google.devtools.build.skyframe.InMemoryGraphImpl;
import com.google.devtools.build.skyframe.InMemoryNodeEntry;
import com.google.devtools.build.skyframe.MemoizingEvaluator.GraphTransformerForTesting;
import com.google.devtools.build.skyframe.NotifyingHelper;
@@ -363,7 +362,7 @@
return new GraphTransformerForTesting() {
@Override
public InMemoryGraph transform(InMemoryGraph graph) {
- InMemoryGraph transformed = new InMemoryGraphImpl();
+ InMemoryGraph transformed = InMemoryGraph.create();
transformed
.getAllValuesMutable()
.putAll(Maps.transformValues(values, this::createNodeEntry));
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index bc33f88..1d20c0d 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -795,12 +795,12 @@
throws Exception {
Assume.assumeTrue(keepGoing || keepEdges);
- graph = new InMemoryGraphImpl(keepEdges);
+ graph = keepEdges ? InMemoryGraph.create() : InMemoryGraph.createEdgeless();
SkyKey catastropheKey = GraphTester.toSkyKey("catastrophe");
SkyKey otherKey = GraphTester.toSkyKey("someKey");
- final Exception catastrophe = new SomeErrorException("bad");
+ Exception catastrophe = new SomeErrorException("bad");
tester
.getOrCreate(catastropheKey)
.setBuilder(