diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
3 files changed, 97 insertions, 71 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java index c99898028a..b501f3abce 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java @@ -43,6 +43,7 @@ import com.google.devtools.build.lib.vfs.ModifiedFileSet; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.skyframe.Differencer; +import com.google.devtools.build.skyframe.FunctionHermeticity; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; @@ -506,6 +507,10 @@ public class FilesystemValueChecker { if (!checker.applies(key)) { continue; } + Preconditions.checkState( + key.functionName().getHermeticity() == FunctionHermeticity.NONHERMETIC, + "Only non-hermetic keys can be dirty roots: %s", + key); executor.execute( wrapper.wrap( () -> { 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 aed4d5dbc1..be40e0619f 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 @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Predicate; import com.google.devtools.build.lib.actions.ActionLookupData; +import com.google.devtools.build.skyframe.FunctionHermeticity; import com.google.devtools.build.skyframe.ShareabilityOfValue; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; @@ -23,98 +24,116 @@ import com.google.devtools.build.skyframe.SkyKey; * Value types in Skyframe. */ public final class SkyFunctions { - public static final SkyFunctionName PRECOMPUTED = SkyFunctionName.create("PRECOMPUTED"); + public static final SkyFunctionName PRECOMPUTED = + SkyFunctionName.createNonHermetic("PRECOMPUTED"); public static final SkyFunctionName CLIENT_ENVIRONMENT_VARIABLE = - SkyFunctionName.create("CLIENT_ENVIRONMENT_VARIABLE"); + SkyFunctionName.createNonHermetic("CLIENT_ENVIRONMENT_VARIABLE"); public static final SkyFunctionName ACTION_ENVIRONMENT_VARIABLE = - SkyFunctionName.create("ACTION_ENVIRONMENT_VARIABLE"); + SkyFunctionName.createHermetic("ACTION_ENVIRONMENT_VARIABLE"); public static final SkyFunctionName DIRECTORY_LISTING_STATE = - SkyFunctionName.create("DIRECTORY_LISTING_STATE"); + SkyFunctionName.createNonHermetic("DIRECTORY_LISTING_STATE"); public static final SkyFunctionName FILE_SYMLINK_CYCLE_UNIQUENESS = - SkyFunctionName.create("FILE_SYMLINK_CYCLE_UNIQUENESS"); + SkyFunctionName.createHermetic("FILE_SYMLINK_CYCLE_UNIQUENESS"); public static final SkyFunctionName FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS = - SkyFunctionName.create("FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS"); + SkyFunctionName.createHermetic("FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS"); public static final SkyFunctionName DIRECTORY_LISTING = - SkyFunctionName.create("DIRECTORY_LISTING"); - public static final SkyFunctionName PACKAGE_LOOKUP = SkyFunctionName.create("PACKAGE_LOOKUP"); + SkyFunctionName.createHermetic("DIRECTORY_LISTING"); + // Non-hermetic because unfortunately package lookups secretly access the set of deleted packages. + public static final SkyFunctionName PACKAGE_LOOKUP = + SkyFunctionName.createNonHermetic("PACKAGE_LOOKUP"); public static final SkyFunctionName CONTAINING_PACKAGE_LOOKUP = - SkyFunctionName.create("CONTAINING_PACKAGE_LOOKUP"); - public static final SkyFunctionName AST_FILE_LOOKUP = SkyFunctionName.create("AST_FILE_LOOKUP"); + SkyFunctionName.createHermetic("CONTAINING_PACKAGE_LOOKUP"); + // Non-hermetic because accesses the package locator. Also does disk access. + public static final SkyFunctionName AST_FILE_LOOKUP = + SkyFunctionName.createNonHermetic("AST_FILE_LOOKUP"); public static final SkyFunctionName SKYLARK_IMPORTS_LOOKUP = - SkyFunctionName.create("SKYLARK_IMPORTS_LOOKUP"); - public static final SkyFunctionName GLOB = SkyFunctionName.create("GLOB"); - public static final SkyFunctionName PACKAGE = SkyFunctionName.create("PACKAGE"); - public static final SkyFunctionName PACKAGE_ERROR = SkyFunctionName.create("PACKAGE_ERROR"); - public static final SkyFunctionName PACKAGE_ERROR_MESSAGE = - SkyFunctionName.create("PACKAGE_ERROR_MESSAGE"); - public static final SkyFunctionName TARGET_MARKER = SkyFunctionName.create("TARGET_MARKER"); - public static final SkyFunctionName TARGET_PATTERN = SkyFunctionName.create("TARGET_PATTERN"); - public static final SkyFunctionName TARGET_PATTERN_ERROR = - SkyFunctionName.create("TARGET_PATTERN_ERROR"); + SkyFunctionName.createHermetic("SKYLARK_IMPORTS_LOOKUP"); + public static final SkyFunctionName GLOB = SkyFunctionName.createHermetic("GLOB"); + public static final SkyFunctionName PACKAGE = SkyFunctionName.createHermetic("PACKAGE"); + static final SkyFunctionName PACKAGE_ERROR = SkyFunctionName.createHermetic("PACKAGE_ERROR"); + static final SkyFunctionName PACKAGE_ERROR_MESSAGE = + SkyFunctionName.createHermetic("PACKAGE_ERROR_MESSAGE"); + public static final SkyFunctionName TARGET_MARKER = + SkyFunctionName.createHermetic("TARGET_MARKER"); + // Non-hermetic because accesses package locator + public static final SkyFunctionName TARGET_PATTERN = + SkyFunctionName.createNonHermetic("TARGET_PATTERN"); + static final SkyFunctionName TARGET_PATTERN_ERROR = + SkyFunctionName.createHermetic("TARGET_PATTERN_ERROR"); public static final SkyFunctionName PREPARE_DEPS_OF_PATTERNS = - SkyFunctionName.create("PREPARE_DEPS_OF_PATTERNS"); + SkyFunctionName.createHermetic("PREPARE_DEPS_OF_PATTERNS"); + // Non-hermetic because accesses package locator public static final SkyFunctionName PREPARE_DEPS_OF_PATTERN = - SkyFunctionName.create("PREPARE_DEPS_OF_PATTERN"); + SkyFunctionName.createNonHermetic("PREPARE_DEPS_OF_PATTERN"); public static final SkyFunctionName PREPARE_DEPS_OF_TARGETS_UNDER_DIRECTORY = - SkyFunctionName.create("PREPARE_DEPS_OF_TARGETS_UNDER_DIRECTORY"); + SkyFunctionName.createHermetic("PREPARE_DEPS_OF_TARGETS_UNDER_DIRECTORY"); public static final SkyFunctionName COLLECT_TARGETS_IN_PACKAGE = - SkyFunctionName.create("COLLECT_TARGETS_IN_PACKAGE"); + SkyFunctionName.createHermetic("COLLECT_TARGETS_IN_PACKAGE"); public static final SkyFunctionName COLLECT_PACKAGES_UNDER_DIRECTORY = - SkyFunctionName.create("COLLECT_PACKAGES_UNDER_DIRECTORY"); + SkyFunctionName.createHermetic("COLLECT_PACKAGES_UNDER_DIRECTORY"); public static final SkyFunctionName BLACKLISTED_PACKAGE_PREFIXES = - SkyFunctionName.create("BLACKLISTED_PACKAGE_PREFIXES"); - public static final SkyFunctionName TEST_SUITE_EXPANSION = - SkyFunctionName.create("TEST_SUITE_EXPANSION"); - public static final SkyFunctionName TESTS_IN_SUITE = SkyFunctionName.create("TESTS_IN_SUITE"); - public static final SkyFunctionName TARGET_PATTERN_PHASE = - SkyFunctionName.create("TARGET_PATTERN_PHASE"); - public static final SkyFunctionName RECURSIVE_PKG = SkyFunctionName.create("RECURSIVE_PKG"); - public static final SkyFunctionName TRANSITIVE_TARGET = - SkyFunctionName.create("TRANSITIVE_TARGET"); + SkyFunctionName.createHermetic("BLACKLISTED_PACKAGE_PREFIXES"); + static final SkyFunctionName TEST_SUITE_EXPANSION = + SkyFunctionName.createHermetic("TEST_SUITE_EXPANSION"); + static final SkyFunctionName TESTS_IN_SUITE = SkyFunctionName.createHermetic("TESTS_IN_SUITE"); + // Non-hermetic because accesses package locator + static final SkyFunctionName TARGET_PATTERN_PHASE = + SkyFunctionName.createNonHermetic("TARGET_PATTERN_PHASE"); + static final SkyFunctionName RECURSIVE_PKG = SkyFunctionName.createHermetic("RECURSIVE_PKG"); + static final SkyFunctionName TRANSITIVE_TARGET = + SkyFunctionName.createHermetic("TRANSITIVE_TARGET"); public static final SkyFunctionName CONFIGURED_TARGET = - SkyFunctionName.create("CONFIGURED_TARGET"); + SkyFunctionName.createHermetic("CONFIGURED_TARGET"); public static final SkyFunctionName POST_CONFIGURED_TARGET = - SkyFunctionName.create("POST_CONFIGURED_TARGET"); - public static final SkyFunctionName ASPECT = SkyFunctionName.create("ASPECT"); - public static final SkyFunctionName LOAD_SKYLARK_ASPECT = - SkyFunctionName.create("LOAD_SKYLARK_ASPECT"); + SkyFunctionName.createHermetic("POST_CONFIGURED_TARGET"); + public static final SkyFunctionName ASPECT = SkyFunctionName.createHermetic("ASPECT"); + static final SkyFunctionName LOAD_SKYLARK_ASPECT = + SkyFunctionName.createHermetic("LOAD_SKYLARK_ASPECT"); public static final SkyFunctionName TARGET_COMPLETION = - SkyFunctionName.create("TARGET_COMPLETION"); + SkyFunctionName.createHermetic("TARGET_COMPLETION"); public static final SkyFunctionName ASPECT_COMPLETION = - SkyFunctionName.create("ASPECT_COMPLETION"); - public static final SkyFunctionName TEST_COMPLETION = - SkyFunctionName.create("TEST_COMPLETION", ShareabilityOfValue.NEVER); - public static final SkyFunctionName BUILD_CONFIGURATION = - SkyFunctionName.create("BUILD_CONFIGURATION"); + SkyFunctionName.createHermetic("ASPECT_COMPLETION"); + static final SkyFunctionName TEST_COMPLETION = + SkyFunctionName.create( + "TEST_COMPLETION", ShareabilityOfValue.NEVER, FunctionHermeticity.HERMETIC); + static final SkyFunctionName BUILD_CONFIGURATION = + SkyFunctionName.createHermetic("BUILD_CONFIGURATION"); public static final SkyFunctionName CONFIGURATION_FRAGMENT = - SkyFunctionName.create("CONFIGURATION_FRAGMENT"); + SkyFunctionName.createHermetic("CONFIGURATION_FRAGMENT"); public static final SkyFunctionName ACTION_EXECUTION = ActionLookupData.NAME; - public static final SkyFunctionName RECURSIVE_FILESYSTEM_TRAVERSAL = - SkyFunctionName.create("RECURSIVE_DIRECTORY_TRAVERSAL"); - public static final SkyFunctionName FILESET_ENTRY = SkyFunctionName.create("FILESET_ENTRY"); - public static final SkyFunctionName BUILD_INFO_COLLECTION = - SkyFunctionName.create("BUILD_INFO_COLLECTION"); - public static final SkyFunctionName BUILD_INFO = SkyFunctionName.create("BUILD_INFO"); - public static final SkyFunctionName WORKSPACE_NAME = SkyFunctionName.create("WORKSPACE_NAME"); - public static final SkyFunctionName WORKSPACE_FILE = SkyFunctionName.create("WORKSPACE_FILE"); - public static final SkyFunctionName COVERAGE_REPORT = SkyFunctionName.create("COVERAGE_REPORT"); - public static final SkyFunctionName REPOSITORY = SkyFunctionName.create("REPOSITORY"); + static final SkyFunctionName RECURSIVE_FILESYSTEM_TRAVERSAL = + SkyFunctionName.createHermetic("RECURSIVE_DIRECTORY_TRAVERSAL"); + public static final SkyFunctionName FILESET_ENTRY = + SkyFunctionName.createHermetic("FILESET_ENTRY"); + static final SkyFunctionName BUILD_INFO_COLLECTION = + SkyFunctionName.createHermetic("BUILD_INFO_COLLECTION"); + public static final SkyFunctionName BUILD_INFO = SkyFunctionName.createHermetic("BUILD_INFO"); + public static final SkyFunctionName WORKSPACE_NAME = + SkyFunctionName.createHermetic("WORKSPACE_NAME"); + // Non-hermetic because accesses package locator + public static final SkyFunctionName WORKSPACE_FILE = + SkyFunctionName.createNonHermetic("WORKSPACE_FILE"); + static final SkyFunctionName COVERAGE_REPORT = SkyFunctionName.createHermetic("COVERAGE_REPORT"); + public static final SkyFunctionName REPOSITORY = SkyFunctionName.createHermetic("REPOSITORY"); public static final SkyFunctionName REPOSITORY_DIRECTORY = - SkyFunctionName.create("REPOSITORY_DIRECTORY"); - public static final SkyFunctionName WORKSPACE_AST = SkyFunctionName.create("WORKSPACE_AST"); - public static final SkyFunctionName EXTERNAL_PACKAGE = SkyFunctionName.create("EXTERNAL_PACKAGE"); - public static final SkyFunctionName ACTION_TEMPLATE_EXPANSION = - SkyFunctionName.create("ACTION_TEMPLATE_EXPANSION"); + SkyFunctionName.createNonHermetic("REPOSITORY_DIRECTORY"); + public static final SkyFunctionName WORKSPACE_AST = + SkyFunctionName.createHermetic("WORKSPACE_AST"); + // Non-hermetic because accesses package locator + public static final SkyFunctionName EXTERNAL_PACKAGE = + SkyFunctionName.createNonHermetic("EXTERNAL_PACKAGE"); + static final SkyFunctionName ACTION_TEMPLATE_EXPANSION = + SkyFunctionName.createHermetic("ACTION_TEMPLATE_EXPANSION"); public static final SkyFunctionName LOCAL_REPOSITORY_LOOKUP = - SkyFunctionName.create("LOCAL_REPOSITORY_LOOKUP"); - public static final SkyFunctionName REGISTERED_EXECUTION_PLATFORMS = - SkyFunctionName.create("REGISTERED_EXECUTION_PLATFORMS"); - public static final SkyFunctionName REGISTERED_TOOLCHAINS = - SkyFunctionName.create("REGISTERED_TOOLCHAINS"); - public static final SkyFunctionName TOOLCHAIN_RESOLUTION = - SkyFunctionName.create("TOOLCHAIN_RESOLUTION"); + SkyFunctionName.createHermetic("LOCAL_REPOSITORY_LOOKUP"); + static final SkyFunctionName REGISTERED_EXECUTION_PLATFORMS = + SkyFunctionName.createHermetic("REGISTERED_EXECUTION_PLATFORMS"); + static final SkyFunctionName REGISTERED_TOOLCHAINS = + SkyFunctionName.createHermetic("REGISTERED_TOOLCHAINS"); + static final SkyFunctionName TOOLCHAIN_RESOLUTION = + SkyFunctionName.createHermetic("TOOLCHAIN_RESOLUTION"); public static final SkyFunctionName REPOSITORY_MAPPING = - SkyFunctionName.create("REPOSITORY_MAPPING"); + SkyFunctionName.createHermetic("REPOSITORY_MAPPING"); public static Predicate<SkyKey> isSkyFunction(final SkyFunctionName functionName) { return new Predicate<SkyKey>() { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyValueDirtinessChecker.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyValueDirtinessChecker.java index 2a41a4740f..ad852d6268 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyValueDirtinessChecker.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyValueDirtinessChecker.java @@ -24,8 +24,10 @@ import javax.annotation.Nullable; * up to date. */ public abstract class SkyValueDirtinessChecker { - - /** Returns {@code true} iff the checker can handle {@code key}. */ + /** + * Returns {@code true} iff the checker can handle {@code key}. Can only be true if {@code + * key.functionName().getHermeticity() == FunctionHermeticity.NONHERMETIC}. + */ public abstract boolean applies(SkyKey key); /** |