diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
51 files changed, 1090 insertions, 355 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerValue.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerValue.java index 3a4774ccc8..75ad690801 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerValue.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerValue.java @@ -16,9 +16,11 @@ package com.google.devtools.build.lib.bazel.repository; import com.google.common.base.Objects; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.util.Fingerprint; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; import java.util.Arrays; import org.apache.maven.settings.Server; @@ -34,9 +36,25 @@ public class MavenServerValue implements SkyValue { private final Server server; private final byte[] settingsFingerprint; - public static SkyKey key(String serverName) { - Preconditions.checkNotNull(serverName); - return LegacySkyKey.create(MavenServerFunction.NAME, serverName); + public static Key key(String serverName) { + return Key.create(Preconditions.checkNotNull(serverName)); + } + + static class Key extends AbstractSkyKey<String> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(String arg) { + super(arg); + } + + static Key create(String arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return MavenServerFunction.NAME; + } } public static MavenServerValue createFromUrl(String url) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java index 529cb4d668..b6619a9ec8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java +++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java @@ -69,8 +69,6 @@ import com.google.devtools.build.lib.query2.output.QueryOptions.OrderOutput; import com.google.devtools.build.lib.query2.output.QueryOutputUtils; import com.google.devtools.build.lib.runtime.KeepGoingOption; import com.google.devtools.build.lib.skyframe.PackageValue; -import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed; -import com.google.devtools.build.lib.skyframe.SkyFunctions; import com.google.devtools.build.lib.skyframe.TargetPatternValue; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; import com.google.devtools.build.lib.skyframe.TransitiveTargetKey; @@ -80,7 +78,6 @@ import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.ValueOrException; @@ -103,8 +100,6 @@ import javax.annotation.Nullable; public class GenQuery implements RuleConfiguredTargetFactory { private static final QueryEnvironmentFactory QUERY_ENVIRONMENT_FACTORY = new QueryEnvironmentFactory(); - public static final Precomputed<ImmutableList<OutputFormatter>> QUERY_OUTPUT_FORMATTERS = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "query_output_formatters")); @Override @Nullable diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java index eafa09fb5c..a4b6c9a16b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java @@ -26,15 +26,13 @@ import com.google.devtools.build.lib.repository.ExternalPackageUtil; import com.google.devtools.build.lib.repository.ExternalRuleNotFoundException; import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException; import com.google.devtools.build.lib.skyframe.FileValue; +import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed; -import com.google.devtools.build.lib.skyframe.SkyFunctions; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunction; -import com.google.devtools.build.skyframe.SkyFunction.Environment; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; import com.google.devtools.build.skyframe.SkyKey; @@ -56,7 +54,7 @@ import javax.annotation.Nullable; */ public final class RepositoryDelegatorFunction implements SkyFunction { public static final Precomputed<Map<RepositoryName, PathFragment>> REPOSITORY_OVERRIDES = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "repository_overrides")); + new Precomputed<>(PrecomputedValue.Key.create("repository_overrides")); // The marker file version is inject in the rule key digest so the rule key is always different // when we decide to update the format. diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDirectoryValue.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDirectoryValue.java index 6e21ad5b70..c2ce139864 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDirectoryValue.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDirectoryValue.java @@ -16,12 +16,15 @@ package com.google.devtools.build.lib.rules.repository; import com.google.common.base.Objects; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.skyframe.DirectoryListingValue; import com.google.devtools.build.lib.skyframe.SkyFunctions; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.Path; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; import java.util.Arrays; import javax.annotation.Nullable; @@ -124,8 +127,29 @@ public abstract class RepositoryDirectoryValue implements SkyValue { new NoRepositoryDirectoryValue(); /** Creates a key from the given repository name. */ - public static SkyKey key(RepositoryName repository) { - return LegacySkyKey.create(SkyFunctions.REPOSITORY_DIRECTORY, repository); + public static Key key(RepositoryName repository) { + return Key.create(repository); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RepositoryName> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RepositoryName arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RepositoryName arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.REPOSITORY_DIRECTORY; + } } public static Builder builder() { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java index 6a00a4b78f..247d0e0202 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupValue.java @@ -15,10 +15,13 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.syntax.BuildFileAST; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; /** @@ -30,7 +33,7 @@ public abstract class ASTFileLookupValue implements SkyValue { public abstract boolean lookupSuccessful(); public abstract BuildFileAST getAST(); public abstract String getErrorMsg(); - + /** If the file is found, this class encapsulates the parsed AST. */ private static class ASTLookupWithFile extends ASTFileLookupValue { private final BuildFileAST ast; @@ -56,7 +59,7 @@ public abstract class ASTFileLookupValue implements SkyValue { "attempted to retrieve unsuccessful lookup reason for successful lookup"); } } - + /** If the file isn't found, this class encapsulates a message with the reason. */ private static class ASTLookupNoFile extends ASTFileLookupValue { private final String errorMsg; @@ -85,17 +88,38 @@ public abstract class ASTFileLookupValue implements SkyValue { return new ASTLookupNoFile( String.format("Unable to load package for '%s': %s", fileLabel, reason)); } - + static ASTFileLookupValue forBadFile(Label fileLabel) { return new ASTLookupNoFile( String.format("Unable to load file '%s': file doesn't exist or isn't a file", fileLabel)); } - + public static ASTFileLookupValue withFile(BuildFileAST ast) { return new ASTLookupWithFile(ast); } - public static SkyKey key(Label astFileLabel) { - return LegacySkyKey.create(SkyFunctions.AST_FILE_LOOKUP, astFileLabel); + public static Key key(Label astFileLabel) { + return ASTFileLookupValue.Key.create(astFileLabel); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<Label> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(Label arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(Label arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.AST_FILE_LOOKUP; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java index efc6c9a84c..81c27fec48 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionEnvironmentFunction.java @@ -15,8 +15,12 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Collections; @@ -45,12 +49,33 @@ public final class ActionEnvironmentFunction implements SkyFunction { if (actionEnv.containsKey(key) && actionEnv.get(key) != null) { return new ClientEnvironmentValue(actionEnv.get(key)); } - return env.getValue(LegacySkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, key)); + return env.getValue(ClientEnvironmentFunction.key(key)); } /** @return the SkyKey to invoke this function for the environment variable {@code variable}. */ - public static SkyKey key(String variable) { - return LegacySkyKey.create(SkyFunctions.ACTION_ENVIRONMENT_VARIABLE, variable); + public static Key key(String variable) { + return Key.create(variable); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<String> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(String arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(String arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.ACTION_ENVIRONMENT_VARIABLE; + } } /** diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java index a450f6fc06..3786ddcb4e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionFunction.java @@ -43,7 +43,6 @@ import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyKey; @@ -88,13 +87,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver stateMap = Maps.newConcurrentMap(); } - private static final Function<String, SkyKey> VAR_TO_SKYKEY = - new Function<String, SkyKey>() { - @Override - public SkyKey apply(String var) { - return LegacySkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, var); - } - }; + private static final Function<String, SkyKey> VAR_TO_SKYKEY = ClientEnvironmentFunction::key; @Override public SkyValue compute(SkyKey skyKey, Environment env) throws ActionExecutionFunctionException, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java index ea6c77468c..7b33d0bfe4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java @@ -14,11 +14,11 @@ package com.google.devtools.build.lib.skyframe; import com.google.auto.value.AutoValue; -import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.analysis.TopLevelArtifactContext; import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Collection; @@ -27,32 +27,18 @@ import java.util.Collection; * The value of an AspectCompletion. Currently this just stores an Aspect. */ public class AspectCompletionValue implements SkyValue { - private final AspectValue aspectValue; + @AutoCodec static final AspectCompletionValue INSTANCE = new AspectCompletionValue(); - AspectCompletionValue(AspectValue aspectValue) { - this.aspectValue = aspectValue; - } - - public AspectValue getAspectValue() { - return aspectValue; - } + private AspectCompletionValue() {} public static Iterable<SkyKey> keys( Collection<AspectValue> targets, final TopLevelArtifactContext ctx) { return Iterables.transform( - targets, - new Function<AspectValue, SkyKey>() { - @Override - public SkyKey apply(AspectValue aspectValue) { - return LegacySkyKey.create( - SkyFunctions.ASPECT_COMPLETION, - AspectCompletionKey.create(aspectValue.getKey(), ctx)); - } - }); + targets, aspectValue -> AspectCompletionKey.create(aspectValue.getKey(), ctx)); } - @AutoValue - abstract static class AspectCompletionKey { + @AutoValue + abstract static class AspectCompletionKey implements SkyKey { public static AspectCompletionKey create( AspectKey aspectKey, TopLevelArtifactContext topLevelArtifactContext) { return new AutoValue_AspectCompletionValue_AspectCompletionKey( @@ -61,5 +47,10 @@ public class AspectCompletionValue implements SkyValue { public abstract AspectKey aspectKey(); public abstract TopLevelArtifactContext topLevelArtifactContext(); + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.ASPECT_COMPLETION; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesValue.java index 73d13b8b95..13494812ca 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesValue.java @@ -17,7 +17,6 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -26,8 +25,8 @@ import com.google.devtools.build.skyframe.SkyValue; public class BlacklistedPackagePrefixesValue implements SkyValue { private final ImmutableSet<PathFragment> patterns; - private static final SkyKey BLACKLIST_KEY = - LegacySkyKey.create(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, ""); + @AutoCodec.VisibleForSerialization @AutoCodec + static final SkyKey BLACKLIST_KEY = () -> SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES; public BlacklistedPackagePrefixesValue(ImmutableSet<PathFragment> patterns) { this.patterns = Preconditions.checkNotNull(patterns); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ChainUniquenessUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/ChainUniquenessUtils.java index 8f4db91db6..f0b3274444 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ChainUniquenessUtils.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ChainUniquenessUtils.java @@ -13,11 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyFunctionName; -import com.google.devtools.build.skyframe.SkyKey; /** * A value for ensuring that an error for a cycle/chain is reported exactly once. This is achieved @@ -29,15 +25,10 @@ class ChainUniquenessUtils { private ChainUniquenessUtils() {} /** - * Create a SkyKey for {@code functionName} with a canonicalized representation of the cycle - * specified by {@code chain} as the argument. {@code chain} must be non-empty. + * Create a canonicalized representation of the cycle specified by {@code chain}. {@code chain} + * must be non-empty. */ - static SkyKey key(SkyFunctionName functionName, ImmutableList<? extends Object> chain) { - Preconditions.checkState(!chain.isEmpty()); - return LegacySkyKey.create(functionName, canonicalize(chain)); - } - - private static ImmutableList<Object> canonicalize(ImmutableList<? extends Object> cycle) { + static <T> ImmutableList<T> canonicalize(ImmutableList<T> cycle) { int minPos = 0; String minString = cycle.get(0).toString(); for (int i = 1; i < cycle.size(); i++) { @@ -48,7 +39,7 @@ class ChainUniquenessUtils { minString = candidateString; } } - ImmutableList.Builder<Object> builder = ImmutableList.builder(); + ImmutableList.Builder<T> builder = ImmutableList.builder(); for (int i = 0; i < cycle.size(); i++) { int pos = (minPos + i) % cycle.size(); builder.add(cycle.get(pos)); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentFunction.java index 20de7df60a..7c4c798b4a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ClientEnvironmentFunction.java @@ -14,7 +14,12 @@ package com.google.devtools.build.lib.skyframe; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Map; @@ -23,6 +28,30 @@ import javax.annotation.Nullable; /** The Skyframe function that generates values for variables of the client environment. */ public final class ClientEnvironmentFunction implements SkyFunction { + public static Key key(String keyString) { + return ClientEnvironmentFunction.Key.create(keyString); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<String> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(String arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(String arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE; + } + } private final AtomicReference<Map<String, String>> clientEnv; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java index 214daf54c1..2efd41b5a0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryFunction.java @@ -19,7 +19,6 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.packages.NoSuchPackageException; -import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java index 9e2f280382..9ca228c3a0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CollectPackagesUnderDirectoryValue.java @@ -17,12 +17,14 @@ import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; -import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Objects; @@ -227,10 +229,33 @@ public abstract class CollectPackagesUnderDirectoryValue implements SkyValue { @ThreadSafe public static SkyKey key( RepositoryName repository, RootedPath rootedPath, ImmutableSet<PathFragment> excludedPaths) { - return key(new RecursivePkgKey(repository, rootedPath, excludedPaths)); + return Key.create(repository, rootedPath, excludedPaths); } - static SkyKey key(RecursivePkgKey recursivePkgKey) { - return LegacySkyKey.create(SkyFunctions.COLLECT_PACKAGES_UNDER_DIRECTORY, recursivePkgKey); + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends RecursivePkgSkyKey { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key( + RepositoryName repositoryName, + RootedPath rootedPath, + ImmutableSet<PathFragment> excludedPaths) { + super(repositoryName, rootedPath, excludedPaths); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create( + RepositoryName repositoryName, + RootedPath rootedPath, + ImmutableSet<PathFragment> excludedPaths) { + return interner.intern(new Key(repositoryName, rootedPath, excludedPaths)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.COLLECT_PACKAGES_UNDER_DIRECTORY; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CollectTargetsInPackageValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CollectTargetsInPackageValue.java index 1ed9592eb8..19c0c1dbf8 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CollectTargetsInPackageValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CollectTargetsInPackageValue.java @@ -17,10 +17,9 @@ import com.google.auto.value.AutoValue; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.pkgcache.FilteringPolicy; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; -import java.io.Serializable; /** Singleton result of {@link CollectTargetsInPackageFunction}. */ public class CollectTargetsInPackageValue implements SkyValue { @@ -33,18 +32,18 @@ public class CollectTargetsInPackageValue implements SkyValue { * Creates a key for evaluation of {@link CollectTargetsInPackageFunction}. See that class's * comment for what callers should have done beforehand. */ - public static SkyKey key(PackageIdentifier packageId, FilteringPolicy filteringPolicy) { - return LegacySkyKey.create( - SkyFunctions.COLLECT_TARGETS_IN_PACKAGE, - CollectTargetsInPackageKey.create(packageId, filteringPolicy)); + public static CollectTargetsInPackageKey key( + PackageIdentifier packageId, FilteringPolicy filteringPolicy) { + return CollectTargetsInPackageKey.create(packageId, filteringPolicy); } /** {@link SkyKey} argument. */ - @AutoCodec @AutoValue - public abstract static class CollectTargetsInPackageKey implements Serializable { + @AutoCodec + public abstract static class CollectTargetsInPackageKey implements SkyKey { + @AutoCodec.VisibleForSerialization @AutoCodec.Instantiator - public static CollectTargetsInPackageKey create( + static CollectTargetsInPackageKey create( PackageIdentifier packageId, FilteringPolicy filteringPolicy) { return new AutoValue_CollectTargetsInPackageValue_CollectTargetsInPackageKey( packageId, filteringPolicy); @@ -53,5 +52,10 @@ public class CollectTargetsInPackageValue implements SkyValue { public abstract PackageIdentifier getPackageId(); public abstract FilteringPolicy getFilteringPolicy(); + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.COLLECT_TARGETS_IN_PACKAGE; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java index 780d74924f..675ce81da9 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CompletionFunction.java @@ -261,7 +261,7 @@ public final class CompletionFunction<TValue extends SkyValue, TResult extends S @Override public AspectCompletionValue createResult(AspectValue value) { - return new AspectCompletionValue(value); + return AspectCompletionValue.INSTANCE; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java index 24652583fb..725d20193a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupValue.java @@ -14,11 +14,13 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.Root; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; /** @@ -39,10 +41,31 @@ public abstract class ContainingPackageLookupValue implements SkyValue { /** If there is a containing package, returns its package root */ public abstract Root getContainingPackageRoot(); - public static SkyKey key(PackageIdentifier id) { + public static Key key(PackageIdentifier id) { Preconditions.checkArgument(!id.getPackageFragment().isAbsolute(), id); Preconditions.checkArgument(!id.getRepository().isDefault(), id); - return LegacySkyKey.create(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, id); + return Key.create(id); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<PackageIdentifier> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(PackageIdentifier arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(PackageIdentifier arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.CONTAINING_PACKAGE_LOOKUP; + } } public static ContainingPackage withContainingPackage(PackageIdentifier pkgId, Root root) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java index c3130721d1..39343a2403 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingStateValue.java @@ -14,13 +14,16 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.Dirent; import com.google.devtools.build.lib.vfs.Dirent.Type; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.lib.vfs.Symlinks; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; import java.io.Serializable; @@ -55,8 +58,29 @@ public final class DirectoryListingStateValue implements SkyValue { } @ThreadSafe - public static SkyKey key(RootedPath rootedPath) { - return LegacySkyKey.create(SkyFunctions.DIRECTORY_LISTING_STATE, rootedPath); + public static Key key(RootedPath rootedPath) { + return Key.create(rootedPath); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RootedPath> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RootedPath arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RootedPath arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.DIRECTORY_LISTING_STATE; + } } /** diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingValue.java index d6fb7b484b..8d19cc1739 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingValue.java @@ -13,11 +13,14 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; import java.util.Objects; @@ -49,13 +52,34 @@ public abstract class DirectoryListingValue implements SkyValue { public abstract DirectoryListingStateValue getDirectoryListingStateValue(); /** - * Returns a {@link SkyKey} for getting the directory entries of the given directory. The - * given path is assumed to be an existing directory (e.g. via {@link FileValue#isDirectory} or - * from a directory listing on its parent directory). + * Returns a {@link Key} for getting the directory entries of the given directory. The given path + * is assumed to be an existing directory (e.g. via {@link FileValue#isDirectory} or from a + * directory listing on its parent directory). */ @ThreadSafe - public static SkyKey key(RootedPath directoryUnderRoot) { - return LegacySkyKey.create(SkyFunctions.DIRECTORY_LISTING, directoryUnderRoot); + public static Key key(RootedPath directoryUnderRoot) { + return Key.create(directoryUnderRoot); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RootedPath> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RootedPath arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RootedPath arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.DIRECTORY_LISTING; + } } static DirectoryListingValue value(RootedPath dirRootedPath, FileValue dirFileValue, diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ExternalPackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ExternalPackageFunction.java index c21aa6c95a..f47ab7a7e3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ExternalPackageFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ExternalPackageFunction.java @@ -14,9 +14,13 @@ package com.google.devtools.build.lib.skyframe; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import javax.annotation.Nullable; @@ -54,10 +58,29 @@ public class ExternalPackageFunction implements SkyFunction { return null; } - /** - * Returns a SkyKey to find the WORKSPACE file at the given path. - */ + /** Returns a {@link Key} to find the WORKSPACE file at the given path. */ public static SkyKey key(RootedPath workspacePath) { - return LegacySkyKey.create(SkyFunctions.EXTERNAL_PACKAGE, workspacePath); + return Key.create(workspacePath); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RootedPath> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RootedPath arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RootedPath arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.EXTERNAL_PACKAGE; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java index 3d77021213..56988b8adb 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java @@ -16,8 +16,11 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.actions.FileStateType; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.FileStatus; import com.google.devtools.build.lib.vfs.FileStatusWithDigest; @@ -26,8 +29,8 @@ import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.lib.vfs.Symlinks; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; import java.util.Arrays; @@ -95,8 +98,29 @@ public abstract class FileStateValue implements SkyValue { @VisibleForTesting @ThreadSafe - public static SkyKey key(RootedPath rootedPath) { - return LegacySkyKey.create(SkyFunctions.FILE_STATE, rootedPath); + public static Key key(RootedPath rootedPath) { + return Key.create(rootedPath); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RootedPath> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RootedPath arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RootedPath arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.FILE_STATE; + } } public abstract FileStateType getType(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkCycleUniquenessFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkCycleUniquenessFunction.java index eb01407612..590fce8051 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkCycleUniquenessFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkCycleUniquenessFunction.java @@ -14,11 +14,15 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.RootedPath; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; - /** * A {@link SkyFunction} that has the side effect of reporting a file symlink cycle. This is * achieved by forcing the same key for two logically equivalent cycles @@ -29,7 +33,28 @@ public class FileSymlinkCycleUniquenessFunction extends AbstractChainUniquenessFunction<RootedPath> { static SkyKey key(ImmutableList<RootedPath> cycle) { - return ChainUniquenessUtils.key(SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS, cycle); + return Key.create(ChainUniquenessUtils.canonicalize(cycle)); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<ImmutableList<RootedPath>> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(ImmutableList<RootedPath> arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(ImmutableList<RootedPath> arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS; + } } @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkInfiniteExpansionUniquenessFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkInfiniteExpansionUniquenessFunction.java index bb0680d6a1..c729465bc4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkInfiniteExpansionUniquenessFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileSymlinkInfiniteExpansionUniquenessFunction.java @@ -14,8 +14,13 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.RootedPath; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; /** @@ -28,8 +33,28 @@ public class FileSymlinkInfiniteExpansionUniquenessFunction extends AbstractChainUniquenessFunction<RootedPath> { static SkyKey key(ImmutableList<RootedPath> cycle) { - return ChainUniquenessUtils.key( - SkyFunctions.FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS, cycle); + return Key.create(ChainUniquenessUtils.canonicalize(cycle)); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<ImmutableList<RootedPath>> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(ImmutableList<RootedPath> arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(ImmutableList<RootedPath> arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS; + } } @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileValue.java index 7374bf32fe..a0fe84db92 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileValue.java @@ -14,13 +14,16 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.actions.FileStateType; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; import java.util.Objects; import javax.annotation.Nullable; @@ -112,12 +115,31 @@ public abstract class FileValue implements SkyValue { return realFileStateValue().getDigest(); } - /** - * Returns a key for building a file value for the given root-relative path. - */ + /** Returns a key for building a file value for the given root-relative path. */ @ThreadSafe - public static SkyKey key(RootedPath rootedPath) { - return LegacySkyKey.create(SkyFunctions.FILE, rootedPath); + public static Key key(RootedPath rootedPath) { + return Key.create(rootedPath); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RootedPath> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RootedPath arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RootedPath arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.FILE; + } } /** diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java index 02f256f433..4ed96ec337 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunction.java @@ -237,10 +237,13 @@ public final class FilesetEntryFunction implements SkyFunction { private static RecursiveFilesystemTraversalValue traverse( Environment env, String errorInfo, DirectTraversal traversal) throws MissingDepException, InterruptedException { - SkyKey depKey = RecursiveFilesystemTraversalValue.key( - new RecursiveFilesystemTraversalValue.TraversalRequest(traversal.getRoot(), - traversal.isGenerated(), traversal.getPackageBoundaryMode(), traversal.isPackage(), - errorInfo)); + RecursiveFilesystemTraversalValue.TraversalRequest depKey = + RecursiveFilesystemTraversalValue.TraversalRequest.create( + traversal.getRoot(), + traversal.isGenerated(), + traversal.getPackageBoundaryMode(), + traversal.isPackage(), + errorInfo); RecursiveFilesystemTraversalValue v = (RecursiveFilesystemTraversalValue) env.getValue(depKey); if (env.valuesMissing()) { throw new MissingDepException(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupValue.java index 0bdf7ab2b6..c4c784a75c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupValue.java @@ -13,11 +13,14 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; /** @@ -28,8 +31,29 @@ import com.google.devtools.build.skyframe.SkyValue; */ public abstract class LocalRepositoryLookupValue implements SkyValue { - static SkyKey key(RootedPath directory) { - return LegacySkyKey.create(SkyFunctions.LOCAL_REPOSITORY_LOOKUP, directory); + static Key key(RootedPath directory) { + return Key.create(directory); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RootedPath> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RootedPath arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RootedPath arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.LOCAL_REPOSITORY_LOOKUP; + } } private static final LocalRepositoryLookupValue MAIN_REPO_VALUE = new MainRepositoryLookupValue(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageErrorFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageErrorFunction.java index 3aebda0b3e..acef91d2df 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageErrorFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageErrorFunction.java @@ -14,15 +14,19 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.BuildFileNotFoundException; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import javax.annotation.Nullable; @@ -38,8 +42,29 @@ import javax.annotation.Nullable; * should never return null, since all of its dependencies should already be present. */ public class PackageErrorFunction implements SkyFunction { - public static SkyKey key(PackageIdentifier packageIdentifier) { - return LegacySkyKey.create(SkyFunctions.PACKAGE_ERROR, packageIdentifier); + public static Key key(PackageIdentifier packageIdentifier) { + return Key.create(packageIdentifier); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<PackageIdentifier> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(PackageIdentifier arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(PackageIdentifier arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.PACKAGE_ERROR; + } } @Nullable diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java index c76a7ad8e1..2b7c49af53 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupValue.java @@ -15,13 +15,16 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Objects; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.packages.BuildFileName; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -118,9 +121,30 @@ public abstract class PackageLookupValue implements SkyValue { return key(PackageIdentifier.createInMainRepo(directory)); } - public static SkyKey key(PackageIdentifier pkgIdentifier) { + public static Key key(PackageIdentifier pkgIdentifier) { Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault()); - return LegacySkyKey.create(SkyFunctions.PACKAGE_LOOKUP, pkgIdentifier); + return Key.create(pkgIdentifier); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<PackageIdentifier> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(PackageIdentifier arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(PackageIdentifier arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.PACKAGE_LOOKUP; + } } /** Successful lookup value. */ diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java index 0314de623d..ba1962335b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageValue.java @@ -14,14 +14,17 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.PackageIdentifier; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.NotComparableSkyValue; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import java.util.ArrayList; import java.util.List; @@ -52,9 +55,30 @@ public class PackageValue implements NotComparableSkyValue { return "<PackageValue name=" + pkg.getName() + ">"; } - public static SkyKey key(PackageIdentifier pkgIdentifier) { + public static Key key(PackageIdentifier pkgIdentifier) { Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault()); - return LegacySkyKey.create(SkyFunctions.PACKAGE, pkgIdentifier); + return Key.create(pkgIdentifier); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<PackageIdentifier> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(PackageIdentifier arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(PackageIdentifier arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.PACKAGE; + } } public static List<SkyKey> keys(Iterable<PackageIdentifier> pkgIdentifiers) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetValue.java index 4e044703cf..827bb8a310 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetValue.java @@ -15,8 +15,12 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.analysis.ConfiguredTarget; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -40,8 +44,29 @@ class PostConfiguredTargetValue implements SkyValue { return keys.build(); } - public static SkyKey key(ConfiguredTargetKey lac) { - return LegacySkyKey.create(SkyFunctions.POST_CONFIGURED_TARGET, lac); + public static Key key(ConfiguredTargetKey lac) { + return Key.create(lac); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<ConfiguredTargetKey> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(ConfiguredTargetKey arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(ConfiguredTargetKey arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.POST_CONFIGURED_TARGET; + } } public ConfiguredTarget getCt() { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java index 2f8338989d..1d92dc2bca 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java @@ -19,17 +19,20 @@ import com.google.common.base.Supplier; import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.packages.RuleVisibility; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ConflictException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.syntax.SkylarkSemantics; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.Injectable; -import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunction; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Map; @@ -77,31 +80,30 @@ public final class PrecomputedValue implements SkyValue { } public static final Precomputed<String> DEFAULTS_PACKAGE_CONTENTS = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "default_pkg")); + new Precomputed<>(Key.create("default_pkg")); public static final Precomputed<RuleVisibility> DEFAULT_VISIBILITY = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "default_visibility")); + new Precomputed<>(Key.create("default_visibility")); public static final Precomputed<SkylarkSemantics> SKYLARK_SEMANTICS = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "skylark_semantics")); + new Precomputed<>(Key.create("skylark_semantics")); - static final Precomputed<UUID> BUILD_ID = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "build_id")); + static final Precomputed<UUID> BUILD_ID = new Precomputed<>(Key.create("build_id")); static final Precomputed<Map<String, String>> ACTION_ENV = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "action_env")); + new Precomputed<>(Key.create("action_env")); static final Precomputed<ImmutableList<ActionAnalysisMetadata>> COVERAGE_REPORT_KEY = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "coverage_report_actions")); + new Precomputed<>(Key.create("coverage_report_actions")); public static final Precomputed<Map<BuildInfoKey, BuildInfoFactory>> BUILD_INFO_FACTORIES = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "build_info_factories")); + new Precomputed<>(Key.create("build_info_factories")); static final Precomputed<ImmutableMap<ActionAnalysisMetadata, ConflictException>> BAD_ACTIONS = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "bad_actions")); + new Precomputed<>(Key.create("bad_actions")); public static final Precomputed<PathPackageLocator> PATH_PACKAGE_LOCATOR = - new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "path_package_locator")); + new Precomputed<>(Key.create("path_package_locator")); private final Object value; @@ -146,14 +148,14 @@ public final class PrecomputedValue implements SkyValue { * <p>Instances do not have internal state. */ public static final class Precomputed<T> { - private final SkyKey key; + private final Key key; - public Precomputed(SkyKey key) { + public Precomputed(Key key) { this.key = key; } @VisibleForTesting - SkyKey getKeyForTesting() { + Key getKeyForTesting() { return key; } @@ -179,4 +181,24 @@ public final class PrecomputedValue implements SkyValue { injectable.inject(key, new PrecomputedValue(value)); } } + + /** {@link SkyKey} for {@code PrecomputedValue}. */ + @AutoCodec + public static class Key extends AbstractSkyKey<String> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(String arg) { + super(arg); + } + + @AutoCodec.Instantiator + public static Key create(String arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.PRECOMPUTED; + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java index 23383680be..4a1b83062c 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternValue.java @@ -14,14 +14,17 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.TargetParsingException; import com.google.devtools.build.lib.cmdline.TargetPattern.Type; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternSkyKeyOrException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.List; @@ -174,16 +177,36 @@ public class PrepareDepsOfPatternValue implements SkyValue { private final TargetPatternKey targetPatternKey; - public PrepareDepsOfPatternSkyKeyValue(TargetPatternKey targetPatternKey) { + PrepareDepsOfPatternSkyKeyValue(TargetPatternKey targetPatternKey) { this.targetPatternKey = targetPatternKey; } - public SkyKey getSkyKey() { - return LegacySkyKey.create(SkyFunctions.PREPARE_DEPS_OF_PATTERN, targetPatternKey); + public Key getSkyKey() { + return Key.create(targetPatternKey); } - public String getOriginalPattern() { - return targetPatternKey.getPattern(); + @AutoCodec + static class Key extends AbstractSkyKey<TargetPatternKey> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(TargetPatternKey arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(TargetPatternKey arg) { + return interner.intern(new Key(arg)); + } + + TargetPatternKey getTargetPatternKey() { + return arg; + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.PREPARE_DEPS_OF_PATTERN; + } } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java index 6c915658f4..037fd7c608 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfPatternsValue.java @@ -16,14 +16,15 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; -import java.io.Serializable; import java.util.Objects; /** @@ -55,22 +56,32 @@ public final class PrepareDepsOfPatternsValue implements SkyValue { } @ThreadSafe - public static SkyKey key(ImmutableList<String> patterns, String offset) { - return LegacySkyKey.create( - SkyFunctions.PREPARE_DEPS_OF_PATTERNS, new TargetPatternSequence(patterns, offset)); + public static TargetPatternSequence key(ImmutableList<String> patterns, String offset) { + return TargetPatternSequence.create(patterns, offset); } /** The argument value for {@link SkyKey}s of {@link PrepareDepsOfPatternsFunction}. */ @ThreadSafe - public static class TargetPatternSequence implements Serializable { + @AutoCodec.VisibleForSerialization + @AutoCodec + static class TargetPatternSequence implements SkyKey { + private static final Interner<TargetPatternSequence> interner = + BlazeInterners.newWeakInterner(); + private final ImmutableList<String> patterns; private final String offset; - public TargetPatternSequence(ImmutableList<String> patterns, String offset) { + private TargetPatternSequence(ImmutableList<String> patterns, String offset) { this.patterns = Preconditions.checkNotNull(patterns); this.offset = Preconditions.checkNotNull(offset); } + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static TargetPatternSequence create(ImmutableList<String> patterns, String offset) { + return interner.intern(new TargetPatternSequence(patterns, offset)); + } + public ImmutableList<String> getPatterns() { return patterns; } @@ -103,6 +114,11 @@ public final class PrepareDepsOfPatternsValue implements SkyValue { .add("offset", offset) .toString(); } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.PREPARE_DEPS_OF_PATTERNS; + } } @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java index 05ef591cbf..d52a9640ad 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryFunction.java @@ -22,7 +22,6 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.pkgcache.FilteringPolicy; import com.google.devtools.build.lib.skyframe.PrepareDepsOfTargetsUnderDirectoryValue.PrepareDepsOfTargetsUnderDirectoryKey; -import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java index 0dcbe302e5..2bc376ece9 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrepareDepsOfTargetsUnderDirectoryValue.java @@ -13,21 +13,22 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; import com.google.devtools.build.lib.pkgcache.FilteringPolicy; -import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; -import java.io.Serializable; import java.util.Objects; /** @@ -61,29 +62,41 @@ public final class PrepareDepsOfTargetsUnderDirectoryValue implements SkyValue { * targets. */ @ThreadSafe - public static SkyKey key(RepositoryName repository, RootedPath rootedPath, - ImmutableSet<PathFragment> excludedPaths, FilteringPolicy filteringPolicy) { - return LegacySkyKey.create( - SkyFunctions.PREPARE_DEPS_OF_TARGETS_UNDER_DIRECTORY, - new PrepareDepsOfTargetsUnderDirectoryKey( - new RecursivePkgKey(repository, rootedPath, excludedPaths), filteringPolicy)); + public static PrepareDepsOfTargetsUnderDirectoryKey key( + RepositoryName repository, + RootedPath rootedPath, + ImmutableSet<PathFragment> excludedPaths, + FilteringPolicy filteringPolicy) { + return PrepareDepsOfTargetsUnderDirectoryKey.create( + new RecursivePkgKey(repository, rootedPath, excludedPaths), filteringPolicy); } /** * The argument value for {@link SkyKey}s of {@link PrepareDepsOfTargetsUnderDirectoryFunction}. */ + @VisibleForTesting @AutoCodec - public static final class PrepareDepsOfTargetsUnderDirectoryKey implements Serializable { + public static final class PrepareDepsOfTargetsUnderDirectoryKey implements SkyKey { + private static final Interner<PrepareDepsOfTargetsUnderDirectoryKey> interners = + BlazeInterners.newWeakInterner(); + private final RecursivePkgKey recursivePkgKey; private final FilteringPolicy filteringPolicy; - @AutoCodec.Instantiator - public PrepareDepsOfTargetsUnderDirectoryKey( + private PrepareDepsOfTargetsUnderDirectoryKey( RecursivePkgKey recursivePkgKey, FilteringPolicy filteringPolicy) { this.recursivePkgKey = Preconditions.checkNotNull(recursivePkgKey); this.filteringPolicy = Preconditions.checkNotNull(filteringPolicy); } + @VisibleForTesting + @AutoCodec.Instantiator + static PrepareDepsOfTargetsUnderDirectoryKey create( + RecursivePkgKey recursivePkgKey, FilteringPolicy filteringPolicy) { + return interners.intern( + new PrepareDepsOfTargetsUnderDirectoryKey(recursivePkgKey, filteringPolicy)); + } + public RecursivePkgKey getRecursivePkgKey() { return recursivePkgKey; } @@ -93,6 +106,11 @@ public final class PrepareDepsOfTargetsUnderDirectoryValue implements SkyValue { } @Override + public SkyFunctionName functionName() { + return SkyFunctions.PREPARE_DEPS_OF_TARGETS_UNDER_DIRECTORY; + } + + @Override public boolean equals(Object o) { if (this == o) { return true; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java index a885befceb..4de261913d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java @@ -25,7 +25,6 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; -import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction.Environment; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java index e46776d94d..2948e4e16d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java @@ -177,8 +177,10 @@ public final class RecursiveFilesystemTraversalFunction implements SkyFunction { // We are free to traverse this directory. Collection<SkyKey> dependentKeys = createRecursiveTraversalKeys(env, traversal); - return resultForDirectory(traversal, rootInfo, - traverseChildren(env, dependentKeys, /*inline=*/traversal.isGenerated)); + return resultForDirectory( + traversal, + rootInfo, + traverseChildren(env, dependentKeys, /*inline=*/ traversal.isRootGenerated)); } catch (IOException e) { throw new RecursiveFilesystemTraversalFunctionException( new FileOperationException("Error while traversing fileset: " + e.getMessage())); @@ -219,7 +221,7 @@ public final class RecursiveFilesystemTraversalFunction implements SkyFunction { private static FileInfo lookUpFileInfo(Environment env, TraversalRequest traversal) throws MissingDepException, IOException, InterruptedException { - if (traversal.isGenerated) { + if (traversal.isRootGenerated) { byte[] digest = null; if (traversal.root.getOutputArtifact() != null) { Artifact artifact = traversal.root.getOutputArtifact(); @@ -360,7 +362,7 @@ public final class RecursiveFilesystemTraversalFunction implements SkyFunction { PackageLookupValue.key(traversal.root.asRootedPath().getRootRelativePath())); if (pkgLookup.packageExists()) { - if (traversal.isGenerated) { + if (traversal.isRootGenerated) { // The traversal's root was a generated directory, but its root-relative path conflicts with // an existing package. return PkgLookupResult.conflict(traversal, rootInfo); @@ -394,7 +396,7 @@ public final class RecursiveFilesystemTraversalFunction implements SkyFunction { // Use the traversal's path, even if it's a symlink. The contents of the directory, as listed // in the result, must be relative to it. Iterable<Dirent> dirents; - if (traversal.isGenerated) { + if (traversal.isRootGenerated) { // If we're dealing with an output file, read the directory directly instead of creating // filesystem nodes under the output tree. List<Dirent> direntsCollection = @@ -414,7 +416,7 @@ public final class RecursiveFilesystemTraversalFunction implements SkyFunction { traversal.root.asRootedPath().getRoot(), traversal.root.asRootedPath().getRootRelativePath().getRelative(dirent.getName())); TraversalRequest childTraversal = traversal.forChildEntry(childPath); - result.add(RecursiveFilesystemTraversalValue.key(childTraversal)); + result.add(childTraversal); } return result; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java index 7a1a269808..8d16da6439 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalValue.java @@ -17,17 +17,20 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.actions.FilesetTraversalParams.DirectTraversalRoot; import com.google.devtools.build.lib.actions.FilesetTraversalParams.PackageBoundaryMode; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalFunction.DanglingSymlinkException; import com.google.devtools.build.lib.skyframe.RecursiveFilesystemTraversalFunction.FileType; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import javax.annotation.Nullable; @@ -102,12 +105,10 @@ public final class RecursiveFilesystemTraversalValue implements SkyValue { return resolvedPaths; } - public static SkyKey key(TraversalRequest traversal) { - return LegacySkyKey.create(SkyFunctions.RECURSIVE_FILESYSTEM_TRAVERSAL, traversal); - } - /** The parameters of a file or directory traversal. */ - public static final class TraversalRequest { + @AutoCodec + public static final class TraversalRequest implements SkyKey { + private static final Interner<TraversalRequest> interner = BlazeInterners.newWeakInterner(); /** The path to start the traversal from; may be a file, a directory or a symlink. */ final DirectTraversalRoot root; @@ -118,7 +119,7 @@ public final class RecursiveFilesystemTraversalValue implements SkyValue { * <p>Such paths and all their subdirectories are assumed not to define packages, so package * lookup for them is skipped. */ - final boolean isGenerated; + final boolean isRootGenerated; /** Whether traversal should descend into directories that are roots of subpackages. */ final PackageBoundaryMode crossPkgBoundaries; @@ -135,20 +136,36 @@ public final class RecursiveFilesystemTraversalValue implements SkyValue { /** Information to be attached to any error messages that may be reported. */ @Nullable final String errorInfo; - public TraversalRequest(DirectTraversalRoot root, boolean isRootGenerated, - PackageBoundaryMode crossPkgBoundaries, boolean skipTestingForSubpackage, + private TraversalRequest( + DirectTraversalRoot root, + boolean isRootGenerated, + PackageBoundaryMode crossPkgBoundaries, + boolean skipTestingForSubpackage, @Nullable String errorInfo) { this.root = root; - this.isGenerated = isRootGenerated; + this.isRootGenerated = isRootGenerated; this.crossPkgBoundaries = crossPkgBoundaries; this.skipTestingForSubpackage = skipTestingForSubpackage; this.errorInfo = errorInfo; } + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static TraversalRequest create( + DirectTraversalRoot root, + boolean isRootGenerated, + PackageBoundaryMode crossPkgBoundaries, + boolean skipTestingForSubpackage, + @Nullable String errorInfo) { + return interner.intern( + new TraversalRequest( + root, isRootGenerated, crossPkgBoundaries, skipTestingForSubpackage, errorInfo)); + } + private TraversalRequest duplicate(DirectTraversalRoot newRoot, boolean newSkipTestingForSubpackage) { - return new TraversalRequest(newRoot, isGenerated, crossPkgBoundaries, - newSkipTestingForSubpackage, errorInfo); + return create( + newRoot, isRootGenerated, crossPkgBoundaries, newSkipTestingForSubpackage, errorInfo); } /** Creates a new request to traverse a child element in the current directory (the root). */ @@ -178,22 +195,28 @@ public final class RecursiveFilesystemTraversalValue implements SkyValue { return false; } TraversalRequest o = (TraversalRequest) obj; - return root.equals(o.root) && isGenerated == o.isGenerated + return root.equals(o.root) + && isRootGenerated == o.isRootGenerated && crossPkgBoundaries == o.crossPkgBoundaries && skipTestingForSubpackage == o.skipTestingForSubpackage; } @Override public int hashCode() { - return Objects.hashCode(root, isGenerated, crossPkgBoundaries, skipTestingForSubpackage); + return Objects.hashCode(root, isRootGenerated, crossPkgBoundaries, skipTestingForSubpackage); } @Override public String toString() { return String.format( "TraversalParams(root=%s, is_generated=%d, skip_testing_for_subpkg=%d," - + " pkg_boundaries=%s)", root, isGenerated ? 1 : 0, - skipTestingForSubpackage ? 1 : 0, crossPkgBoundaries); + + " pkg_boundaries=%s)", + root, isRootGenerated ? 1 : 0, skipTestingForSubpackage ? 1 : 0, crossPkgBoundaries); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.RECURSIVE_FILESYSTEM_TRAVERSAL; } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java index 8430c286a5..64c27dc97d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgFunction.java @@ -20,7 +20,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; import com.google.devtools.build.lib.packages.NoSuchPackageException; -import com.google.devtools.build.lib.skyframe.RecursivePkgValue.RecursivePkgKey; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgKey.java new file mode 100644 index 0000000000..9a5a12f1b3 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgKey.java @@ -0,0 +1,89 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.skyframe; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.vfs.PathFragment; +import com.google.devtools.build.lib.vfs.RootedPath; +import java.util.Objects; + +/** + * A RecursivePkgKey is a tuple of a {@link RootedPath}, {@code rootedPath}, defining the directory + * to recurse beneath in search of packages, and an {@link ImmutableSet} of {@link PathFragment}s, + * {@code excludedPaths}, relative to {@code rootedPath.getRoot}, defining the set of subdirectories + * strictly beneath {@code rootedPath} to skip. + * + * <p>Throws {@link IllegalArgumentException} if {@code excludedPaths} contains any paths that are + * equal to {@code rootedPath} or that are not beneath {@code rootedPath}. + */ +@ThreadSafe +@AutoCodec +public class RecursivePkgKey { + private final RepositoryName repositoryName; + private final RootedPath rootedPath; + private final ImmutableSet<PathFragment> excludedPaths; + + public RecursivePkgKey( + RepositoryName repositoryName, + RootedPath rootedPath, + ImmutableSet<PathFragment> excludedPaths) { + PathFragment.checkAllPathsAreUnder(excludedPaths, rootedPath.getRootRelativePath()); + Preconditions.checkState(!repositoryName.isDefault()); + this.repositoryName = repositoryName; + this.rootedPath = Preconditions.checkNotNull(rootedPath); + this.excludedPaths = Preconditions.checkNotNull(excludedPaths); + } + + public RepositoryName getRepository() { + return repositoryName; + } + + public RootedPath getRootedPath() { + return rootedPath; + } + + public ImmutableSet<PathFragment> getExcludedPaths() { + return excludedPaths; + } + + @Override + public String toString() { + return "rootedPath=" + rootedPath + ", excludedPaths=<omitted>"; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof RecursivePkgKey)) { + return false; + } + + RecursivePkgKey that = (RecursivePkgKey) o; + return excludedPaths.equals(that.excludedPaths) + && rootedPath.equals(that.rootedPath) + && repositoryName.equals(that.repositoryName); + } + + @Override + public int hashCode() { + return Objects.hash(rootedPath, excludedPaths, repositoryName); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java new file mode 100644 index 0000000000..c83825f46d --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgSkyKey.java @@ -0,0 +1,49 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.devtools.build.lib.skyframe; + +import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.vfs.PathFragment; +import com.google.devtools.build.lib.vfs.RootedPath; +import com.google.devtools.build.skyframe.SkyKey; + +/** Common parent class of SkyKeys that wrap a {@link RecursivePkgKey}. */ +abstract class RecursivePkgSkyKey extends RecursivePkgKey implements SkyKey { + RecursivePkgSkyKey( + RepositoryName repositoryName, + RootedPath rootedPath, + ImmutableSet<PathFragment> excludedPaths) { + super(repositoryName, rootedPath, excludedPaths); + } + + @Override + public String toString() { + return functionName() + " " + super.toString(); + } + + @Override + public boolean equals(Object o) { + return super.equals(o) + && ((o instanceof RecursivePkgSkyKey)) + && ((RecursivePkgSkyKey) o).functionName().equals(functionName()); + } + + /** Don't bother to memoize hashCode because {@link RecursivePkgKey#hashCode} is cheap enough. */ + @Override + public int hashCode() { + return 37 * super.hashCode() + functionName().hashCode(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java index 7397a7a918..d864c024d3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursivePkgValue.java @@ -13,22 +13,20 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; -import java.io.Serializable; -import java.util.Objects; /** * This value represents the result of looking up all the packages under a given package path root, @@ -54,81 +52,43 @@ public class RecursivePkgValue implements SkyValue { return new RecursivePkgValue(packages.build()); } - /** - * Create a transitive package lookup request. - */ + /** Create a transitive package lookup request. */ @ThreadSafe - public static SkyKey key(RepositoryName repositoryName, RootedPath rootedPath, + public static Key key( + RepositoryName repositoryName, + RootedPath rootedPath, ImmutableSet<PathFragment> excludedPaths) { - return LegacySkyKey.create( - SkyFunctions.RECURSIVE_PKG, new RecursivePkgKey(repositoryName, rootedPath, excludedPaths)); + return Key.create(repositoryName, rootedPath, excludedPaths); } public NestedSet<String> getPackages() { return packages; } - /** - * A RecursivePkgKey is a tuple of a {@link RootedPath}, {@code rootedPath}, defining the - * directory to recurse beneath in search of packages, and an {@link ImmutableSet} of {@link - * PathFragment}s, {@code excludedPaths}, relative to {@code rootedPath.getRoot}, defining the set - * of subdirectories strictly beneath {@code rootedPath} to skip. - * - * <p>Throws {@link IllegalArgumentException} if {@code excludedPaths} contains any paths that are - * equal to {@code rootedPath} or that are not beneath {@code rootedPath}. - */ + @AutoCodec.VisibleForSerialization @AutoCodec - @ThreadSafe - public static final class RecursivePkgKey implements Serializable { - private final RepositoryName repositoryName; - private final RootedPath rootedPath; - private final ImmutableSet<PathFragment> excludedPaths; + static class Key extends RecursivePkgSkyKey { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); - @AutoCodec.Instantiator - public RecursivePkgKey( + private Key( RepositoryName repositoryName, RootedPath rootedPath, ImmutableSet<PathFragment> excludedPaths) { - PathFragment.checkAllPathsAreUnder(excludedPaths, rootedPath.getRootRelativePath()); - Preconditions.checkState(!repositoryName.isDefault()); - this.repositoryName = repositoryName; - this.rootedPath = Preconditions.checkNotNull(rootedPath); - this.excludedPaths = Preconditions.checkNotNull(excludedPaths); + super(repositoryName, rootedPath, excludedPaths); } - public RepositoryName getRepository() { - return repositoryName; - } - - public RootedPath getRootedPath() { - return rootedPath; - } - - public ImmutableSet<PathFragment> getExcludedPaths() { - return excludedPaths; - } - - @Override - public String toString() { - return "rootedPath=" + rootedPath + ", excludedPaths=<omitted>"; - } - - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof RecursivePkgKey)) { - return false; - } - - RecursivePkgKey that = (RecursivePkgKey) o; - return excludedPaths.equals(that.excludedPaths) && rootedPath.equals(that.rootedPath); + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create( + RepositoryName repositoryName, + RootedPath rootedPath, + ImmutableSet<PathFragment> excludedPaths) { + return interner.intern(new Key(repositoryName, rootedPath, excludedPaths)); } @Override - public int hashCode() { - return Objects.hash(rootedPath, excludedPaths); + public SkyFunctionName functionName() { + return SkyFunctions.RECURSIVE_PKG; } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java index a09d839654..ef4cebc9ae 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RepositoryValue.java @@ -16,11 +16,14 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Objects; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.RepositoryName; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.Path; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; /** A repository's name and directory. */ @@ -121,7 +124,28 @@ public abstract class RepositoryValue implements SkyValue { return new NoRepositoryValue(repositoryName); } - public static SkyKey key(RepositoryName repositoryName) { - return LegacySkyKey.create(SkyFunctions.REPOSITORY, repositoryName); + public static Key key(RepositoryName repositoryName) { + return Key.create(repositoryName); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RepositoryName> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RepositoryName arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RepositoryName arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.REPOSITORY; + } } } 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 ab98da4641..61f9eb5be2 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 @@ -91,7 +91,6 @@ import com.google.devtools.build.skyframe.BuildDriver; import com.google.devtools.build.skyframe.Differencer; import com.google.devtools.build.skyframe.InMemoryMemoizingEvaluator; import com.google.devtools.build.skyframe.Injectable; -import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.MemoizingEvaluator.EvaluatorSupplier; import com.google.devtools.build.skyframe.NodeEntry; import com.google.devtools.build.skyframe.RecordingDifferencer; @@ -364,7 +363,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { envToCheck.addAll(clientEnv.get().keySet()); previousClientEnvironment = clientEnv.get().keySet(); for (String env : envToCheck) { - SkyKey key = LegacySkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, env); + SkyKey key = ClientEnvironmentFunction.key(env); if (values.containsKey(key)) { String value = ((ClientEnvironmentValue) values.get(key)).getValue(); String newValue = clientEnv.get().get(env); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java index f861ba78a6..878f1eba55 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupValue.java @@ -14,13 +14,15 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.syntax.Environment.Extension; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; -import java.io.Serializable; import java.util.Objects; /** @@ -63,17 +65,33 @@ public class SkylarkImportLookupValue implements SkyValue { * loaded from the WORKSPACE file or from a BUILD file. */ @Immutable - public static final class SkylarkImportLookupKey implements Serializable { + @AutoCodec.VisibleForSerialization + @AutoCodec + static final class SkylarkImportLookupKey implements SkyKey { + private static final Interner<SkylarkImportLookupKey> interner = + BlazeInterners.newWeakInterner(); + public final Label importLabel; public final boolean inWorkspace; - public SkylarkImportLookupKey(Label importLabel, boolean inWorkspace) { + private SkylarkImportLookupKey(Label importLabel, boolean inWorkspace) { Preconditions.checkNotNull(importLabel); Preconditions.checkArgument(!importLabel.getPackageIdentifier().getRepository().isDefault()); this.importLabel = importLabel; this.inWorkspace = inWorkspace; } + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static SkylarkImportLookupKey create(Label importLabel, boolean inWorkspace) { + return interner.intern(new SkylarkImportLookupKey(importLabel, inWorkspace)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.SKYLARK_IMPORTS_LOOKUP; + } + @Override public String toString() { return importLabel + (inWorkspace ? " (in workspace)" : ""); @@ -99,8 +117,7 @@ public class SkylarkImportLookupValue implements SkyValue { } static SkyKey key(Label importLabel, boolean inWorkspace) { - return LegacySkyKey.create( - SkyFunctions.SKYLARK_IMPORTS_LOOKUP, new SkylarkImportLookupKey(importLabel, inWorkspace)); + return SkylarkImportLookupKey.create(importLabel, inWorkspace); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java index 7af9887252..caf37202c3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerValue.java @@ -14,12 +14,14 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; /** @@ -47,8 +49,29 @@ public final class TargetMarkerValue implements SkyValue { } @ThreadSafe - public static SkyKey key(Label label) { + public static Key key(Label label) { Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault()); - return LegacySkyKey.create(SkyFunctions.TARGET_MARKER, label); + return Key.create(label); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<Label> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(Label arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(Label arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.TARGET_MARKER; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java index cf21520c85..e03d732524 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternErrorFunction.java @@ -13,11 +13,15 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.common.collect.Interner; import com.google.devtools.build.lib.cmdline.TargetParsingException; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.skyframe.AbstractSkyKey; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import javax.annotation.Nullable; @@ -33,8 +37,29 @@ import javax.annotation.Nullable; public class TargetPatternErrorFunction implements SkyFunction { // We pass in the error message, which isn't ideal. We could consider reparsing the original // pattern instead, but that requires more information. - public static SkyKey key(String errorMessage) { - return LegacySkyKey.create(SkyFunctions.TARGET_PATTERN_ERROR, errorMessage); + public static Key key(String errorMessage) { + return Key.create(errorMessage); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<String> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(String arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(String arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.TARGET_PATTERN_ERROR; + } } @Nullable diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TestCompletionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TestCompletionValue.java index b435720123..20a4dc9e3e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TestCompletionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TestCompletionValue.java @@ -14,11 +14,13 @@ package com.google.devtools.build.lib.skyframe; import com.google.auto.value.AutoValue; -import com.google.common.base.Function; +import com.google.common.collect.Interner; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.TopLevelArtifactContext; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Collection; @@ -36,9 +38,7 @@ public class TestCompletionValue implements SkyValue { ConfiguredTargetKey lac, final TopLevelArtifactContext topLevelArtifactContext, final boolean exclusiveTesting) { - return LegacySkyKey.create( - SkyFunctions.TEST_COMPLETION, - TestCompletionKey.create(lac, topLevelArtifactContext, exclusiveTesting)); + return TestCompletionKey.create(lac, topLevelArtifactContext, exclusiveTesting); } public static Iterable<SkyKey> keys(Collection<ConfiguredTarget> targets, @@ -46,31 +46,35 @@ public class TestCompletionValue implements SkyValue { final boolean exclusiveTesting) { return Iterables.transform( targets, - new Function<ConfiguredTarget, SkyKey>() { - @Override - public SkyKey apply(ConfiguredTarget ct) { - return LegacySkyKey.create( - SkyFunctions.TEST_COMPLETION, - TestCompletionKey.create( - ConfiguredTargetKey.of(ct), topLevelArtifactContext, exclusiveTesting)); - } - }); + ct -> + TestCompletionKey.create( + ConfiguredTargetKey.of(ct), topLevelArtifactContext, exclusiveTesting)); } + @AutoCodec @AutoValue - abstract static class TestCompletionKey { + abstract static class TestCompletionKey implements SkyKey { + private static final Interner<TestCompletionKey> interner = BlazeInterners.newWeakInterner(); - public static TestCompletionKey create( + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static TestCompletionKey create( ConfiguredTargetKey configuredTargetKey, TopLevelArtifactContext topLevelArtifactContext, boolean exclusiveTesting) { - return new AutoValue_TestCompletionValue_TestCompletionKey( - configuredTargetKey, topLevelArtifactContext, exclusiveTesting); + return interner.intern( + new AutoValue_TestCompletionValue_TestCompletionKey( + configuredTargetKey, topLevelArtifactContext, exclusiveTesting)); } abstract ConfiguredTargetKey configuredTargetKey(); public abstract TopLevelArtifactContext topLevelArtifactContext(); public abstract boolean exclusiveTesting(); + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.TEST_COMPLETION; + } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java index 9c18193f1f..7011784f7d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTValue.java @@ -15,10 +15,13 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.syntax.BuildFileAST; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; -import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.AbstractSkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyValue; import java.util.List; @@ -56,8 +59,28 @@ public class WorkspaceASTValue implements SkyValue { return asts; } - public static SkyKey key(RootedPath path) { - return LegacySkyKey.create(SkyFunctions.WORKSPACE_AST, path); + public static Key key(RootedPath path) { + return Key.create(path); } -} + @AutoCodec.VisibleForSerialization + @AutoCodec + static class Key extends AbstractSkyKey<RootedPath> { + private static final Interner<Key> interner = BlazeInterners.newWeakInterner(); + + private Key(RootedPath arg) { + super(arg); + } + + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static Key create(RootedPath arg) { + return interner.intern(new Key(arg)); + } + + @Override + public SkyFunctionName functionName() { + return SkyFunctions.WORKSPACE_AST; + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java index c74fe4a141..83d909deca 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceFileValue.java @@ -16,12 +16,15 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.Package; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.syntax.Environment.Extension; import com.google.devtools.build.lib.vfs.RootedPath; -import com.google.devtools.build.skyframe.LegacySkyKey; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Map; @@ -34,24 +37,26 @@ import java.util.Objects; */ public class WorkspaceFileValue implements SkyValue { - /** - * Argument for the SkyKey to request a WorkspaceFileValue. - */ + /** Argument for the SkyKey to request a WorkspaceFileValue. */ @Immutable - public static class WorkspaceFileKey { + @AutoCodec + public static class WorkspaceFileKey implements SkyKey { + private static final Interner<WorkspaceFileKey> interner = BlazeInterners.newWeakInterner(); + private final RootedPath path; private final int idx; - /** - * Creates a Key for the WorkspaceFileFunction. The path to the workspace file is specified - * by {@code path}. This key will ask WorkspaceFileFunction to get the {@code idx+1}-th part of - * the workspace file (so idx = 0 represents the first part, idx = 1, the second part, etc...). - */ - public WorkspaceFileKey(RootedPath path, int idx) { + private WorkspaceFileKey(RootedPath path, int idx) { this.path = path; this.idx = idx; } + @AutoCodec.VisibleForSerialization + @AutoCodec.Instantiator + static WorkspaceFileKey create(RootedPath path, int idx) { + return interner.intern(new WorkspaceFileKey(path, idx)); + } + public RootedPath getPath() { return path; } @@ -61,6 +66,11 @@ public class WorkspaceFileValue implements SkyValue { } @Override + public SkyFunctionName functionName() { + return SkyFunctions.WORKSPACE_FILE; + } + + @Override public boolean equals(Object obj) { if (this == obj) { return true; @@ -134,8 +144,13 @@ public class WorkspaceFileValue implements SkyValue { return "<WorkspaceFileValue path=" + path + " idx=" + idx + ">"; } - static SkyKey key(RootedPath path, int idx) { - return LegacySkyKey.create(SkyFunctions.WORKSPACE_FILE, new WorkspaceFileKey(path, idx)); + /** + * Creates a Key for the WorkspaceFileFunction. The path to the workspace file is specified by + * {@code path}. This key will ask WorkspaceFileFunction to get the {@code idx+1}-th part of the + * workspace file (so idx = 0 represents the first part, idx = 1, the second part, etc...). + */ + static WorkspaceFileKey key(RootedPath path, int idx) { + return WorkspaceFileKey.create(path, idx); } public static SkyKey key(RootedPath path) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java index ea0bd94b3a..b16246458b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceNameValue.java @@ -15,7 +15,6 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Objects; @@ -29,8 +28,8 @@ import java.util.Objects; * the WORKSPACE file. */ public class WorkspaceNameValue implements SkyValue { - private static final SkyKey KEY = - LegacySkyKey.create(SkyFunctions.WORKSPACE_NAME, DummyArgument.INSTANCE); + @AutoCodec @AutoCodec.VisibleForSerialization + static final SkyKey KEY = () -> SkyFunctions.WORKSPACE_NAME; private final String workspaceName; @@ -73,28 +72,4 @@ public class WorkspaceNameValue implements SkyValue { public String toString() { return String.format("WorkspaceNameValue[name=%s]", workspaceName); } - - /** Singleton class used as the {@link SkyKey#argument} for {@link WorkspaceNameValue#key}. */ - public static final class DummyArgument { - static final int HASHCODE = DummyArgument.class.getCanonicalName().hashCode(); - @AutoCodec public static final DummyArgument INSTANCE = new DummyArgument(); - - private DummyArgument() { - } - - @Override - public boolean equals(Object obj) { - return obj instanceof DummyArgument; - } - - @Override - public int hashCode() { - return HASHCODE; - } - - @Override - public String toString() { - return "#"; - } - } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/CodecScanner.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/CodecScanner.java index 1b387134a5..1a44467ba6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/CodecScanner.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/CodecScanner.java @@ -96,7 +96,8 @@ public class CodecScanner { e); } try { - builder.addConstant(field.get(null)); + builder.addConstant( + Preconditions.checkNotNull(field.get(null), "%s %s", field, type)); } catch (IllegalAccessException e) { throw new IllegalStateException( "Could not access field " + field + " for " + type, e); |