diff options
Diffstat (limited to 'src')
9 files changed, 104 insertions, 23 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java index f1d91ba376..000f359315 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java @@ -23,6 +23,9 @@ import com.google.common.collect.Maps; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Strategy; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.ArrayList; @@ -187,7 +190,11 @@ public class ActionLookupValue implements SkyValue { * subclasses of ActionLookupKey. This allows callers to easily find the value key, while * remaining agnostic to what ActionLookupValues actually exist. */ + @AutoCodec(strategy = Strategy.POLYMORPHIC) public abstract static class ActionLookupKey implements ArtifactOwner, SkyKey { + public static final ObjectCodec<ActionLookupKey> CODEC = + new ActionLookupValue_ActionLookupKey_AutoCodec(); + @Override public Label getLabel() { return null; 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 d45d16d587..6993478742 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 @@ -31,6 +31,9 @@ import com.google.devtools.build.lib.analysis.actions.CommandLineItem; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.shell.ShellUtils; +import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; @@ -40,6 +43,7 @@ import com.google.devtools.build.lib.syntax.EvalUtils; import com.google.devtools.build.lib.syntax.EvalUtils.ComparisonException; import com.google.devtools.build.lib.util.FileType; import com.google.devtools.build.lib.util.FileTypeSet; +import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; @@ -115,6 +119,7 @@ import javax.annotation.Nullable; + " Then you can access the File through the rule's " + "<a href='ctx.html#outputs'>ctx.outputs</a>." ) +@AutoCodec(dependency = FileSystemProvider.class) public class Artifact implements FileType.HasFileType, ActionInput, @@ -122,6 +127,9 @@ public class Artifact Comparable<Object>, CommandLineItem { + public static final InjectingObjectCodec<Artifact, FileSystemProvider> CODEC = + new Artifact_AutoCodec(); + /** Compares artifact according to their exec paths. Sorts null values first. */ @SuppressWarnings("ReferenceEquality") // "a == b" is an optimization public static final Comparator<Artifact> EXEC_PATH_COMPARATOR = @@ -194,6 +202,7 @@ public class Artifact * </pre> */ @VisibleForTesting + @AutoCodec.Instantiator public Artifact(Path path, ArtifactRoot root, PathFragment execPath, ArtifactOwner owner) { if (root == null || !root.getRoot().contains(path)) { throw new IllegalArgumentException(root + ": illegal root for " + path @@ -454,16 +463,21 @@ public class Artifact /** * A special kind of artifact that either is a fileset or needs special metadata caching behavior. * - * <p>We subclass {@link Artifact} instead of storing the special attributes inside in order - * to save memory. The proportion of artifacts that are special is very small, and by not having - * to keep around the attribute for the rest we save some memory. + * <p>We subclass {@link Artifact} instead of storing the special attributes inside in order to + * save memory. The proportion of artifacts that are special is very small, and by not having to + * keep around the attribute for the rest we save some memory. */ @Immutable @VisibleForTesting + @AutoCodec(dependency = FileSystemProvider.class) public static final class SpecialArtifact extends Artifact { + + public static final InjectingObjectCodec<SpecialArtifact, FileSystemProvider> CODEC = + new Artifact_SpecialArtifact_AutoCodec(); + private final SpecialArtifactType type; - @VisibleForTesting + @VisibleForSerialization public SpecialArtifact( Path path, ArtifactRoot root, @@ -508,19 +522,24 @@ public class Artifact } /** - * A special kind of artifact that represents a concrete file created at execution time under - * its associated TreeArtifact. + * A special kind of artifact that represents a concrete file created at execution time under its + * associated TreeArtifact. * - * <p> TreeFileArtifacts should be only created during execution time inside some special actions - * to support action inputs and outputs that are unpredictable at analysis time. - * TreeFileArtifacts should not be created directly by any rules at analysis time. + * <p>TreeFileArtifacts should be only created during execution time inside some special actions + * to support action inputs and outputs that are unpredictable at analysis time. TreeFileArtifacts + * should not be created directly by any rules at analysis time. * - * <p>We subclass {@link Artifact} instead of storing the extra fields directly inside in order - * to save memory. The proportion of TreeFileArtifacts is very small, and by not having to keep + * <p>We subclass {@link Artifact} instead of storing the extra fields directly inside in order to + * save memory. The proportion of TreeFileArtifacts is very small, and by not having to keep * around the extra fields for the rest we save some memory. */ @Immutable + @AutoCodec(dependency = FileSystemProvider.class) public static final class TreeFileArtifact extends Artifact { + + public static final InjectingObjectCodec<TreeFileArtifact, FileSystemProvider> CODEC = + new Artifact_TreeFileArtifact_AutoCodec(); + private final Artifact parentTreeArtifact; private final PathFragment parentRelativePath; @@ -537,23 +556,24 @@ public class Artifact * Constructs a TreeFileArtifact with the given parent-relative path under the given parent * TreeArtifact, owned by the given {@code artifactOwner}. */ - TreeFileArtifact(Artifact parent, PathFragment parentRelativePath, - ArtifactOwner artifactOwner) { + @AutoCodec.Instantiator + TreeFileArtifact( + Artifact parentTreeArtifact, PathFragment parentRelativePath, ArtifactOwner owner) { super( - parent.getPath().getRelative(parentRelativePath), - parent.getRoot(), - parent.getExecPath().getRelative(parentRelativePath), - artifactOwner); + parentTreeArtifact.getPath().getRelative(parentRelativePath), + parentTreeArtifact.getRoot(), + parentTreeArtifact.getExecPath().getRelative(parentRelativePath), + owner); Preconditions.checkState( - parent.isTreeArtifact(), + parentTreeArtifact.isTreeArtifact(), "The parent of TreeFileArtifact (parent-relative path: %s) is not a TreeArtifact: %s", parentRelativePath, - parent); + parentTreeArtifact); Preconditions.checkState( parentRelativePath.isNormalized() && !parentRelativePath.isAbsolute(), "%s is not a proper normalized relative path", parentRelativePath); - this.parentTreeArtifact = parent; + this.parentTreeArtifact = parentTreeArtifact; this.parentRelativePath = parentRelativePath; } diff --git a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java index 3363dc33da..1a84425e61 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ArtifactRoot.java @@ -17,11 +17,15 @@ package com.google.devtools.build.lib.actions; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable; import com.google.devtools.build.lib.skylarkinterface.SkylarkModule; import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; +import com.google.devtools.build.lib.vfs.FileSystemProvider; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; @@ -52,8 +56,12 @@ import java.util.Objects; + "together into a single directory tree to form the execution environment." ) @Immutable +@AutoCodec(dependency = FileSystemProvider.class) public final class ArtifactRoot implements Comparable<ArtifactRoot>, Serializable, SkylarkValue { + public static final InjectingObjectCodec<ArtifactRoot, FileSystemProvider> CODEC = + new ArtifactRoot_AutoCodec(); + // This must always be consistent with Package.getSourceRoot; otherwise computing source roots // from exec paths does not work, which can break the action cache for input-discovering actions. public static ArtifactRoot computeSourceRoot(Root packageRoot, RepositoryName repository) { @@ -96,7 +104,8 @@ public final class ArtifactRoot implements Comparable<ArtifactRoot>, Serializabl return new ArtifactRoot(Root.fromPath(root), execPath, RootType.Middleman); } - private enum RootType { + @VisibleForSerialization + enum RootType { Source, Output, Middleman @@ -106,7 +115,8 @@ public final class ArtifactRoot implements Comparable<ArtifactRoot>, Serializabl private final PathFragment execPath; private final RootType rootType; - private ArtifactRoot(Root root, PathFragment execPath, RootType rootType) { + @AutoCodec.Instantiator + ArtifactRoot(Root root, PathFragment execPath, RootType rootType) { this.root = Preconditions.checkNotNull(root); this.execPath = execPath; this.rootType = rootType; diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 5edd716518..7cbf304f16 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -484,6 +484,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/clock", "//src/main/java/com/google/devtools/build/lib/concurrent", + "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs", "//src/main/java/com/google/devtools/build/skyframe", @@ -522,6 +523,8 @@ java_test( "//src/main/java/com/google/devtools/build/lib/collect/nestedset", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/rules/cpp", + "//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/vfs", "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs", "//src/main/java/com/google/devtools/common/options", 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 cd47c41b81..363bae9df3 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 @@ -25,6 +25,8 @@ import com.google.devtools.build.lib.actions.util.LabelArtifactOwner; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.rules.cpp.CppFileTypes; import com.google.devtools.build.lib.rules.java.JavaSemantics; +import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; +import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; import com.google.devtools.build.lib.testutil.Scratch; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -339,6 +341,23 @@ public class ArtifactTest { } @Test + public void testCodec() throws Exception { + ObjectCodecTester.newBuilder( + new InjectingObjectCodecAdapter<>(Artifact.CODEC, () -> scratch.getFileSystem())) + .addSubjects( + new Artifact(PathFragment.create("src/a"), rootDir), + new Artifact( + PathFragment.create("src/b"), ArtifactRoot.asSourceRoot(Root.fromPath(execDir))), + new Artifact( + scratch.file("/src/c"), + ArtifactRoot.asDerivedRoot( + scratch.getFileSystem().getPath("/"), scratch.dir("/src")), + PathFragment.create("c"), + new LabelArtifactOwner(Label.parseAbsoluteUnchecked("//foo:bar")))) + .buildAndRunTests(); + } + + @Test public void testLongDirname() throws Exception { String dirName = createDirNameArtifact().getDirname(); diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java b/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java index 1baf5b4de0..0d24177180 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java +++ b/src/test/java/com/google/devtools/build/lib/actions/util/LabelArtifactOwner.java @@ -16,12 +16,17 @@ package com.google.devtools.build.lib.actions.util; import com.google.common.annotations.VisibleForTesting; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.cmdline.Label; - +import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import java.util.Objects; /** ArtifactOwner wrapper for Labels, for use in tests. */ @VisibleForTesting +@AutoCodec public class LabelArtifactOwner implements ArtifactOwner { + + public static final ObjectCodec<LabelArtifactOwner> CODEC = new LabelArtifactOwner_AutoCodec(); + private final Label label; @VisibleForTesting 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 e9cfbfda0d..3896f0a261 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD @@ -31,6 +31,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/collect", "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/rules/platform", + "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec", "//src/main/java/com/google/devtools/build/lib/vfs", "//src/main/java/com/google/devtools/build/skyframe", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", @@ -79,6 +80,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib/concurrent", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//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/vfs", "//src/main/java/com/google/devtools/build/lib/vfs/inmemoryfs", diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java index 27e95b58bb..3b39d03441 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java @@ -65,6 +65,7 @@ import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAc import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier; +import com.google.devtools.build.lib.skyframe.serialization.SingletonCodec; import com.google.devtools.build.lib.testutil.FoundationTestCase; import com.google.devtools.build.lib.testutil.TestConstants; import com.google.devtools.build.lib.testutil.TestRuleClassProvider; @@ -494,6 +495,10 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase { } private static class SingletonActionLookupKey extends ActionLookupValue.ActionLookupKey { + + public static final SingletonCodec<SingletonActionLookupKey> CODEC = + SingletonCodec.of(new SingletonActionLookupKey(), "none"); + @Override public SkyFunctionName functionName() { return SkyFunctions.CONFIGURED_TARGET; 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 1a9063b33f..675030c84f 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 @@ -52,6 +52,8 @@ import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventKind; import com.google.devtools.build.lib.events.StoredEventHandler; import com.google.devtools.build.lib.skyframe.ActionTemplateExpansionValue.ActionTemplateExpansionKey; +import com.google.devtools.build.lib.skyframe.serialization.InjectingObjectCodecAdapter; +import com.google.devtools.build.lib.skyframe.serialization.testutils.ObjectCodecTester; import com.google.devtools.build.lib.testutil.TestUtils; import com.google.devtools.build.lib.vfs.FileStatus; import com.google.devtools.build.lib.vfs.FileSystem; @@ -114,6 +116,14 @@ public class TreeArtifactBuildTest extends TimestampBuilderTestCase { outTwoFileTwo = treeFileArtifact(outTwo, "out_one_file_two"); } + @Test + public void testCodec() throws Exception { + ObjectCodecTester.newBuilder( + new InjectingObjectCodecAdapter<>(Artifact.CODEC, () -> scratch.getFileSystem())) + .addSubjects(outOne, outOneFileOne) + .buildAndRunTests(); + } + /** Simple smoke test. If this isn't passing, something is very wrong... */ @Test public void testTreeArtifactSimpleCase() throws Exception { |