Internal changes. PiperOrigin-RevId: 561629754 Change-Id: I40f0c94354ebb7f94f54801df3e494240f7c5c07
diff --git a/src/main/java/com/google/devtools/build/skyframe/AbstractIncrementalInMemoryMemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/AbstractIncrementalInMemoryMemoizingEvaluator.java index 68106c6..0e1d918 100644 --- a/src/main/java/com/google/devtools/build/skyframe/AbstractIncrementalInMemoryMemoizingEvaluator.java +++ b/src/main/java/com/google/devtools/build/skyframe/AbstractIncrementalInMemoryMemoizingEvaluator.java
@@ -15,13 +15,18 @@ import static com.google.common.base.Preconditions.checkNotNull; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; +import com.google.common.collect.Sets; +import com.google.devtools.build.lib.profiler.AutoProfiler; +import com.google.devtools.build.lib.profiler.GoogleAutoProfilerUtils; import com.google.devtools.build.skyframe.Differencer.DiffWithDelta.Delta; import com.google.devtools.build.skyframe.InvalidatingNodeVisitor.DeletingInvalidationState; import com.google.devtools.build.skyframe.InvalidatingNodeVisitor.DirtyingInvalidationState; import com.google.devtools.build.skyframe.InvalidatingNodeVisitor.InvalidationState; import com.google.devtools.build.skyframe.QueryableGraph.Reason; +import java.time.Duration; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashSet; @@ -29,6 +34,7 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Set; +import java.util.function.Predicate; import javax.annotation.Nullable; /** @@ -37,6 +43,7 @@ */ public abstract class AbstractIncrementalInMemoryMemoizingEvaluator extends AbstractInMemoryMemoizingEvaluator { + private static final Duration MIN_TIME_TO_LOG_DELETION = Duration.ofMillis(10); protected final ImmutableMap<SkyFunctionName, SkyFunction> skyFunctions; protected final DirtyTrackingProgressReceiver progressReceiver; @@ -82,6 +89,37 @@ this.keepEdges = keepEdges; } + @Override + public void delete(Predicate<SkyKey> deletePredicate) { + try (AutoProfiler ignored = + GoogleAutoProfilerUtils.logged("deletion marking", MIN_TIME_TO_LOG_DELETION)) { + Set<SkyKey> toDelete = Sets.newConcurrentHashSet(); + getInMemoryGraph() + .parallelForEach( + e -> { + if (e.isDirty() || deletePredicate.test(e.getKey())) { + toDelete.add(e.getKey()); + } + }); + valuesToDelete.addAll(toDelete); + } + } + + @Override + public void deleteDirty(long versionAgeLimit) { + Preconditions.checkArgument(versionAgeLimit >= 0, versionAgeLimit); + Version threshold = IntVersion.of(lastGraphVersion.getVal() - versionAgeLimit); + valuesToDelete.addAll( + Sets.filter( + progressReceiver.getUnenqueuedDirtyKeys(), + skyKey -> { + NodeEntry entry = getInMemoryGraph().get(null, Reason.OTHER, skyKey); + Preconditions.checkNotNull(entry, skyKey); + Preconditions.checkState(entry.isDirty(), skyKey); + return entry.getVersion().atMost(threshold); + })); + } + protected void invalidate(Iterable<SkyKey> diff) { Iterables.addAll(valuesToDirty, diff); }
diff --git a/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java b/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java index bfecc42..62fe1bf 100644 --- a/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java +++ b/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java
@@ -141,12 +141,11 @@ } /** - * Returns the set of all dirty keys that have not been enqueued. - * This is useful for garbage collection, where we would not want to remove dirty nodes that are - * needed for evaluation (in the downward transitive closure of the set of the evaluation's - * top level nodes). + * Returns the set of all dirty keys that have not been enqueued. This is useful for garbage + * collection, where we would not want to remove dirty nodes that are needed for evaluation (in + * the downward transitive closure of the set of the evaluation's top level nodes). */ - protected Set<SkyKey> getUnenqueuedDirtyKeys(){ + protected Set<SkyKey> getUnenqueuedDirtyKeys() { return ImmutableSet.copyOf(dirtyKeys); }
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 e3ee976..2f3e8ed 100644 --- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java +++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -15,20 +15,13 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Sets; import com.google.devtools.build.lib.concurrent.AbstractQueueVisitor; import com.google.devtools.build.lib.events.ExtendedEventHandler; -import com.google.devtools.build.lib.profiler.AutoProfiler; -import com.google.devtools.build.lib.profiler.GoogleAutoProfilerUtils; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.profiler.SilentCloseable; import com.google.devtools.build.skyframe.Differencer.Diff; -import com.google.devtools.build.skyframe.QueryableGraph.Reason; -import java.time.Duration; import java.util.Map; -import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Predicate; import javax.annotation.Nullable; /** @@ -90,38 +83,6 @@ : InMemoryGraph.createEdgeless(usePooledInterning); } - private static final Duration MIN_TIME_TO_LOG_DELETION = Duration.ofMillis(10); - - @Override - public void delete(Predicate<SkyKey> deletePredicate) { - try (AutoProfiler ignored = - GoogleAutoProfilerUtils.logged("deletion marking", MIN_TIME_TO_LOG_DELETION)) { - Set<SkyKey> toDelete = Sets.newConcurrentHashSet(); - graph.parallelForEach( - e -> { - if (e.isDirty() || deletePredicate.test(e.getKey())) { - toDelete.add(e.getKey()); - } - }); - valuesToDelete.addAll(toDelete); - } - } - - @Override - public void deleteDirty(long versionAgeLimit) { - Preconditions.checkArgument(versionAgeLimit >= 0, versionAgeLimit); - Version threshold = IntVersion.of(lastGraphVersion.getVal() - versionAgeLimit); - valuesToDelete.addAll( - Sets.filter( - progressReceiver.getUnenqueuedDirtyKeys(), - skyKey -> { - NodeEntry entry = graph.get(null, Reason.OTHER, skyKey); - Preconditions.checkNotNull(entry, skyKey); - Preconditions.checkState(entry.isDirty(), skyKey); - return entry.getVersion().atMost(threshold); - })); - } - @Override public <T extends SkyValue> EvaluationResult<T> evaluate( Iterable<? extends SkyKey> roots, EvaluationContext evaluationContext)
diff --git a/src/main/java/com/google/devtools/build/skyframe/IntVersion.java b/src/main/java/com/google/devtools/build/skyframe/IntVersion.java index 71e4cfe..5265ace 100644 --- a/src/main/java/com/google/devtools/build/skyframe/IntVersion.java +++ b/src/main/java/com/google/devtools/build/skyframe/IntVersion.java
@@ -31,7 +31,8 @@ this.val = val; } - long getVal() { + /** Returns the integer value as a long. */ + public long getVal() { return val; }
diff --git a/src/test/java/com/google/devtools/build/skyframe/NotifyingHelper.java b/src/test/java/com/google/devtools/build/skyframe/NotifyingHelper.java index 263071d..6c4e3a4 100644 --- a/src/test/java/com/google/devtools/build/skyframe/NotifyingHelper.java +++ b/src/test/java/com/google/devtools/build/skyframe/NotifyingHelper.java
@@ -197,11 +197,11 @@ } /** {@link NodeEntry} that informs a {@link Listener} of various method calls. */ - class NotifyingNodeEntry extends DelegatingNodeEntry { + public class NotifyingNodeEntry extends DelegatingNodeEntry { private final SkyKey myKey; private final NodeEntry delegate; - NotifyingNodeEntry(SkyKey key, NodeEntry delegate) { + protected NotifyingNodeEntry(SkyKey key, NodeEntry delegate) { myKey = key; this.delegate = delegate; }