Custom-serialize derived artifacts. This allows us to intern them more efficiently.

Also simplify ArtifactFactory handling in SkyframeExecutor: the ArtifactFactory is set at construction time, so there's no need to mess around with suppliers.

PiperOrigin-RevId: 315383662
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
index 1349c71..93a23c1 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/Artifact.java
@@ -24,7 +24,6 @@
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Interner;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Streams;
 import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType;
@@ -34,7 +33,6 @@
 import com.google.devtools.build.lib.cmdline.LabelConstants;
 import com.google.devtools.build.lib.collect.nestedset.Depset;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.concurrent.BlazeInterners;
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.skyframe.SkyFunctions;
@@ -326,10 +324,7 @@
   }
 
   /** An artifact corresponding to a file in the output tree, generated by an {@link Action}. */
-  @AutoCodec
   public static class DerivedArtifact extends Artifact {
-    /** Only used for deserializing artifacts. */
-    private static final Interner<DerivedArtifact> INTERNER = BlazeInterners.newWeakInterner();
 
     /**
      * An {@link ActionLookupKey} until {@link #setGeneratingActionKey} is set, at which point it is
@@ -417,16 +412,48 @@
       }
       return this.owner.equals(that.owner);
     }
+  }
 
-    /**
-     * The {@code rootRelativePath is a few characters shorter than the {@code execPath}, so we save
-     * a few bytes by serializing it rather than the {@code execPath}, especially when the {@code
-     * root} is common to many artifacts and therefore memoized.
-     */
-    @AutoCodec.VisibleForSerialization
-    @AutoCodec.Instantiator
-    static DerivedArtifact createForSerialization(
-        ArtifactRoot root, PathFragment rootRelativePath, ActionLookupData generatingActionKey) {
+  @SuppressWarnings("unused") // Codec used by reflection.
+  private static class DerivedArtifactCodec implements ObjectCodec<DerivedArtifact> {
+    @Override
+    public Class<DerivedArtifact> getEncodedClass() {
+      return DerivedArtifact.class;
+    }
+
+    @Override
+    public void serialize(
+        SerializationContext context, DerivedArtifact obj, CodedOutputStream codedOut)
+        throws SerializationException, IOException {
+      context.serialize(obj.getRoot(), codedOut);
+      context.serialize(obj.getGeneratingActionKey(), codedOut);
+      context.serialize(obj.getRootRelativePath(), codedOut);
+    }
+
+    @Override
+    public DerivedArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
+        throws SerializationException, IOException {
+      ArtifactRoot root = context.deserialize(codedIn);
+      ActionLookupData generatingActionKey = context.deserialize(codedIn);
+      DerivedArtifact artifact =
+          new DerivedArtifact(
+              root,
+              validateAndGetRootExecPath(root, generatingActionKey, context, codedIn),
+              generatingActionKey.getActionLookupKey(),
+              /*contentBasedPath=*/ false);
+      artifact.setGeneratingActionKey(generatingActionKey);
+      return context
+          .getDependency(ArtifactResolver.ArtifactResolverSupplier.class)
+          .intern(artifact);
+    }
+
+    static PathFragment validateAndGetRootExecPath(
+        ArtifactRoot root,
+        ActionLookupData generatingActionKey,
+        DeserializationContext context,
+        CodedInputStream codedIn)
+        throws IOException, SerializationException {
+      PathFragment rootRelativePath = context.deserialize(codedIn);
       if (rootRelativePath == null
           || rootRelativePath.isAbsolute() != root.getRoot().isAbsolute()) {
         throw new IllegalArgumentException(
@@ -439,15 +466,7 @@
       }
       Preconditions.checkState(
           !root.isSourceRoot(), "Root not derived: %s %s", root, rootRelativePath);
-      PathFragment rootExecPath = root.getExecPath();
-      DerivedArtifact artifact =
-          new DerivedArtifact(
-              root,
-              rootExecPath.getRelative(rootRelativePath),
-              generatingActionKey.getActionLookupKey(),
-              /*contentBasedPath=*/ false);
-      artifact.setGeneratingActionKey(generatingActionKey);
-      return INTERNER.intern(artifact);
+      return root.getExecPath().getRelative(rootRelativePath);
     }
   }
 
@@ -729,7 +748,6 @@
    * having to keep around the attribute for the rest we save some memory.
    */
   @Immutable
-  @AutoCodec
   public static final class SpecialArtifact extends DerivedArtifact {
     private final SpecialArtifactType type;
 
@@ -740,19 +758,6 @@
       this.type = type;
     }
 
-    @AutoCodec.VisibleForSerialization
-    @AutoCodec.Instantiator
-    static SpecialArtifact create(
-        ArtifactRoot root,
-        PathFragment execPath,
-        SpecialArtifactType type,
-        ActionLookupData generatingActionKey) {
-      SpecialArtifact result =
-          new SpecialArtifact(root, execPath, generatingActionKey.getActionLookupKey(), type);
-      result.setGeneratingActionKey(generatingActionKey);
-      return result;
-    }
-
     @Override
     public final boolean isFileset() {
       return type == SpecialArtifactType.FILESET;
@@ -796,6 +801,43 @@
     }
   }
 
+  // Keep in sync with DerivedArtifactCodec.
+  @SuppressWarnings("unused") // Used by reflection
+  private static class SpecialArtifactCodec implements ObjectCodec<SpecialArtifact> {
+    @Override
+    public Class<SpecialArtifact> getEncodedClass() {
+      return SpecialArtifact.class;
+    }
+
+    @Override
+    public void serialize(
+        SerializationContext context, SpecialArtifact obj, CodedOutputStream codedOut)
+        throws SerializationException, IOException {
+      context.serialize(obj.getRoot(), codedOut);
+      context.serialize(obj.getGeneratingActionKey(), codedOut);
+      context.serialize(obj.type, codedOut);
+      context.serialize(obj.getRootRelativePath(), codedOut);
+    }
+
+    @Override
+    public SpecialArtifact deserialize(DeserializationContext context, CodedInputStream codedIn)
+        throws SerializationException, IOException {
+      ArtifactRoot root = context.deserialize(codedIn);
+      ActionLookupData generatingActionKey = context.deserialize(codedIn);
+      SpecialArtifactType type = context.deserialize(codedIn);
+      SpecialArtifact artifact =
+          new SpecialArtifact(
+              root,
+              DerivedArtifactCodec.validateAndGetRootExecPath(
+                  root, generatingActionKey, context, codedIn),
+              generatingActionKey.getActionLookupKey(),
+              type);
+      artifact.setGeneratingActionKey(generatingActionKey);
+      return (SpecialArtifact)
+          context.getDependency(ArtifactResolverSupplier.class).intern(artifact);
+    }
+  }
+
   /**
    * A special kind of artifact that represents a concrete file created at execution time under its
    * associated parent TreeArtifact.
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java
index 0b02f9c..1d98fc1 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactResolver.java
@@ -82,9 +82,8 @@
 
   Path getPathFromSourceExecPath(Path execRoot, PathFragment execPath);
 
-  /**
-   * Supplies an {@link ArtifactFactory}. We define a custom interface because parameterized types
-   * are not allowed as dependencies to serialization.
-   */
-  interface ArtifactResolverSupplier extends Supplier<ArtifactResolver> {}
+  /** Supplies an {@link ArtifactFactory} and allows for interning of derived artifacts. */
+  interface ArtifactResolverSupplier extends Supplier<ArtifactResolver> {
+    Artifact.DerivedArtifact intern(Artifact.DerivedArtifact original);
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
index b097fe1..e332661 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
@@ -165,7 +165,8 @@
    * <p>Primarily needed by {@link FilesystemValueChecker}. Also called by {@link ArtifactFunction}
    * when aggregating a {@link TreeArtifactValue} out of action template expansion outputs.
    */
-  ImmutableMap<Artifact, FileArtifactValue> getAllFileValues() {
+  // Visible only for testing: should be package-private.
+  public ImmutableMap<Artifact, FileArtifactValue> getAllFileValues() {
     return artifactData;
   }
 
@@ -174,7 +175,8 @@
    *
    * <p>Should only be needed by {@link FilesystemValueChecker}.
    */
-  ImmutableMap<Artifact, TreeArtifactValue> getAllTreeArtifactValues() {
+  // Visible only for testing: should be package-private.
+  public ImmutableMap<Artifact, TreeArtifactValue> getAllTreeArtifactValues() {
     return treeArtifactData;
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
index 4ed31ee..221e973 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionFunction.java
@@ -14,14 +14,11 @@
 package com.google.devtools.build.lib.skyframe;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Supplier;
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.ActionKeyContext;
 import com.google.devtools.build.lib.actions.Actions;
 import com.google.devtools.build.lib.actions.Actions.GeneratingActions;
-import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
-import com.google.devtools.build.lib.actions.ArtifactRoot;
 import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection;
 import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
@@ -32,7 +29,6 @@
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.skyframe.BuildInfoCollectionValue.BuildInfoKeyAndConfig;
 import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed;
-import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
@@ -48,11 +44,9 @@
       new Precomputed<>("build_info_factories");
 
   private final ActionKeyContext actionKeyContext;
-  // Supplier only because the artifact factory has not yet been created at constructor time.
-  private final Supplier<ArtifactFactory> artifactFactory;
+  private final ArtifactFactory artifactFactory;
 
-  BuildInfoCollectionFunction(
-      ActionKeyContext actionKeyContext, Supplier<ArtifactFactory> artifactFactory) {
+  BuildInfoCollectionFunction(ActionKeyContext actionKeyContext, ArtifactFactory artifactFactory) {
     this.actionKeyContext = actionKeyContext;
     this.artifactFactory = artifactFactory;
   }
@@ -81,17 +75,11 @@
     BuildInfoFactory buildInfoFactory = buildInfoFactories.get(keyAndConfig.getInfoKey());
     Preconditions.checkState(buildInfoFactory.isEnabled(config));
 
-    final ArtifactFactory factory = artifactFactory.get();
     BuildInfoContext context =
-        new BuildInfoContext() {
-          @Override
-          public Artifact getBuildInfoArtifact(
-              PathFragment rootRelativePath, ArtifactRoot root, BuildInfoType type) {
-            return type == BuildInfoType.NO_REBUILD
-                ? factory.getConstantMetadataArtifact(rootRelativePath, root, keyAndConfig)
-                : factory.getDerivedArtifact(rootRelativePath, root, keyAndConfig);
-          }
-        };
+        (rootRelativePath, root, type) ->
+            type == BuildInfoType.NO_REBUILD
+                ? artifactFactory.getConstantMetadataArtifact(rootRelativePath, root, keyAndConfig)
+                : artifactFactory.getDerivedArtifact(rootRelativePath, root, keyAndConfig);
     BuildInfoCollection collection =
         buildInfoFactory.create(
             context,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
index cc42bb1..9a203cb 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java
@@ -174,7 +174,6 @@
       ExternalPackageHelper externalPackageHelper,
       ActionOnIOExceptionReadingBuildFile actionOnIOExceptionReadingBuildFile,
       BuildOptions defaultBuildOptions,
-      MutableArtifactFactorySupplier mutableArtifactFactorySupplier,
       @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
     super(
         skyframeExecutorConsumerOnInit,
@@ -195,7 +194,6 @@
         GraphInconsistencyReceiver.THROWING,
         defaultBuildOptions,
         new PackageProgressReceiver(),
-        mutableArtifactFactorySupplier,
         new ConfiguredTargetProgressReceiver(),
         /*nonexistentFileReceiver=*/ null,
         managedDirectoriesKnowledge);
@@ -1072,8 +1070,6 @@
     private Factory workspaceStatusActionFactory;
     private Iterable<? extends DiffAwareness.Factory> diffAwarenessFactories = ImmutableList.of();
     private Iterable<SkyValueDirtinessChecker> customDirtinessCheckers = ImmutableList.of();
-    private MutableArtifactFactorySupplier mutableArtifactFactorySupplier =
-        new MutableArtifactFactorySupplier();
     private Consumer<SkyframeExecutor> skyframeExecutorConsumerOnInit = skyframeExecutor -> {};
     private SkyFunction blacklistedPackagePrefixesFunction;
 
@@ -1110,7 +1106,6 @@
               externalPackageHelper,
               actionOnIOExceptionReadingBuildFile,
               defaultBuildOptions,
-              mutableArtifactFactorySupplier,
               managedDirectoriesKnowledge);
       skyframeExecutor.init();
       return skyframeExecutor;
@@ -1192,11 +1187,6 @@
       return this;
     }
 
-    public Builder setMutableArtifactFactorySupplier(
-        MutableArtifactFactorySupplier mutableArtifactFactorySupplier) {
-      this.mutableArtifactFactorySupplier = mutableArtifactFactorySupplier;
-      return this;
-    }
     public Builder setSkyframeExecutorConsumerOnInit(
         Consumer<SkyframeExecutor> skyframeExecutorConsumerOnInit) {
       this.skyframeExecutorConsumerOnInit = skyframeExecutorConsumerOnInit;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 3554a28..0a6a05a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -51,7 +51,6 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.ArtifactFactory;
 import com.google.devtools.build.lib.actions.ArtifactPathResolver;
-import com.google.devtools.build.lib.actions.ArtifactResolver.ArtifactResolverSupplier;
 import com.google.devtools.build.lib.actions.ArtifactRoot;
 import com.google.devtools.build.lib.actions.CommandLineExpansionException;
 import com.google.devtools.build.lib.actions.CompletionContext.PathResolverFactory;
@@ -297,10 +296,7 @@
   protected final AtomicReference<TimestampGranularityMonitor> tsgm = new AtomicReference<>();
   protected final AtomicReference<Map<String, String>> clientEnv = new AtomicReference<>();
 
-  // Under normal circumstances, the artifact factory persists for the life of a Blaze server, but
-  // since it is not yet created when we create the value builders, we have to use a supplier,
-  // initialized when the build view is created.
-  private final MutableArtifactFactorySupplier artifactFactory;
+  private final ArtifactFactory artifactFactory;
   private final ActionKeyContext actionKeyContext;
 
   protected boolean active = true;
@@ -354,21 +350,6 @@
 
   private boolean siblingRepositoryLayout = false;
 
-  /** An {@link ArtifactResolverSupplier} that supports setting of an {@link ArtifactFactory}. */
-  public static class MutableArtifactFactorySupplier implements ArtifactResolverSupplier {
-
-    private ArtifactFactory artifactFactory;
-
-    void set(ArtifactFactory artifactFactory) {
-      this.artifactFactory = artifactFactory;
-    }
-
-    @Override
-    public ArtifactFactory get() {
-      return artifactFactory;
-    }
-  }
-
   class PathResolverFactoryImpl implements PathResolverFactory {
     @Override
     public boolean shouldCreatePathResolverForArtifactValues() {
@@ -413,7 +394,6 @@
       GraphInconsistencyReceiver graphInconsistencyReceiver,
       BuildOptions defaultBuildOptions,
       @Nullable PackageProgressReceiver packageProgress,
-      MutableArtifactFactorySupplier artifactResolverSupplier,
       @Nullable ConfiguredTargetProgressReceiver configuredTargetProgress,
       @Nullable NonexistentFileReceiver nonexistentFileReceiver,
       @Nullable ManagedDirectoriesKnowledge managedDirectoriesKnowledge) {
@@ -448,8 +428,7 @@
         new SkyframeActionExecutor(actionKeyContext, statusReporterRef, this::getPathEntries);
     this.skyframeBuildView =
         new SkyframeBuildView(directories, this, ruleClassProvider, actionKeyContext);
-    this.artifactFactory = artifactResolverSupplier;
-    this.artifactFactory.set(skyframeBuildView.getArtifactFactory());
+    this.artifactFactory = skyframeBuildView.getArtifactFactory();
     this.externalFilesHelper =
         ExternalFilesHelper.create(
             pkgLocator,
@@ -602,7 +581,7 @@
             () -> !skyframeActionExecutor.actionFileSystemType().inMemoryFileSystem()));
     map.put(
         SkyFunctions.BUILD_INFO_COLLECTION,
-        new BuildInfoCollectionFunction(actionKeyContext, artifactFactory::get));
+        new BuildInfoCollectionFunction(actionKeyContext, artifactFactory));
     map.put(SkyFunctions.BUILD_INFO, new WorkspaceStatusFunction(this::makeWorkspaceStatusAction));
     map.put(SkyFunctions.COVERAGE_REPORT, new CoverageReportFunction(actionKeyContext));
     ActionExecutionFunction actionExecutionFunction =
@@ -1120,11 +1099,6 @@
   }
 
   @VisibleForTesting
-  public ArtifactResolverSupplier getArtifactResolverSupplierForTesting() {
-    return artifactFactory;
-  }
-
-  @VisibleForTesting
   @Nullable
   public WorkspaceStatusAction getLastWorkspaceStatusAction() throws InterruptedException {
     WorkspaceStatusValue workspaceStatusValue =
@@ -1430,7 +1404,7 @@
 
   private void setSiblingDirectoryLayout(boolean experimentalSiblingRepositoryLayout) {
     this.siblingRepositoryLayout = experimentalSiblingRepositoryLayout;
-    this.artifactFactory.get().setSiblingRepositoryLayout(experimentalSiblingRepositoryLayout);
+    this.artifactFactory.setSiblingRepositoryLayout(experimentalSiblingRepositoryLayout);
   }
 
   public StarlarkSemantics getEffectiveStarlarkSemantics(
@@ -1453,7 +1427,6 @@
       // (Some of the additional steps are carried out by ConfiguredTargetValueInvalidationListener,
       // and some by BuildView#buildHasIncompatiblePackageRoots and #updateSkyframe.)
       artifactFactory
-          .get()
           .setSourceArtifactRoots(
               createSourceArtifactRootMapOnNewPkgLocator(oldLocator, pkgLocator));
     }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java
index 43646cc..086f5ff 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java
@@ -34,7 +34,7 @@
           @Override
           public NodeEntry get(@Nullable SkyKey requestor, Reason reason, SkyKey key)
               throws InterruptedException {
-            return evaluator.getExistingEntryAtLatestVersion(key);
+            return evaluator.getExistingEntryAtCurrentlyEvaluatingVersion(key);
           }
 
           @Override
@@ -50,7 +50,6 @@
             }
             return result;
           }
-
         });
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java
index 8f50010..5d829b9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils/SerializationDepsUtils.java
@@ -73,5 +73,10 @@
         }
       };
     }
