Make SkyKey an interface, and start the migration of not creating SkyKey wrapper objects: for OwnedArtifacts, which are the most numerous during builds, and for Labels for TransitiveTraversalValues, which are the most numerous during queries. PiperOrigin-RevId: 154989520
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 7d6d258..2e26cb3 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -592,6 +592,7 @@ "//src/main/java/com/google/devtools/build/lib/causes", "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:extra_actions_base_java_proto", "//src/main/protobuf:invocation_policy_java_proto", @@ -650,6 +651,7 @@ "//src/main/java/com/google/devtools/build/lib/rules/objc", "//src/main/java/com/google/devtools/build/lib/rules/platform", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:crosstool_config_java_proto", "//third_party:android_common_25_0_0", @@ -690,7 +692,7 @@ "//src/main/java/com/google/devtools/build/lib/ssd", "//src/main/java/com/google/devtools/build/lib/standalone", "//src/main/java/com/google/devtools/build/lib/worker", - "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//third_party:guava", "//third_party:jsr305", @@ -754,6 +756,7 @@ "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//third_party:aether", "//third_party:apache_commons_compress", @@ -1115,6 +1118,7 @@ "//src/main/java/com/google/devtools/build/lib/query2:query-engine", "//src/main/java/com/google/devtools/build/lib/query2:query-output", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:build_java_proto", "//src/main/protobuf:command_server_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java index b8c105f..9fdbe1c 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.util.Preconditions; +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; @@ -210,7 +211,7 @@ protected abstract SkyFunctionName getType(); protected SkyKey getSkyKeyInternal() { - return SkyKey.create(getType(), this); + return LegacySkyKey.create(getType(), this); } /**
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BUILD b/src/main/java/com/google/devtools/build/lib/actions/BUILD index ce36aeb..c38671b 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/BUILD +++ b/src/main/java/com/google/devtools/build/lib/actions/BUILD
@@ -24,6 +24,7 @@ "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto", "//src/main/java/com/google/devtools/build/lib/causes", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:extra_actions_base_java_proto", "//third_party:auto_value",
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 dd5a350..a4c7576 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
@@ -17,12 +17,11 @@ import com.google.common.base.Objects; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - -import org.apache.maven.settings.Server; - import java.util.Arrays; +import org.apache.maven.settings.Server; /** * A Maven repository's identifier. @@ -37,7 +36,7 @@ public static SkyKey key(String serverName) { Preconditions.checkNotNull(serverName); - return SkyKey.create(MavenServerFunction.NAME, serverName); + return LegacySkyKey.create(MavenServerFunction.NAME, serverName); } public static MavenServerValue createFromUrl(String url) {
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD index 06660e7..5e3353c 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/BUILD +++ b/src/main/java/com/google/devtools/build/lib/cmdline/BUILD
@@ -18,6 +18,7 @@ "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib:util", "//src/main/java/com/google/devtools/build/lib:vfs", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//third_party:guava", "//third_party:jsr305", ],
diff --git a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java index ef62fc1..3767ed7 100644 --- a/src/main/java/com/google/devtools/build/lib/cmdline/Label.java +++ b/src/main/java/com/google/devtools/build/lib/cmdline/Label.java
@@ -29,6 +29,8 @@ import com.google.devtools.build.lib.util.StringCanonicalizer; import com.google.devtools.build.lib.util.StringUtilities; import com.google.devtools.build.lib.vfs.PathFragment; +import com.google.devtools.build.skyframe.SkyFunctionName; +import com.google.devtools.build.skyframe.SkyKey; import java.io.IOException; import java.io.InvalidObjectException; import java.io.ObjectInputStream; @@ -50,7 +52,7 @@ ) @Immutable @ThreadSafe -public final class Label implements Comparable<Label>, Serializable, SkylarkPrintableValue { +public final class Label implements Comparable<Label>, Serializable, SkylarkPrintableValue, SkyKey { public static final PathFragment EXTERNAL_PACKAGE_NAME = PathFragment.create("external"); public static final PathFragment EXTERNAL_PACKAGE_FILE_NAME = PathFragment.create("WORKSPACE"); public static final String DEFAULT_REPOSITORY_DIRECTORY = "__main__"; @@ -73,6 +75,8 @@ PackageIdentifier.createInMainRepo(EXTERNAL_PACKAGE_NAME); public static final PathFragment EXTERNAL_PATH_PREFIX = PathFragment.create("external"); + public static final SkyFunctionName TRANSITIVE_TRAVERSAL = + SkyFunctionName.create("TRANSITIVE_TRAVERSAL"); private static final Interner<Label> LABEL_INTERNER = BlazeInterners.newWeakInterner(); @@ -511,6 +515,16 @@ } @Override + public SkyFunctionName functionName() { + return TRANSITIVE_TRAVERSAL; + } + + @Override + public Label argument() { + return this; + } + + @Override public int hashCode() { return hashCode; }
diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD index ad8f266..72fb496 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/BUILD +++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD
@@ -15,6 +15,7 @@ "//src/main/java/com/google/devtools/build/lib:util", "//src/main/java/com/google/devtools/build/lib:vfs", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//third_party:guava", "//third_party:jsr305", ],
diff --git a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java index c047467..631afcb 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/SkyQueryEnvironment.java
@@ -68,8 +68,6 @@ import com.google.devtools.build.lib.query2.engine.KeyExtractor; import com.google.devtools.build.lib.query2.engine.MinDepthUniquifier; import com.google.devtools.build.lib.query2.engine.OutputFormatterCallback; -import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryTaskCallable; -import com.google.devtools.build.lib.query2.engine.QueryEnvironment.QueryTaskFuture; import com.google.devtools.build.lib.query2.engine.QueryEvalResult; import com.google.devtools.build.lib.query2.engine.QueryException; import com.google.devtools.build.lib.query2.engine.QueryExpression; @@ -906,7 +904,7 @@ @Override public Label apply(SkyKey skyKey) { SkyFunctionName functionName = skyKey.functionName(); - if (!functionName.equals(SkyFunctions.TRANSITIVE_TRAVERSAL)) { + if (!functionName.equals(Label.TRANSITIVE_TRAVERSAL)) { // Skip non-targets. return null; }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD index 197ade4..15011dc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/BUILD
@@ -26,6 +26,7 @@ "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/rules/apple", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:crosstool_config_java_proto", "//src/main/protobuf:extra_actions_base_java_proto",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportValue.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportValue.java index eb03db6..90ee932 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportValue.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupportValue.java
@@ -17,10 +17,10 @@ import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.view.config.crosstool.CrosstoolConfig.LipoMode; +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; /** @@ -96,6 +96,6 @@ } public static SkyKey key(LipoMode lipoMode, Path fdoZip, PathFragment fdoInstrument) { - return SkyKey.create(SKYFUNCTION, new Key(lipoMode, fdoZip, fdoInstrument)); + return LegacySkyKey.create(SKYFUNCTION, new Key(lipoMode, fdoZip, fdoInstrument)); } }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/BUILD b/src/main/java/com/google/devtools/build/lib/rules/genquery/BUILD index 959cf58..f59b4ee 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genquery/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/BUILD
@@ -21,6 +21,7 @@ "//src/main/java/com/google/devtools/build/lib/query2:query-engine", "//src/main/java/com/google/devtools/build/lib/query2:query-output", "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", "//third_party:guava", "//third_party:jsr305",
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 a53c57c..d044aaf 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
@@ -73,6 +73,7 @@ import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.util.Preconditions; 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; @@ -96,7 +97,7 @@ private static final QueryEnvironmentFactory QUERY_ENVIRONMENT_FACTORY = new QueryEnvironmentFactory(); public static final Precomputed<ImmutableList<OutputFormatter>> QUERY_OUTPUT_FORMATTERS = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "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 1cafeb7..f95329e 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
@@ -32,6 +32,7 @@ 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.SkyFunctionException; import com.google.devtools.build.skyframe.SkyFunctionException.Transience; @@ -53,7 +54,7 @@ */ public final class RepositoryDelegatorFunction implements SkyFunction { public static final Precomputed<Map<RepositoryName, PathFragment>> REPOSITORY_OVERRIDES = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "repository_overrides")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "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 4d073d5..6e21ad5 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
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.skyframe.DirectoryListingValue; import com.google.devtools.build.lib.skyframe.SkyFunctions; 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.SkyValue; import java.util.Arrays; @@ -124,7 +125,7 @@ /** Creates a key from the given repository name. */ public static SkyKey key(RepositoryName repository) { - return SkyKey.create(SkyFunctions.REPOSITORY_DIRECTORY, repository); + return LegacySkyKey.create(SkyFunctions.REPOSITORY_DIRECTORY, repository); } 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 fa425bc..9fa3809 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
@@ -17,6 +17,7 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.syntax.BuildFileAST; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -95,6 +96,6 @@ } public static SkyKey key(Label astFileLabel) { - return SkyKey.create(SkyFunctions.AST_FILE_LOOKUP, astFileLabel); + return LegacySkyKey.create(SkyFunctions.AST_FILE_LOOKUP, astFileLabel); } }
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 ea4cde0..efc6c9a 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,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; +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.SkyValue; @@ -44,12 +45,12 @@ if (actionEnv.containsKey(key) && actionEnv.get(key) != null) { return new ClientEnvironmentValue(actionEnv.get(key)); } - return env.getValue(SkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, key)); + return env.getValue(LegacySkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, key)); } /** @return the SkyKey to invoke this function for the environment variable {@code variable}. */ public static SkyKey key(String variable) { - return SkyKey.create(SkyFunctions.ACTION_ENVIRONMENT_VARIABLE, variable); + return LegacySkyKey.create(SkyFunctions.ACTION_ENVIRONMENT_VARIABLE, 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 213ceec..1b4bb29 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,6 +43,7 @@ import com.google.devtools.build.lib.util.Preconditions; 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; @@ -91,7 +92,7 @@ new Function<String, SkyKey>() { @Override public SkyKey apply(String var) { - return SkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, var); + return LegacySkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, var); } };
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java index 3d71d1b..080c104 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Map; @@ -132,7 +133,8 @@ @ThreadSafe @VisibleForTesting public static SkyKey key(SkyKey lookupKey, int index) { - return SkyKey.create(SkyFunctions.ACTION_EXECUTION, new ActionLookupData(lookupKey, index)); + return LegacySkyKey.create( + SkyFunctions.ACTION_EXECUTION, new ActionLookupData(lookupKey, index)); } @Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java index 22e9b7f..18f7aaa 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java
@@ -20,6 +20,7 @@ import com.google.devtools.build.lib.analysis.actions.ActionTemplate; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -36,9 +37,8 @@ } static SkyKey key(ActionTemplate<?> actionTemplate) { - return SkyKey.create( - SkyFunctions.ACTION_TEMPLATE_EXPANSION, - createActionTemplateExpansionKey(actionTemplate)); + return LegacySkyKey.create( + SkyFunctions.ACTION_TEMPLATE_EXPANSION, createActionTemplateExpansionKey(actionTemplate)); } static ActionTemplateExpansionKey createActionTemplateExpansionKey(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java index 4fa5d95..770fecc 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactSkyKey.java
@@ -15,11 +15,14 @@ import com.google.common.base.Function; import com.google.common.collect.Collections2; +import com.google.common.collect.Interner; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; +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.util.Preconditions; +import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import java.util.Collection; @@ -36,12 +39,13 @@ @Immutable @ThreadSafe public final class ArtifactSkyKey { + private static final Interner<OwnedArtifact> INTERNER = BlazeInterners.newWeakInterner(); + private ArtifactSkyKey() {} @ThreadSafe public static SkyKey key(Artifact artifact, boolean isMandatory) { - return SkyKey.create( - SkyFunctions.ARTIFACT, + return INTERNER.intern( artifact.isSourceArtifact() ? new OwnedArtifact(artifact, isMandatory) : new OwnedArtifact(artifact)); @@ -98,10 +102,16 @@ * since outside of Skyframe it is quite crucial that Artifacts with different owners be able to * compare equal. */ - static class OwnedArtifact { + static class OwnedArtifact implements SkyKey { private final Artifact artifact; // Always true for derived artifacts. private final boolean isMandatory; + // TODO(janakr): we may want to remove this field in the future. The expensive hash computation + // is already cached one level down (in the Artifact), so the CPU overhead here may not be + // worth the memory. However, when running with +CompressedOops, this field is free, so we leave + // it. When running with -CompressedOops, we might be able to save memory by using polymorphism + // for isMandatory and dropping this field. + private int hashCode = 0; /** Constructs an OwnedArtifact wrapper for a source artifact. */ private OwnedArtifact(Artifact sourceArtifact, boolean mandatory) { @@ -124,7 +134,41 @@ } @Override + public SkyFunctionName functionName() { + return SkyFunctions.ARTIFACT; + } + + @Override + public OwnedArtifact argument() { + return this; + } + + @Override public int hashCode() { + // We use the hash code caching strategy employed by java.lang.String. There are three subtle + // things going on here: + // + // (1) We use a value of 0 to indicate that the hash code hasn't been computed and cached yet. + // Yes, this means that if the hash code is really 0 then we will "recompute" it each time. + // But this isn't a problem in practice since a hash code of 0 should be rare. + // + // (2) Since we have no synchronization, multiple threads can race here thinking there are the + // first one to compute and cache the hash code. + // + // (3) Moreover, since 'hashCode' is non-volatile, the cached hash code value written from one + // thread may not be visible by another. Note that we probably don't need to worry about + // multiple inefficient reads of 'hashCode' on the same thread since it's non-volatile. + // + // All three of these issues are benign from a correctness perspective; in the end we have no + // overhead from synchronization, at the cost of potentially computing the hash code more than + // once. + if (hashCode == 0) { + hashCode = computeHashCode(); + } + return hashCode; + } + + private int computeHashCode() { int initialHash = artifact.hashCode() + artifact.getArtifactOwner().hashCode(); return isMandatory ? initialHash : 47 * initialHash + 1; }
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 45c17fa..ea6c774 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
@@ -18,9 +18,9 @@ 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.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.util.Collection; /** @@ -44,7 +44,7 @@ new Function<AspectValue, SkyKey>() { @Override public SkyKey apply(AspectValue aspectValue) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.ASPECT_COMPLETION, AspectCompletionKey.create(aspectValue.getKey(), ctx)); }
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 b5c9420..c6b8f32 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
@@ -16,6 +16,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.util.Preconditions; 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,7 +27,7 @@ private final ImmutableSet<PathFragment> patterns; private static final SkyKey BLACKLIST_KEY = - SkyKey.create(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, ""); + LegacySkyKey.create(SkyFunctions.BLACKLISTED_PACKAGE_PREFIXES, ""); public BlacklistedPackagePrefixesValue(ImmutableSet<PathFragment> exclusions) { this.patterns = Preconditions.checkNotNull(exclusions);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java index 9bd14e8..85b97de 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationValue.java
@@ -17,9 +17,9 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.io.Serializable; import java.util.Objects; import java.util.Set; @@ -51,7 +51,8 @@ @ThreadSafe public static SkyKey key(Set<Class<? extends BuildConfiguration.Fragment>> fragments, BuildOptions buildOptions) { - return SkyKey.create(SkyFunctions.BUILD_CONFIGURATION, new Key(fragments, buildOptions, true)); + return LegacySkyKey.create( + SkyFunctions.BUILD_CONFIGURATION, new Key(fragments, buildOptions, true)); } /** @@ -65,7 +66,8 @@ public static SkyKey disabledActionsKey( Set<Class<? extends BuildConfiguration.Fragment>> fragments, BuildOptions buildOptions) { - return SkyKey.create(SkyFunctions.BUILD_CONFIGURATION, new Key(fragments, buildOptions, false)); + return LegacySkyKey.create( + SkyFunctions.BUILD_CONFIGURATION, new Key(fragments, buildOptions, false)); } static final class Key implements Serializable {
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 dfff250..3d29f8d 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
@@ -15,6 +15,7 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -33,7 +34,7 @@ */ static SkyKey key(SkyFunctionName functionName, ImmutableList<? extends Object> chain) { Preconditions.checkState(!chain.isEmpty()); - return SkyKey.create(functionName, canonicalize(chain)); + return LegacySkyKey.create(functionName, canonicalize(chain)); } private static ImmutableList<Object> canonicalize(ImmutableList<? extends Object> cycle) {
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 b4118e3..5f819e5 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
@@ -22,6 +22,7 @@ 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.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.Objects; @@ -230,6 +231,6 @@ } static SkyKey key(RecursivePkgKey recursivePkgKey) { - return SkyKey.create(SkyFunctions.COLLECT_PACKAGES_UNDER_DIRECTORY, recursivePkgKey); + return LegacySkyKey.create(SkyFunctions.COLLECT_PACKAGES_UNDER_DIRECTORY, recursivePkgKey); } }
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 4809ae1..700d322 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
@@ -16,6 +16,7 @@ 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.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -30,7 +31,7 @@ * comment for what callers should have done beforehand. */ static SkyKey key(PackageIdentifier packageId, FilteringPolicy filteringPolicy) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.COLLECT_TARGETS_IN_PACKAGE, CollectTargetsInPackageKey.create(packageId, filteringPolicy)); }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionValue.java index eb5f173..6d591f3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationCollectionValue.java
@@ -19,9 +19,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.io.Serializable; import java.util.Objects; @@ -44,7 +44,7 @@ @ThreadSafe public static SkyKey key(BuildOptions buildOptions, ImmutableSet<String> multiCpu) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.CONFIGURATION_COLLECTION, new ConfigurationCollectionKey(buildOptions, multiCpu)); }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java index 45740dd..79686fb 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfigurationFragmentValue.java
@@ -23,12 +23,11 @@ import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.io.Serializable; import java.util.Objects; - import javax.annotation.Nullable; /** @@ -57,7 +56,7 @@ BuildConfiguration.getOptionsClasses( ImmutableList.<Class<? extends BuildConfiguration.Fragment>>of(fragmentType), ruleClassProvider)); - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.CONFIGURATION_FRAGMENT, new ConfigurationFragmentKey(optionsKey, fragmentType)); }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java index aee158e..4e0b959 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetCycleReporter.java
@@ -24,6 +24,7 @@ import com.google.devtools.build.lib.pkgcache.PackageProvider; import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey; import com.google.devtools.build.skyframe.CycleInfo; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; /** @@ -94,7 +95,7 @@ private SkyKey asTransitiveTargetKey(SkyKey key) { return IS_TRANSITIVE_TARGET_SKY_KEY.apply(key) ? key - : SkyKey.create(TRANSITIVE_TARGET, ((ConfiguredTargetKey) key.argument()).getLabel()); + : LegacySkyKey.create(TRANSITIVE_TARGET, ((ConfiguredTargetKey) key.argument()).getLabel()); } @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 0405f63..b952a97 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
@@ -16,6 +16,7 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.util.Preconditions; 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.SkyValue; @@ -40,7 +41,7 @@ public static SkyKey key(PackageIdentifier id) { Preconditions.checkArgument(!id.getPackageFragment().isAbsolute(), id); Preconditions.checkArgument(!id.getRepository().isDefault(), id); - return SkyKey.create(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, id); + return LegacySkyKey.create(SkyFunctions.CONTAINING_PACKAGE_LOOKUP, id); } public static ContainingPackage withContainingPackage(PackageIdentifier pkgId, Path root) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java index 3d63fe0..3f9c8d8 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java
@@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.ArtifactOwner; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -28,7 +29,7 @@ // There should only ever be one CoverageReportValue value in the graph. public static final ArtifactOwner ARTIFACT_OWNER = new CoverageReportKey(); - static final SkyKey SKY_KEY = SkyKey.create(SkyFunctions.COVERAGE_REPORT, ARTIFACT_OWNER); + static final SkyKey SKY_KEY = LegacySkyKey.create(SkyFunctions.COVERAGE_REPORT, ARTIFACT_OWNER); CoverageReportValue( ImmutableList<ActionAnalysisMetadata> coverageReportActions,
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 7664fd2..2a10797 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
@@ -19,9 +19,9 @@ 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.SkyValue; - import java.io.IOException; import java.io.Serializable; import java.util.Arrays; @@ -30,7 +30,6 @@ import java.util.Comparator; import java.util.Iterator; import java.util.Objects; - import javax.annotation.Nullable; /** @@ -57,7 +56,7 @@ @ThreadSafe public static SkyKey key(RootedPath rootedPath) { - return SkyKey.create(SkyFunctions.DIRECTORY_LISTING_STATE, rootedPath); + return LegacySkyKey.create(SkyFunctions.DIRECTORY_LISTING_STATE, rootedPath); } /**
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 3f61fe6..d6fb7b4 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
@@ -16,9 +16,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; 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.SkyValue; - import java.util.Objects; /** @@ -55,7 +55,7 @@ */ @ThreadSafe public static SkyKey key(RootedPath directoryUnderRoot) { - return SkyKey.create(SkyFunctions.DIRECTORY_LISTING, directoryUnderRoot); + return LegacySkyKey.create(SkyFunctions.DIRECTORY_LISTING, directoryUnderRoot); } 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 8a7bdd9..c21aa6c 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
@@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.devtools.build.lib.vfs.RootedPath; +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.SkyValue; @@ -57,6 +58,6 @@ * Returns a SkyKey to find the WORKSPACE file at the given path. */ public static SkyKey key(RootedPath workspacePath) { - return SkyKey.create(SkyFunctions.EXTERNAL_PACKAGE, workspacePath); + return LegacySkyKey.create(SkyFunctions.EXTERNAL_PACKAGE, workspacePath); } }
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 9206534..e8c6379 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
@@ -24,13 +24,12 @@ 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.SkyValue; - import java.io.IOException; import java.util.Arrays; import java.util.Objects; - import javax.annotation.Nullable; /** @@ -103,7 +102,7 @@ @VisibleForTesting @ThreadSafe public static SkyKey key(RootedPath rootedPath) { - return SkyKey.create(SkyFunctions.FILE_STATE, rootedPath); + return LegacySkyKey.create(SkyFunctions.FILE_STATE, rootedPath); } public abstract Type getType();
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 6b2bfa7..3874674 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
@@ -19,6 +19,7 @@ import com.google.devtools.build.lib.util.Preconditions; 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.SkyValue; import java.util.Objects; @@ -115,7 +116,7 @@ */ @ThreadSafe public static SkyKey key(RootedPath rootedPath) { - return SkyKey.create(SkyFunctions.FILE, rootedPath); + return LegacySkyKey.create(SkyFunctions.FILE, rootedPath); } /**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryValue.java index d628da2..38386e2 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesetEntryValue.java
@@ -16,6 +16,7 @@ import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.FilesetOutputSymlink; import com.google.devtools.build.lib.actions.FilesetTraversalParams; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -44,7 +45,7 @@ } public static SkyKey key(FilesetTraversalParams params) { - return SkyKey.create(SkyFunctions.FILESET_ENTRY, params); + return LegacySkyKey.create(SkyFunctions.FILESET_ENTRY, params); } @Override
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobValue.java index cd4dd85..67ff7b1 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobValue.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.UnixGlob; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -103,7 +104,7 @@ @ThreadSafe static SkyKey internalKey(PackageIdentifier packageId, Path packageRoot, PathFragment subdir, String pattern, boolean excludeDirs) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.GLOB, new GlobDescriptor(packageId, packageRoot, subdir, pattern, excludeDirs)); }
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 794dcc3..b2a0c54 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
@@ -15,6 +15,7 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; 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.SkyValue; @@ -27,7 +28,7 @@ public abstract class LocalRepositoryLookupValue implements SkyValue { static SkyKey key(RootedPath directory) { - return SkyKey.create(SkyFunctions.LOCAL_REPOSITORY_LOOKUP, directory); + return LegacySkyKey.create(SkyFunctions.LOCAL_REPOSITORY_LOOKUP, directory); } 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 17ba9be..b08329c 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
@@ -19,6 +19,7 @@ import com.google.devtools.build.lib.packages.NoSuchPackageException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.util.Preconditions; +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.SkyFunctionException.Transience; @@ -38,7 +39,7 @@ */ public class PackageErrorFunction implements SkyFunction { public static SkyKey key(PackageIdentifier packageIdentifier) { - return SkyKey.create(SkyFunctions.PACKAGE_ERROR, packageIdentifier); + return LegacySkyKey.create(SkyFunctions.PACKAGE_ERROR, packageIdentifier); } @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 79f6a41..4bf711f 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
@@ -19,6 +19,7 @@ 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.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -156,7 +157,7 @@ public static SkyKey key(PackageIdentifier pkgIdentifier) { Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault()); - return SkyKey.create(SkyFunctions.PACKAGE_LOOKUP, pkgIdentifier); + return LegacySkyKey.create(SkyFunctions.PACKAGE_LOOKUP, pkgIdentifier); } /** 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 d637a7f..2e7fad2 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
@@ -19,9 +19,9 @@ import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.NotComparableSkyValue; import com.google.devtools.build.skyframe.SkyKey; - import java.util.ArrayList; import java.util.List; @@ -55,7 +55,7 @@ public static SkyKey key(PackageIdentifier pkgIdentifier) { Preconditions.checkArgument(!pkgIdentifier.getRepository().isDefault()); - return SkyKey.create(SkyFunctions.PACKAGE, pkgIdentifier); + return LegacySkyKey.create(SkyFunctions.PACKAGE, pkgIdentifier); } 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 4ef9ae3..5b80c1c 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
@@ -16,6 +16,7 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -40,7 +41,7 @@ } public static SkyKey key(ConfiguredTargetKey lac) { - return SkyKey.create(SkyFunctions.POST_CONFIGURED_TARGET, lac); + return LegacySkyKey.create(SkyFunctions.POST_CONFIGURED_TARGET, lac); } 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 d879c8f..78c525f 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
@@ -30,6 +30,7 @@ import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; 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.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -77,44 +78,44 @@ } public static final Precomputed<String> DEFAULTS_PACKAGE_CONTENTS = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "default_pkg")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "default_pkg")); public static final Precomputed<PathFragment> BLACKLISTED_PACKAGE_PREFIXES_FILE = new Precomputed<>( - SkyKey.create(SkyFunctions.PRECOMPUTED, "blacklisted_package_prefixes_file")); + LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "blacklisted_package_prefixes_file")); public static final Precomputed<RuleVisibility> DEFAULT_VISIBILITY = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "default_visibility")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "default_visibility")); public static final Precomputed<SkylarkSemanticsOptions> SKYLARK_SEMANTICS = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "skylark_semantics")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "skylark_semantics")); static final Precomputed<UUID> BUILD_ID = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "build_id")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "build_id")); static final Precomputed<Map<String, String>> ACTION_ENV = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "action_env")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "action_env")); static final Precomputed<WorkspaceStatusAction> WORKSPACE_STATUS_KEY = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "workspace_status_action")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "workspace_status_action")); static final Precomputed<ImmutableList<ActionAnalysisMetadata>> COVERAGE_REPORT_KEY = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "coverage_report_actions")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "coverage_report_actions")); public static final Precomputed<Map<BuildInfoKey, BuildInfoFactory>> BUILD_INFO_FACTORIES = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "build_info_factories")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "build_info_factories")); public static final Precomputed<BlazeDirectories> BLAZE_DIRECTORIES = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "blaze_directories")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "blaze_directories")); public static final Precomputed<String> PRODUCT_NAME = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "product_name")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "product_name")); static final Precomputed<ImmutableMap<ActionAnalysisMetadata, ConflictException>> BAD_ACTIONS = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "bad_actions")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "bad_actions")); public static final Precomputed<PathPackageLocator> PATH_PACKAGE_LOCATOR = - new Precomputed<>(SkyKey.create(SkyFunctions.PRECOMPUTED, "path_package_locator")); + new Precomputed<>(LegacySkyKey.create(SkyFunctions.PRECOMPUTED, "path_package_locator")); private final Object value;
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 eb1754e..79fd2fb 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
@@ -23,9 +23,9 @@ import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternSkyKeyOrException; 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; - import java.util.List; /** @@ -209,7 +209,7 @@ @Override public SkyKey getSkyKey() throws TargetParsingException { - return SkyKey.create(SkyFunctions.PREPARE_DEPS_OF_PATTERN, targetPatternKey); + return LegacySkyKey.create(SkyFunctions.PREPARE_DEPS_OF_PATTERN, targetPatternKey); } @Override
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 cbcd971..8a3a3c5 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
@@ -18,9 +18,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.io.Serializable; import java.util.Objects; @@ -55,7 +55,7 @@ @ThreadSafe public static SkyKey key(ImmutableList<String> patterns, String offset) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.PREPARE_DEPS_OF_PATTERNS, new TargetPatternSequence(patterns, offset)); }
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 c937263..2c7e318 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
@@ -23,9 +23,9 @@ import com.google.devtools.build.lib.util.Preconditions; 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.SkyValue; - import java.io.Serializable; import java.util.Objects; @@ -61,7 +61,7 @@ @ThreadSafe public static SkyKey key(RepositoryName repository, RootedPath rootedPath, ImmutableSet<PathFragment> excludedPaths, FilteringPolicy filteringPolicy) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.PREPARE_DEPS_OF_TARGETS_UNDER_DIRECTORY, new PrepareDepsOfTargetsUnderDirectoryKey( new RecursivePkgKey(repository, rootedPath, excludedPaths), filteringPolicy));
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 7f2777c..c3d465e 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
@@ -26,11 +26,10 @@ 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.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.util.regex.Pattern; - import javax.annotation.Nullable; /** @@ -105,7 +104,7 @@ } public static SkyKey key(TraversalRequest traversal) { - return SkyKey.create(SkyFunctions.RECURSIVE_FILESYSTEM_TRAVERSAL, traversal); + return LegacySkyKey.create(SkyFunctions.RECURSIVE_FILESYSTEM_TRAVERSAL, traversal); } /** The parameters of a file or directory traversal. */
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 9bec1ee..2d3025b 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
@@ -23,9 +23,9 @@ import com.google.devtools.build.lib.util.Preconditions; 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.SkyValue; - import java.io.Serializable; import java.util.Objects; @@ -58,7 +58,7 @@ @ThreadSafe public static SkyKey key(RepositoryName repositoryName, RootedPath rootedPath, ImmutableSet<PathFragment> excludedPaths) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.RECURSIVE_PKG, new RecursivePkgKey(repositoryName, rootedPath, excludedPaths)); }
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 575c2a2..a09d839 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
@@ -19,6 +19,7 @@ import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; 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.SkyValue; @@ -121,6 +122,6 @@ } public static SkyKey key(RepositoryName repositoryName) { - return SkyKey.create(SkyFunctions.REPOSITORY, repositoryName); + return LegacySkyKey.create(SkyFunctions.REPOSITORY, repositoryName); } }
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 264f549..86858d2 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
@@ -62,6 +62,7 @@ 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; @@ -385,7 +386,7 @@ envToCheck.addAll(clientEnv.get().keySet()); previousClientEnvironment = clientEnv.get().keySet(); for (String env : envToCheck) { - SkyKey key = SkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, env); + SkyKey key = LegacySkyKey.create(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, 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/SkyFunctions.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java index 05c7887..e0f8a84 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java
@@ -67,8 +67,6 @@ public static final SkyFunctionName RECURSIVE_PKG = SkyFunctionName.create("RECURSIVE_PKG"); public static final SkyFunctionName TRANSITIVE_TARGET = SkyFunctionName.create("TRANSITIVE_TARGET"); - public static final SkyFunctionName TRANSITIVE_TRAVERSAL = - SkyFunctionName.create("TRANSITIVE_TRAVERSAL"); public static final SkyFunctionName CONFIGURED_TARGET = SkyFunctionName.create("CONFIGURED_TARGET"); public static final SkyFunctionName POST_CONFIGURED_TARGET =
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index a2a8575..f058a4e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -400,7 +400,7 @@ map.put(SkyFunctions.PACKAGE_ERROR, new PackageErrorFunction()); map.put(SkyFunctions.TARGET_MARKER, new TargetMarkerFunction()); map.put(SkyFunctions.TRANSITIVE_TARGET, new TransitiveTargetFunction(ruleClassProvider)); - map.put(SkyFunctions.TRANSITIVE_TRAVERSAL, new TransitiveTraversalFunction()); + map.put(Label.TRANSITIVE_TRAVERSAL, new TransitiveTraversalFunction()); map.put( SkyFunctions.CONFIGURED_TARGET, new ConfiguredTargetFunction(
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 d97c034..583e155 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
@@ -17,6 +17,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.syntax.Environment.Extension; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.io.Serializable; @@ -98,7 +99,7 @@ } static SkyKey key(Label importLabel, boolean inWorkspace) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.SKYLARK_IMPORTS_LOOKUP, new SkylarkImportLookupKey(importLabel, inWorkspace)); } }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java index ef55b9f..476f69d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetCompletionValue.java
@@ -19,9 +19,9 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.LabelAndConfiguration; import com.google.devtools.build.lib.analysis.TopLevelArtifactContext; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.util.Collection; /** @@ -41,7 +41,7 @@ public static SkyKey key( LabelAndConfiguration labelAndConfiguration, TopLevelArtifactContext topLevelArtifactContext) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.TARGET_COMPLETION, TargetCompletionKey.create(labelAndConfiguration, topLevelArtifactContext)); } @@ -53,7 +53,7 @@ new Function<ConfiguredTarget, SkyKey>() { @Override public SkyKey apply(ConfiguredTarget ct) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.TARGET_COMPLETION, TargetCompletionKey.create(LabelAndConfiguration.of(ct), ctx)); }
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 f1aa03d..c4419d4 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
@@ -17,6 +17,7 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -47,6 +48,6 @@ @ThreadSafe public static SkyKey key(Label label) { Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault()); - return SkyKey.create(SkyFunctions.TARGET_MARKER, label); + return LegacySkyKey.create(SkyFunctions.TARGET_MARKER, label); } }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java index 085eacd..187a942 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternPhaseValue.java
@@ -22,6 +22,7 @@ import com.google.devtools.build.lib.pkgcache.LoadingResult; import com.google.devtools.build.lib.pkgcache.TestFilter; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.io.ObjectInputStream; @@ -131,7 +132,7 @@ boolean compileOneDependency, boolean buildTestsOnly, boolean determineTests, ImmutableList<String> buildTargetFilter, boolean buildManualTests, @Nullable TestFilter testFilter) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.TARGET_PATTERN_PHASE, new TargetPatternList( targetPatterns, @@ -140,7 +141,8 @@ buildTestsOnly, determineTests, buildTargetFilter, - buildManualTests, testFilter)); + buildManualTests, + testFilter)); } /**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java index 22b400e..ce65642 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetPatternValue.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.util.Preconditions; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.InterruptibleSupplier; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; @@ -146,7 +147,7 @@ !positive, offset, ImmutableSet.<PathFragment>of()); - SkyKey skyKey = SkyKey.create(SkyFunctions.TARGET_PATTERN, targetPatternKey); + SkyKey skyKey = LegacySkyKey.create(SkyFunctions.TARGET_PATTERN, targetPatternKey); builder.add(new TargetPatternSkyKeyValue(skyKey)); } return builder.build();
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 01f5698..68e09f2 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
@@ -19,9 +19,9 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.LabelAndConfiguration; import com.google.devtools.build.lib.analysis.TopLevelArtifactContext; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.util.Collection; /** @@ -37,7 +37,7 @@ LabelAndConfiguration lac, final TopLevelArtifactContext topLevelArtifactContext, final boolean exclusiveTesting) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.TEST_COMPLETION, TestCompletionKey.create(lac, topLevelArtifactContext, exclusiveTesting)); } @@ -50,7 +50,7 @@ new Function<ConfiguredTarget, SkyKey>() { @Override public SkyKey apply(ConfiguredTarget ct) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.TEST_COMPLETION, TestCompletionKey.create( LabelAndConfiguration.of(ct), topLevelArtifactContext, exclusiveTesting));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionValue.java index a7a330f..9810b75 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TestSuiteExpansionValue.java
@@ -22,9 +22,9 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; @@ -70,7 +70,7 @@ */ @ThreadSafe public static SkyKey key(Collection<Label> targets) { - return SkyKey.create( + return LegacySkyKey.create( SkyFunctions.TEST_SUITE_EXPANSION, new TestSuiteExpansion(ImmutableSortedSet.copyOf(targets))); }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteValue.java index 0267f4a..d0ac8a4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TestsInSuiteValue.java
@@ -20,9 +20,9 @@ import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; @@ -68,7 +68,8 @@ @ThreadSafe public static SkyKey key(Target testSuite, boolean strict) { Preconditions.checkState(TargetUtils.isTestSuiteRule(testSuite)); - return SkyKey.create(SkyFunctions.TESTS_IN_SUITE, new TestsInSuite((Rule) testSuite, strict)); + return LegacySkyKey.create( + SkyFunctions.TESTS_IN_SUITE, new TestsInSuite((Rule) testSuite, strict)); } /**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java index 6fb4fcf..e603ca3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTargetValue.java
@@ -23,14 +23,13 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.util.Preconditions; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.Set; - import javax.annotation.Nullable; /** @@ -172,6 +171,6 @@ @ThreadSafe public static SkyKey key(Label label) { Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault()); - return SkyKey.create(SkyFunctions.TRANSITIVE_TARGET, label); + return LegacySkyKey.create(SkyFunctions.TRANSITIVE_TARGET, label); } }
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java index ef400cf..afc26d3 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TransitiveTraversalValue.java
@@ -143,7 +143,7 @@ @ThreadSafe public static SkyKey key(Label label) { Preconditions.checkArgument(!label.getPackageIdentifier().getRepository().isDefault()); - return SkyKey.create(SkyFunctions.TRANSITIVE_TRAVERSAL, label); + return label; } /** A transitive target reference without error. */
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 e002765..9c18193 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
@@ -17,9 +17,9 @@ import com.google.common.collect.ImmutableList; 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.SkyValue; - import java.util.List; /** @@ -57,7 +57,7 @@ } public static SkyKey key(RootedPath path) { - return SkyKey.create(SkyFunctions.WORKSPACE_AST, path); + return LegacySkyKey.create(SkyFunctions.WORKSPACE_AST, path); } }
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 daf578e..66bd5b2 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
@@ -21,9 +21,9 @@ import com.google.devtools.build.lib.syntax.Environment.Extension; import com.google.devtools.build.lib.util.Preconditions; 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.SkyValue; - import java.util.Map; import java.util.Objects; @@ -135,7 +135,7 @@ } static SkyKey key(RootedPath path, int idx) { - return SkyKey.create(SkyFunctions.WORKSPACE_FILE, new WorkspaceFileKey(path, idx)); + return LegacySkyKey.create(SkyFunctions.WORKSPACE_FILE, new WorkspaceFileKey(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 c752d58..668c636 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
@@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.devtools.build.lib.util.Preconditions; +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,7 +30,7 @@ */ public class WorkspaceNameValue implements SkyValue { private static final SkyKey KEY = - SkyKey.create(SkyFunctions.WORKSPACE_NAME, DummyArgument.INSTANCE); + LegacySkyKey.create(SkyFunctions.WORKSPACE_NAME, DummyArgument.INSTANCE); private static final WorkspaceNameValue ERROR = new WorkspaceNameValue(null); @Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java index d2758c5..7ee1d93 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java
@@ -17,6 +17,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction; +import com.google.devtools.build.skyframe.LegacySkyKey; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -32,7 +33,7 @@ // There should only ever be one BuildInfo value in the graph. static final ArtifactOwner ARTIFACT_OWNER = new BuildInfoKey(); - public static final SkyKey SKY_KEY = SkyKey.create(SkyFunctions.BUILD_INFO, ARTIFACT_OWNER); + public static final SkyKey SKY_KEY = LegacySkyKey.create(SkyFunctions.BUILD_INFO, ARTIFACT_OWNER); WorkspaceStatusValue( Artifact stableArtifact,
diff --git a/src/main/java/com/google/devtools/build/skyframe/BUILD b/src/main/java/com/google/devtools/build/skyframe/BUILD index 51f41b4..55c35f8 100644 --- a/src/main/java/com/google/devtools/build/skyframe/BUILD +++ b/src/main/java/com/google/devtools/build/skyframe/BUILD
@@ -4,10 +4,33 @@ default_visibility = ["//src:__subpackages__"], ) +SKYFRAME_OBJECT_SRCS = [ + "SkyValue.java", + "SkyKey.java", + "LegacySkyKey.java", + "SkyFunctionName.java", +] + +java_library( + name = "skyframe-objects", + srcs = SKYFRAME_OBJECT_SRCS, + visibility = ["//visibility:public"], + deps = [ + "//src/main/java/com/google/devtools/build/lib:collect", + "//src/main/java/com/google/devtools/build/lib:concurrent", + "//src/main/java/com/google/devtools/build/lib:preconditions", + "//third_party:guava", + ], +) + java_library( name = "skyframe", - srcs = glob(["**/*.java"]), + srcs = glob( + ["**/*.java"], + exclude = SKYFRAME_OBJECT_SRCS, + ), deps = [ + ":skyframe-objects", "//src/main/java/com/google/devtools/build/lib:clock", # keep "//src/main/java/com/google/devtools/build/lib:collect", "//src/main/java/com/google/devtools/build/lib:concurrent",
diff --git a/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java b/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java index c0544df..46b99c2 100644 --- a/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java +++ b/src/main/java/com/google/devtools/build/skyframe/ErrorTransienceValue.java
@@ -22,7 +22,7 @@ */ public final class ErrorTransienceValue implements SkyValue { public static final SkyFunctionName FUNCTION_NAME = SkyFunctionName.create("ERROR_TRANSIENCE"); - public static final SkyKey KEY = SkyKey.create(FUNCTION_NAME, "ERROR_TRANSIENCE"); + public static final SkyKey KEY = LegacySkyKey.create(FUNCTION_NAME, "ERROR_TRANSIENCE"); public static final ErrorTransienceValue INSTANCE = new ErrorTransienceValue(); private ErrorTransienceValue() {}
diff --git a/src/main/java/com/google/devtools/build/skyframe/LegacySkyKey.java b/src/main/java/com/google/devtools/build/skyframe/LegacySkyKey.java new file mode 100644 index 0000000..637a0fc --- /dev/null +++ b/src/main/java/com/google/devtools/build/skyframe/LegacySkyKey.java
@@ -0,0 +1,127 @@ +// Copyright 2017 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.skyframe; + +import com.google.common.collect.Interner; +import com.google.devtools.build.lib.concurrent.BlazeInterners; +import com.google.devtools.build.lib.util.Preconditions; + +/** + * Basic implementation of {@link SkyKey}. Potentially non-optimal from a memory perspective, since + * it uses fields for hash code and {@link #functionName}. The latter should be implemented instead + * using polymorphism. See {@code ArtifactSkyKey} for an example. + */ +public class LegacySkyKey implements SkyKey { + private static final Interner<SkyKey> SKY_KEY_INTERNER = BlazeInterners.newWeakInterner(); + + /** + * Creates a {@link SkyKey}. Prefer instead creating custom SkyKeys that are their own arguments, + * saving the object wrapper. See {@code ArtifactSkyKey} for an example. + */ + // TODO(janakr): migrate users of this to use custom SkyKey subclasses and delete this. + @Deprecated + public static SkyKey create(SkyFunctionName functionName, Object argument) { + // Intern to save memory. + return SKY_KEY_INTERNER.intern(new LegacySkyKey(functionName, argument)); + } + + private final SkyFunctionName functionName; + + /** + * The name of the value. + * + * <p>This is deliberately an untyped Object so that we can use arbitrary value types (e.g., + * Labels, PathFragments, BuildConfigurations, etc.) as value names without incurring + * serialization costs in the in-memory implementation of the graph. + */ + private final Object argument; + + /** + * Cache the hash code for this object. It might be expensive to compute. It is transient because + * argument's hash code might not be stable across JVM instances. + */ + private transient int hashCode; + + private LegacySkyKey(SkyFunctionName functionName, Object argument) { + this.functionName = Preconditions.checkNotNull(functionName); + this.argument = Preconditions.checkNotNull(argument); + // 'hashCode' is non-volatile and non-final, so this write may in fact *not* be visible to other + // threads. But this isn't a concern from a correctness perspective. See the comments in + // #hashCode for more details. + this.hashCode = computeHashCode(); + } + + @Override + public SkyFunctionName functionName() { + return functionName; + } + + @Override + public Object argument() { + return argument; + } + + @Override + public String toString() { + return functionName + ":" + argument; + } + + @Override + public int hashCode() { + // We use the hash code caching strategy employed by java.lang.String. There are three subtle + // things going on here: + // + // (1) We use a value of 0 to indicate that the hash code hasn't been computed and cached yet. + // Yes, this means that if the hash code is really 0 then we will "recompute" it each time. But + // this isn't a problem in practice since a hash code of 0 should be rare. + // + // (2) Since we have no synchronization, multiple threads can race here thinking there are the + // first one to compute and cache the hash code. + // + // (3) Moreover, since 'hashCode' is non-volatile, the cached hash code value written from one + // thread may not be visible by another. + // + // All three of these issues are benign from a correctness perspective; in the end we have no + // overhead from synchronization, at the cost of potentially computing the hash code more than + // once. + int h = hashCode; + if (h == 0) { + h = computeHashCode(); + hashCode = h; + } + return h; + } + + private int computeHashCode() { + return 31 * functionName.hashCode() + argument.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + LegacySkyKey other = (LegacySkyKey) obj; + if (hashCode() != other.hashCode()) { + return false; + } + return functionName.equals(other.functionName) && argument.equals(other.argument); + } +}
diff --git a/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java b/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java index 59fbc07..2adbbc5 100644 --- a/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java +++ b/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java
@@ -78,7 +78,7 @@ * ArrayDeque does not permit null elements. */ private static final SkyKey CHILDREN_FINISHED = - SkyKey.create(SkyFunctionName.create("MARKER"), "MARKER"); + LegacySkyKey.create(SkyFunctionName.create("MARKER"), "MARKER"); /** The max number of cycles we will report to the user for a given root, to avoid OOMing. */ private static final int MAX_CYCLES = 20;
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyKey.java b/src/main/java/com/google/devtools/build/skyframe/SkyKey.java index 0af8b82..2428f9c 100644 --- a/src/main/java/com/google/devtools/build/skyframe/SkyKey.java +++ b/src/main/java/com/google/devtools/build/skyframe/SkyKey.java
@@ -13,115 +13,21 @@ // limitations under the License. package com.google.devtools.build.skyframe; -import com.google.common.base.Function; -import com.google.common.collect.Interner; -import com.google.devtools.build.lib.concurrent.BlazeInterners; -import com.google.devtools.build.lib.util.Preconditions; - import java.io.Serializable; /** * A {@link SkyKey} is effectively a pair (type, name) that identifies a Skyframe value. + * + * <p>SkyKey implementations are heavily used as map keys. Thus, they should have fast {@link + * #hashCode} implementations (cached if necessary). The same SkyKey may be created multiple times + * by different {@code SkyFunction}s requesting it, and so it should have effective interning. There + * will likely be more SkyKeys on the JVM heap than any other non-native type, so be mindful of + * memory usage (in particular object wrapper size and memory alignment)! Typically the + * implementation should have a fixed {@link #functionName} implementation and return itself as the + * {@link #argument} in order to reduce the cost of wrapper objects. */ -public final class SkyKey implements Serializable { - private static final Interner<SkyKey> SKY_KEY_INTERNER = BlazeInterners.newWeakInterner(); +public interface SkyKey extends Serializable { + SkyFunctionName functionName(); - private final SkyFunctionName functionName; - - /** - * The name of the value. - * - * <p>This is deliberately an untyped Object so that we can use arbitrary value types (e.g., - * Labels, PathFragments, BuildConfigurations, etc.) as value names without incurring - * serialization costs in the in-memory implementation of the graph. - */ - private final Object argument; - - /** - * Cache the hash code for this object. It might be expensive to compute. It is transient because - * argument's hash code might not be stable across JVM instances. - */ - private transient int hashCode; - - private SkyKey(SkyFunctionName functionName, Object argument) { - this.functionName = Preconditions.checkNotNull(functionName); - this.argument = Preconditions.checkNotNull(argument); - // 'hashCode' is non-volatile and non-final, so this write may in fact *not* be visible to other - // threads. But this isn't a concern from a correctness perspective. See the comments in - // #hashCode for more details. - this.hashCode = computeHashCode(); - } - - public static SkyKey create(SkyFunctionName functionName, Object argument) { - // Intern to save memory. - return SKY_KEY_INTERNER.intern(new SkyKey(functionName, argument)); - } - - public SkyFunctionName functionName() { - return functionName; - } - - public Object argument() { - return argument; - } - - @Override - public String toString() { - return functionName + ":" + argument; - } - - @Override - public int hashCode() { - // We use the hash code caching strategy employed by java.lang.String. There are three subtle - // things going on here: - // - // (1) We use a value of 0 to indicate that the hash code hasn't been computed and cached yet. - // Yes, this means that if the hash code is really 0 then we will "recompute" it each time. But - // this isn't a problem in practice since a hash code of 0 should be rare. - // - // (2) Since we have no synchronization, multiple threads can race here thinking there are the - // first one to compute and cache the hash code. - // - // (3) Moreover, since 'hashCode' is non-volatile, the cached hash code value written from one - // thread may not be visible by another. - // - // All three of these issues are benign from a correctness perspective; in the end we have no - // overhead from synchronization, at the cost of potentially computing the hash code more than - // once. - int h = hashCode; - if (h == 0) { - h = computeHashCode(); - hashCode = h; - } - return h; - } - - private int computeHashCode() { - return 31 * functionName.hashCode() + argument.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - SkyKey other = (SkyKey) obj; - if (hashCode() != other.hashCode()) { - return false; - } - return functionName.equals(other.functionName) && argument.equals(other.argument); - } - - public static final Function<SkyKey, Object> NODE_NAME = new Function<SkyKey, Object>() { - @Override - public Object apply(SkyKey input) { - return input.argument(); - } - }; + Object argument(); }