+
+    @Override
+    public Artifact.DerivedArtifact intern(Artifact.DerivedArtifact original) {
+      return original;
+    }
   }
 }
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 ec773ce..c7c9046 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -311,7 +311,7 @@
   @Override
   @Nullable
   public SkyValue getExistingValue(SkyKey key) {
-    NodeEntry entry = getExistingEntryAtLatestVersion(key);
+    NodeEntry entry = getExistingEntryAtCurrentlyEvaluatingVersion(key);
     try {
       return isDone(entry) ? entry.getValue() : null;
     } catch (InterruptedException e) {
@@ -321,7 +321,7 @@
 
   @Override
   @Nullable public ErrorInfo getExistingErrorForTesting(SkyKey key) {
-    NodeEntry entry = getExistingEntryAtLatestVersion(key);
+    NodeEntry entry = getExistingEntryAtCurrentlyEvaluatingVersion(key);
     try {
       return isDone(entry) ? entry.getErrorInfo() : null;
     } catch (InterruptedException e) {
@@ -331,7 +331,7 @@
 
   @Nullable
   @Override
-  public NodeEntry getExistingEntryAtLatestVersion(SkyKey key) {
+  public NodeEntry getExistingEntryAtCurrentlyEvaluatingVersion(SkyKey key) {
     return graph.get(null, Reason.OTHER, key);
   }
 
diff --git a/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
index 3c9cf9b..f0a9beb 100644
--- a/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/MemoizingEvaluator.java
@@ -130,7 +130,7 @@
   SkyValue getExistingValue(SkyKey key) throws InterruptedException;
 
   @Nullable
-  NodeEntry getExistingEntryAtLatestVersion(SkyKey key) throws InterruptedException;
+  NodeEntry getExistingEntryAtCurrentlyEvaluatingVersion(SkyKey key) throws InterruptedException;
 
   /**
    * Returns an error if and only if an earlier call to {@link #evaluate} created it; null
diff --git a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
index 3f23573..188743a 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SequentialBuildDriver.java
@@ -80,6 +80,6 @@
   @Nullable
   @Override
   public NodeEntry getEntryForTesting(SkyKey key) throws InterruptedException {
-    return memoizingEvaluator.getExistingEntryAtLatestVersion(key);
+    return memoizingEvaluator.getExistingEntryAtCurrentlyEvaluatingVersion(key);
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
index 070896f..bdf925b 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ArtifactTest.java
@@ -32,6 +32,7 @@
 import com.google.devtools.build.lib.rules.java.JavaSemantics;
 import com.google.devtools.build.lib.skyframe.serialization.AutoRegistry;
 import com.google.devtools.build.lib.skyframe.serialization.ObjectCodecs;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.vfs.FileSystem;
@@ -261,6 +262,7 @@
         .addDependency(FileSystem.class, scratch.getFileSystem())
         .addDependency(
             Root.RootCodecDependencies.class, new Root.RootCodecDependencies(anotherRoot.getRoot()))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .runTests();
   }
 
@@ -271,7 +273,18 @@
     ArtifactFactory artifactFactory =
         new ArtifactFactory(execDir.getParentDirectory(), "blaze-out");
     artifactFactory.setSourceArtifactRoots(ImmutableMap.of(root, artifactRoot));
-    ArtifactResolverSupplier artifactResolverSupplierForTest = () -> artifactFactory;
+    ArtifactResolverSupplier artifactResolverSupplierForTest =
+        new ArtifactResolverSupplier() {
+          @Override
+          public Artifact.DerivedArtifact intern(Artifact.DerivedArtifact original) {
+            return original;
+          }
+
+          @Override
+          public ArtifactResolver get() {
+            return artifactFactory;
+          }
+        };
 
     ObjectCodecs objectCodecs =
         new ObjectCodecs(
diff --git a/src/test/java/com/google/devtools/build/lib/actions/BUILD b/src/test/java/com/google/devtools/build/lib/actions/BUILD
index 45c7186..6c94a2c 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/actions/BUILD
@@ -43,6 +43,7 @@
         "//src/main/java/com/google/devtools/build/lib/rules/java:java-compilation",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils:depsutils",
         "//src/main/java/com/google/devtools/build/lib/syntax:evaluator",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:string",
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
index 8c9c672..e1df4a8 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ExecutableSymlinkActionTest.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetExpander;
 import com.google.devtools.build.lib.exec.SingleBuildFileCache;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.Scratch;
 import com.google.devtools.build.lib.testutil.TestFileOutErr;
@@ -144,6 +145,7 @@
         .addDependency(
             Root.RootCodecDependencies.class,
             new Root.RootCodecDependencies(Root.absoluteRoot(scratch.getFileSystem())))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .setVerificationFunction(
             (in, out) -> {
               SymlinkAction inAction = (SymlinkAction) in;
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java
index 8c7313f..194eeb1 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcBinaryThinLtoTest.java
@@ -189,7 +189,7 @@
         (ConfiguredTargetValue)
             getSkyframeExecutor()
                 .getEvaluatorForTesting()
-                .getExistingEntryAtLatestVersion(
+                .getExistingEntryAtCurrentlyEvaluatingVersion(
                     ConfiguredTargetKey.builder()
                         .setLabel(pkg.getLabel())
                         .setConfiguration(getConfiguration(pkg))
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
index 67924f1..d542c52 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
@@ -45,6 +45,7 @@
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
 import com.google.devtools.build.lib.events.NullEventHandler;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.FileStatus;
@@ -343,6 +344,7 @@
         .addDependency(
             Root.RootCodecDependencies.class,
             new Root.RootCodecDependencies(Root.absoluteRoot(root.getFileSystem())))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .runTests();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
index cf471d2..eb983c6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -233,6 +233,7 @@
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
         "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils",
+        "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/testutils:depsutils",
         "//src/main/java/net/starlark/java/annot",
         "//src/main/java/com/google/devtools/build/lib/util",
         "//src/main/java/com/google/devtools/build/lib/util:abrupt_exit_exception",
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
index 70ceece..1ee43a4 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactBuildTest.java
@@ -54,6 +54,7 @@
 import com.google.devtools.build.lib.events.EventCollector;
 import com.google.devtools.build.lib.events.EventKind;
 import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey;
+import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationDepsUtils;
 import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
 import com.google.devtools.build.lib.testutil.TestUtils;
 import com.google.devtools.build.lib.util.CrashFailureDetails;
@@ -89,6 +90,7 @@
         .addDependency(
             Root.RootCodecDependencies.class,
             new Root.RootCodecDependencies(Root.absoluteRoot(scratch.getFileSystem())))
+        .addDependencies(SerializationDepsUtils.SERIALIZATION_DEPS_FOR_TEST)
         .runTests();
   }