diff options
author | shahan <shahan@google.com> | 2018-06-06 20:09:57 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-06 20:11:33 -0700 |
commit | 602cc856051b02328ed56e2af808b829dafecd4b (patch) | |
tree | 3c7f8b6e3e672ad173204b7dec29b62b7becd4b8 | |
parent | 89d85ea3c515cb288a388d89673e773f6806d7fa (diff) |
Refactoring: makes the code simpler by deleting Metadata and InputArtifactData.
(minor) ActionFS now implements MetadataProvider.getInput
PiperOrigin-RevId: 199575194
104 files changed, 647 insertions, 682 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 27f1e62f8a..fbfcff804b 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -808,6 +808,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:runtime", "//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/actions", "//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/lib/buildeventstream", diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java index 63256d77e9..4b72809271 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionCacheChecker.java @@ -22,12 +22,12 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType; import com.google.devtools.build.lib.actions.cache.ActionCache; import com.google.devtools.build.lib.actions.cache.DigestUtils; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.MetadataHandler; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics.MissReason; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.events.EventKind; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.util.ArrayList; @@ -51,27 +51,7 @@ import javax.annotation.Nullable; */ public class ActionCacheChecker { private static final byte[] EMPTY_DIGEST = new byte[0]; - private static final Metadata CONSTANT_METADATA = new Metadata() { - @Override - public FileStateType getType() { - return FileStateType.REGULAR_FILE; - } - - @Override - public byte[] getDigest() { - return EMPTY_DIGEST; - } - - @Override - public long getSize() { - return 0; - } - - @Override - public long getModifiedTime() { - return -1; - } - }; + private static final FileArtifactValue CONSTANT_METADATA = new ConstantMetadataValue(); private final ActionCache actionCache; private final ActionKeyContext actionKeyContext; @@ -164,7 +144,7 @@ public class ActionCacheChecker { Iterable<Artifact> artifacts = checkOutput ? Iterables.concat(action.getOutputs(), actionInputs) : actionInputs; - Map<String, Metadata> mdMap = new HashMap<>(); + Map<String, FileArtifactValue> mdMap = new HashMap<>(); for (Artifact artifact : artifacts) { mdMap.put(artifact.getExecPathString(), getMetadataMaybe(metadataHandler, artifact)); } @@ -324,8 +304,8 @@ public class ActionCacheChecker { return false; } - private static Metadata getMetadataOrConstant(MetadataHandler metadataHandler, Artifact artifact) - throws IOException { + private static FileArtifactValue getMetadataOrConstant( + MetadataHandler metadataHandler, Artifact artifact) throws IOException { if (artifact.isConstantMetadata()) { return CONSTANT_METADATA; } else { @@ -337,7 +317,8 @@ public class ActionCacheChecker { // to trigger a re-execution, so we should catch the IOException explicitly there. In others, we // should propagate the exception, because it is unexpected (e.g., bad file system state). @Nullable - private static Metadata getMetadataMaybe(MetadataHandler metadataHandler, Artifact artifact) { + private static FileArtifactValue getMetadataMaybe( + MetadataHandler metadataHandler, Artifact artifact) { try { return getMetadataOrConstant(metadataHandler, artifact); } catch (IOException e) { @@ -373,7 +354,7 @@ public class ActionCacheChecker { // 'constant' metadata for the volatile workspace status output. The volatile output // contains information such as timestamps, and even when --stamp is enabled, we don't want // to rebuild everything if only that file changes. - Metadata metadata = getMetadataOrConstant(metadataHandler, output); + FileArtifactValue metadata = getMetadataOrConstant(metadataHandler, output); Preconditions.checkState(metadata != null); entry.addFile(output.getExecPath(), metadata); } @@ -554,4 +535,33 @@ public class ActionCacheChecker { this.cacheKey = Preconditions.checkNotNull(cacheKey); } } + + private static final class ConstantMetadataValue extends FileArtifactValue + implements FileArtifactValue.Singleton { + @Override + public FileStateType getType() { + return FileStateType.REGULAR_FILE; + } + + @Override + public byte[] getDigest() { + return EMPTY_DIGEST; + } + + @Override + public long getSize() { + return 0; + } + + @Override + public long getModifiedTime() { + return -1; + } + + @Override + public boolean wasModifiedSinceDigest(Path path) { + throw new UnsupportedOperationException( + "ConstantMetadataValue doesn't support wasModifiedSinceDigest " + path.toString()); + } + } } diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionInputMap.java b/src/main/java/com/google/devtools/build/lib/actions/ActionInputMap.java index c938b07419..09014fe25a 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionInputMap.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionInputMap.java @@ -14,15 +14,14 @@ package com.google.devtools.build.lib.actions; import com.google.common.base.Preconditions; -import com.google.devtools.build.lib.actions.cache.Metadata; import java.util.Arrays; import javax.annotation.Nullable; /** * Helper for {@link MetadataProvider} implementations. * - * <p>Allows {@link Metadata} lookups by exec path or {@link ActionInput}. <i>Also</i> allows {@link - * ActionInput} to be looked up by exec path. + * <p>Allows {@link FileArtifactValue} lookups by exec path or {@link ActionInput}. <i>Also</i> + * allows {@link ActionInput} to be looked up by exec path. * * <p>This class is thread-compatible. */ @@ -30,7 +29,7 @@ public final class ActionInputMap implements MetadataProvider { /** * {@link ActionInput} keys stored in even indices * - * <p>{@link Metadata} values stored in odd indices + * <p>{@link FileArtifactValue} values stored in odd indices */ private Object[] data; @@ -55,19 +54,19 @@ public final class ActionInputMap implements MetadataProvider { @Nullable @Override - public Metadata getMetadata(ActionInput input) { + public FileArtifactValue getMetadata(ActionInput input) { return getMetadata(input.getExecPathString()); } @Nullable - public Metadata getMetadata(String execPathString) { + public FileArtifactValue getMetadata(String execPathString) { int hashCode = execPathString.hashCode(); int probe = getProbe(hashCode); ActionInput nextKey; while ((nextKey = (ActionInput) data[probe]) != null) { if (hashCode == nextKey.getExecPathString().hashCode() && nextKey.getExecPathString().equals(execPathString)) { - return (Metadata) data[probe + 1]; + return (FileArtifactValue) data[probe + 1]; } probe = incProbe(probe); } @@ -96,7 +95,7 @@ public final class ActionInputMap implements MetadataProvider { } /** @return true if an entry was added, false if the map already contains {@code input} */ - public boolean put(ActionInput input, Metadata metadata) { + public boolean put(ActionInput input, FileArtifactValue metadata) { Preconditions.checkNotNull(input); if (size * 4 >= data.length) { resize(); @@ -119,7 +118,7 @@ public final class ActionInputMap implements MetadataProvider { for (int i = 0; i < oldData.length; i += 2) { ActionInput key = (ActionInput) oldData[i]; if (key != null) { - Metadata value = (Metadata) oldData[i + 1]; + FileArtifactValue value = (FileArtifactValue) oldData[i + 1]; putImpl(key, value); } } @@ -131,7 +130,7 @@ public final class ActionInputMap implements MetadataProvider { * * <p>REQUIRES: there are free positions in {@link data}. */ - private boolean putImpl(ActionInput key, Metadata value) { + private boolean putImpl(ActionInput key, FileArtifactValue value) { int hashCode = key.getExecPathString().hashCode(); int probe = getProbe(hashCode); while (true) { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileArtifactValue.java b/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java index b5add7ca4e..f9f80eefcf 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileArtifactValue.java +++ b/src/main/java/com/google/devtools/build/lib/actions/FileArtifactValue.java @@ -11,16 +11,13 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.skyframe; +package com.google.devtools.build.lib.actions; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.io.BaseEncoding; -import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.actions.FileStateType; import com.google.devtools.build.lib.actions.cache.DigestUtils; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; @@ -35,104 +32,213 @@ import java.util.Objects; import javax.annotation.Nullable; /** - * Stores the actual metadata data of a file. We have the following cases: + * State of a file system object for the execution phase. + * + * <p>This is not used by Skyframe for invalidation, it is primarily used by the action cache and + * the various {@link com.google.devtools.build.lib.exec.SpawnRunner} implementations. + * + * <p>We have the following cases: * * <ul> - * <li> an ordinary file, in which case we would expect to see a digest and size; - * <li> a directory, in which case we would expect to see an mtime; - * <li> an intentionally omitted file which the build system is aware of but doesn't actually exist, - * where all access methods are unsupported; - * <li> a "middleman marker" object, which has a null digest, 0 size, and mtime of 0. - * <li> The "self data" of a TreeArtifact, where we would expect to see a digest representing the - * artifact's contents, and a size of 0. + * <li>an ordinary file, in which case we would expect to see a digest and size; + * <li>a directory, in which case we would expect to see an mtime; + * <li>an intentionally omitted file which the build system is aware of but doesn't actually + * exist, where all access methods are unsupported; + * <li>a "middleman marker" object, which has a null digest, 0 size, and mtime of 0. + * <li>The "self data" of a TreeArtifact, where we would expect to see a digest representing the + * artifact's contents, and a size of 0. * </ul> */ -// TODO(janakr): make this an interface once JDK8 allows us to have static methods on interfaces. -@Immutable @ThreadSafe -public abstract class FileArtifactValue implements SkyValue, Metadata { - private static final class SingletonMarkerValue extends FileArtifactValue implements Singleton { - @Override - public FileStateType getType() { - return FileStateType.NONEXISTENT; - } +@Immutable +@ThreadSafe +public abstract class FileArtifactValue implements SkyValue { + @AutoCodec public static final FileArtifactValue DEFAULT_MIDDLEMAN = new SingletonMarkerValue(); + /** Data that marks that a file is not present on the filesystem. */ + @AutoCodec public static final FileArtifactValue MISSING_FILE_MARKER = new SingletonMarkerValue(); - @Nullable - @Override - public byte[] getDigest() { - return null; - } + /** + * Represents an omitted file -- we are aware of it but it doesn't exist. All access methods are + * unsupported. + */ + @AutoCodec public static final FileArtifactValue OMITTED_FILE_MARKER = new OmittedFileValue(); - @Override - public long getSize() { - return 0; - } + /** + * Marker interface for singleton implementations of this class. + * + * <p>Needed for a correct implementation of {@code equals}. + */ + public interface Singleton {} - @Override - public long getModifiedTime() { - return 0; - } + /** + * The type of the underlying file system object. If it is a regular file, then it is guaranteed + * to have a digest. Otherwise it does not have a digest. + */ + public abstract FileStateType getType(); - @Override - public boolean wasModifiedSinceDigest(Path path) throws IOException { + /** + * Returns a digest of the content of the underlying file system object; must always return a + * non-null value for instances of type {@link FileStateType#REGULAR_FILE}. Otherwise may return + * null. + * + * <p>All instances of this interface must either have a digest or return a last-modified time. + * Clients should prefer using the digest for content identification (e.g., for caching), and only + * fall back to the last-modified time if no digest is available. + * + * <p>The return value is owned by this object and must not be modified. + */ + @Nullable + public abstract byte[] getDigest(); + + /** Returns the file's size, or 0 if the underlying file system object is not a file. */ + // TODO(ulfjack): Throw an exception if it's not a file. + public abstract long getSize(); + + /** + * Returns the last modified time; see the documentation of {@link #getDigest} for when this can + * and should be called. + */ + public abstract long getModifiedTime(); + + /** + * Index used to resolve remote files. + * + * <p>0 indicates that no such information is available which can mean that it's either a local + * file or empty. + */ + public int getLocationIndex() { + return 0; + } + + /** + * Provides a best-effort determination whether the file was changed since the digest was + * computed. This method performs file system I/O, so may be expensive. It's primarily intended to + * avoid storing bad cache entries in an action cache. It should return true if there is a chance + * that the file was modified since the digest was computed. Better not upload if we are not sure + * that the cache entry is reliable. + */ + public abstract boolean wasModifiedSinceDigest(Path path) throws IOException; + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof FileArtifactValue)) { return false; } - - @Override - public String toString() { - return "singleton marker artifact value (" + hashCode() + ")"; + if ((this instanceof Singleton) || (o instanceof Singleton)) { + return false; + } + FileArtifactValue m = (FileArtifactValue) o; + if (getType() != m.getType()) { + return false; + } + if (getDigest() != null) { + return Arrays.equals(getDigest(), m.getDigest()) && getSize() == m.getSize(); + } else { + return getModifiedTime() == m.getModifiedTime(); } } - private static final class OmittedFileValue extends FileArtifactValue implements Singleton { - @Override - public FileStateType getType() { - return FileStateType.NONEXISTENT; + @Override + public int hashCode() { + if (this instanceof Singleton) { + return System.identityHashCode(this); } - - @Override - public byte[] getDigest() { - throw new UnsupportedOperationException(); + // Hash digest by content, not reference. + if (getDigest() != null) { + return 37 * Long.hashCode(getSize()) + Arrays.hashCode(getDigest()); + } else { + return Long.hashCode(getModifiedTime()); } + } - @Override - public long getSize() { - throw new UnsupportedOperationException(); - } + public static FileArtifactValue create(Artifact artifact, FileValue fileValue) + throws IOException { + boolean isFile = fileValue.isFile(); + FileContentsProxy proxy = getProxyFromFileStateValue(fileValue.realFileStateValue()); + return create( + artifact.getPath(), + isFile, + isFile ? fileValue.getSize() : 0, + proxy, + isFile ? fileValue.getDigest() : null); + } - @Override - public long getModifiedTime() { - throw new UnsupportedOperationException(); - } + public static FileArtifactValue create( + Artifact artifact, FileValue fileValue, @Nullable byte[] injectedDigest) throws IOException { + boolean isFile = fileValue.isFile(); + FileContentsProxy proxy = getProxyFromFileStateValue(fileValue.realFileStateValue()); + return create( + artifact.getPath(), isFile, isFile ? fileValue.getSize() : 0, proxy, injectedDigest); + } - @Override - public boolean wasModifiedSinceDigest(Path path) throws IOException { - return false; - } + @VisibleForTesting + public static FileArtifactValue create(Artifact artifact) throws IOException { + return create(artifact.getPath()); + } - @Override - public String toString() { - return "OMITTED_FILE_MARKER"; + @VisibleForTesting + public static FileArtifactValue create(Path path) throws IOException { + // Caution: there's a race condition between stating the file and computing the + // digest. We need to stat first, since we're using the stat to detect changes. + // We follow symlinks here to be consistent with getDigest. + FileStatus stat = path.stat(Symlinks.FOLLOW); + return create(path, stat.isFile(), stat.getSize(), FileContentsProxy.create(stat), null); + } + + private static FileArtifactValue create( + Path path, boolean isFile, long size, FileContentsProxy proxy, @Nullable byte[] digest) + throws IOException { + if (!isFile) { + // In this case, we need to store the mtime because the action cache uses mtime for + // directories to determine if this artifact has changed. We want this code path to go away + // somehow. + return new DirectoryArtifactValue(path.getLastModifiedTime()); } + if (digest == null) { + digest = DigestUtils.getDigestOrFail(path, size); + } + Preconditions.checkState(digest != null, path); + return new RegularFileArtifactValue(digest, proxy, size); } - @AutoCodec static final FileArtifactValue DEFAULT_MIDDLEMAN = new SingletonMarkerValue(); - /** Data that marks that a file is not present on the filesystem. */ - @VisibleForTesting @AutoCodec - public static final FileArtifactValue MISSING_FILE_MARKER = new SingletonMarkerValue(); + public static FileArtifactValue createForVirtualActionInput(byte[] digest, long size) { + return new RegularFileArtifactValue(digest, /*proxy=*/ null, size); + } + + public static FileArtifactValue createNormalFile( + byte[] digest, @Nullable FileContentsProxy proxy, long size) { + return new RegularFileArtifactValue(digest, proxy, size); + } + + public static FileArtifactValue createNormalFile(FileValue fileValue) { + FileContentsProxy proxy = getProxyFromFileStateValue(fileValue.realFileStateValue()); + return new RegularFileArtifactValue(fileValue.getDigest(), proxy, fileValue.getSize()); + } + + @VisibleForTesting + public static FileArtifactValue createNormalFile(byte[] digest, long size) { + return createNormalFile(digest, /*proxy=*/ null, size); + } + + public static FileArtifactValue createDirectory(long mtime) { + return new DirectoryArtifactValue(mtime); + } /** - * Represents an omitted file -- we are aware of it but it doesn't exist. All access methods are - * unsupported. + * Creates a FileArtifactValue used as a 'proxy' input for other ArtifactValues. These are used in + * {@link com.google.devtools.build.lib.actions.ActionCacheChecker}. */ - @AutoCodec static final FileArtifactValue OMITTED_FILE_MARKER = new OmittedFileValue(); + public static FileArtifactValue createProxy(byte[] digest) { + Preconditions.checkNotNull(digest); + return createNormalFile(digest, /*proxy=*/ null, /*size=*/ 0); + } - @AutoCodec.VisibleForSerialization - @AutoCodec - static final class DirectoryArtifactValue extends FileArtifactValue { + private static final class DirectoryArtifactValue extends FileArtifactValue { private final long mtime; - @AutoCodec.VisibleForSerialization - DirectoryArtifactValue(long mtime) { + private DirectoryArtifactValue(long mtime) { this.mtime = mtime; } @@ -168,15 +274,12 @@ public abstract class FileArtifactValue implements SkyValue, Metadata { } } - @AutoCodec.VisibleForSerialization - @AutoCodec - static final class RegularFileArtifactValue extends FileArtifactValue { + private static final class RegularFileArtifactValue extends FileArtifactValue { private final byte[] digest; @Nullable private final FileContentsProxy proxy; private final long size; - @AutoCodec.VisibleForSerialization - RegularFileArtifactValue(byte[] digest, @Nullable FileContentsProxy proxy, long size) { + private RegularFileArtifactValue(byte[] digest, @Nullable FileContentsProxy proxy, long size) { this.digest = Preconditions.checkNotNull(digest); this.proxy = proxy; this.size = size; @@ -239,12 +342,13 @@ public abstract class FileArtifactValue implements SkyValue, Metadata { } } - static final class RemoteFileArtifactValue extends FileArtifactValue { + /** Metadata for remotely stored files. */ + public static final class RemoteFileArtifactValue extends FileArtifactValue { private final byte[] digest; private final long size; private final int locationIndex; - RemoteFileArtifactValue(byte[] digest, long size, int locationIndex) { + public RemoteFileArtifactValue(byte[] digest, long size, int locationIndex) { this.digest = digest; this.size = size; this.locationIndex = locationIndex; @@ -277,33 +381,17 @@ public abstract class FileArtifactValue implements SkyValue, Metadata { } @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (!(o instanceof RemoteFileArtifactValue)) { - return false; - } - RemoteFileArtifactValue r = (RemoteFileArtifactValue) o; - return Arrays.equals(digest, r.digest) && size == r.size; - } - - @Override - public int hashCode() { - return Objects.hash(Arrays.hashCode(digest), size); - } - - @Override public boolean wasModifiedSinceDigest(Path path) { throw new UnsupportedOperationException(); } } - static final class InlineFileArtifactValue extends FileArtifactValue { + /** File stored inline in metadata. */ + public static final class InlineFileArtifactValue extends FileArtifactValue { private final byte[] data; private final byte[] digest; - InlineFileArtifactValue(byte[] data, byte[] digest) { + public InlineFileArtifactValue(byte[] data, byte[] digest) { this.data = Preconditions.checkNotNull(data); this.digest = Preconditions.checkNotNull(digest); } @@ -333,87 +421,11 @@ public abstract class FileArtifactValue implements SkyValue, Metadata { } @Override - public boolean equals(Object o) { - if (o == this) { - return true; - } - if (!(o instanceof InlineFileArtifactValue)) { - return false; - } - InlineFileArtifactValue that = (InlineFileArtifactValue) o; - return Arrays.equals(digest, that.digest); - } - - @Override - public int hashCode() { - return Arrays.hashCode(digest); - } - - @Override public boolean wasModifiedSinceDigest(Path path) { throw new UnsupportedOperationException(); } } - static FileArtifactValue create(Artifact artifact, FileValue fileValue) throws IOException { - boolean isFile = fileValue.isFile(); - FileContentsProxy proxy = getProxyFromFileStateValue(fileValue.realFileStateValue()); - return create(artifact.getPath(), isFile, isFile ? fileValue.getSize() : 0, proxy, - isFile ? fileValue.getDigest() : null); - } - - static FileArtifactValue create( - Artifact artifact, FileValue fileValue, @Nullable byte[] injectedDigest) throws IOException { - boolean isFile = fileValue.isFile(); - FileContentsProxy proxy = getProxyFromFileStateValue(fileValue.realFileStateValue()); - return create(artifact.getPath(), isFile, isFile ? fileValue.getSize() : 0, proxy, - injectedDigest); - } - - @VisibleForTesting - public static FileArtifactValue create(Artifact artifact) throws IOException { - return create(artifact.getPath()); - } - - @VisibleForTesting - public static FileArtifactValue create(Path path) throws IOException { - // Caution: there's a race condition between stating the file and computing the - // digest. We need to stat first, since we're using the stat to detect changes. - // We follow symlinks here to be consistent with getDigest. - FileStatus stat = path.stat(Symlinks.FOLLOW); - return create(path, stat.isFile(), stat.getSize(), FileContentsProxy.create(stat), null); - } - - private static FileArtifactValue create( - Path path, boolean isFile, long size, FileContentsProxy proxy, @Nullable byte[] digest) - throws IOException { - if (!isFile) { - // In this case, we need to store the mtime because the action cache uses mtime for - // directories to determine if this artifact has changed. We want this code path to go away - // somehow (maybe by implementing FileSet in Skyframe). - return new DirectoryArtifactValue(path.getLastModifiedTime()); - } - if (digest == null) { - digest = DigestUtils.getDigestOrFail(path, size); - } - Preconditions.checkState(digest != null, path); - return new RegularFileArtifactValue(digest, proxy, size); - } - - public static FileArtifactValue createForVirtualActionInput(byte[] digest, long size) { - return new RegularFileArtifactValue(digest, /*proxy=*/ null, size); - } - - public static FileArtifactValue createNormalFile( - byte[] digest, @Nullable FileContentsProxy proxy, long size) { - return new RegularFileArtifactValue(digest, proxy, size); - } - - static FileArtifactValue createNormalFile(FileValue fileValue) { - FileContentsProxy proxy = getProxyFromFileStateValue(fileValue.realFileStateValue()); - return new RegularFileArtifactValue(fileValue.getDigest(), proxy, fileValue.getSize()); - } - private static FileContentsProxy getProxyFromFileStateValue(FileStateValue value) { if (value instanceof FileStateValue.RegularFileStateValue) { return ((FileStateValue.RegularFileStateValue) value).getContentsProxy(); @@ -423,78 +435,68 @@ public abstract class FileArtifactValue implements SkyValue, Metadata { return null; } - @VisibleForTesting - public static FileArtifactValue createNormalFile(byte[] digest, long size) { - return createNormalFile(digest, /*proxy=*/null, size); - } - - public static FileArtifactValue createDirectory(long mtime) { - return new DirectoryArtifactValue(mtime); - } + private static final class SingletonMarkerValue extends FileArtifactValue implements Singleton { + @Override + public FileStateType getType() { + return FileStateType.NONEXISTENT; + } - /** - * Creates a FileArtifactValue used as a 'proxy' input for other ArtifactValues. - * These are used in {@link com.google.devtools.build.lib.actions.ActionCacheChecker}. - */ - static FileArtifactValue createProxy(byte[] digest) { - Preconditions.checkNotNull(digest); - return createNormalFile(digest, /*proxy=*/ null, /*size=*/ 0); - } + @Nullable + @Override + public byte[] getDigest() { + return null; + } - @Override - public abstract FileStateType getType(); + @Override + public long getSize() { + return 0; + } - @Nullable - @Override - public abstract byte[] getDigest(); + @Override + public long getModifiedTime() { + return 0; + } - @Override - public abstract long getSize(); + @Override + public boolean wasModifiedSinceDigest(Path path) throws IOException { + return false; + } - @Override - public abstract long getModifiedTime(); + @Override + public String toString() { + return "singleton marker artifact value (" + hashCode() + ")"; + } + } - /** - * Provides a best-effort determination whether the file was changed since the digest was - * computed. This method performs file system I/O, so may be expensive. It's primarily intended to - * avoid storing bad cache entries in an action cache. It should return true if there is a chance - * that the file was modified since the digest was computed. Better not upload if we are not sure - * that the cache entry is reliable. - */ - public abstract boolean wasModifiedSinceDigest(Path path) throws IOException; + private static final class OmittedFileValue extends FileArtifactValue implements Singleton { + @Override + public FileStateType getType() { + return FileStateType.NONEXISTENT; + } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; + @Override + public byte[] getDigest() { + throw new UnsupportedOperationException(); } - if (!(o instanceof Metadata)) { - return false; + + @Override + public long getSize() { + throw new UnsupportedOperationException(); } - if ((this instanceof Singleton) || (o instanceof Singleton)) { - return false; + + @Override + public long getModifiedTime() { + throw new UnsupportedOperationException(); } - Metadata m = (Metadata) o; - if (getType() != m.getType()) { + + @Override + public boolean wasModifiedSinceDigest(Path path) throws IOException { return false; } - if (getDigest() != null) { - return Arrays.equals(getDigest(), m.getDigest()) && getSize() == m.getSize(); - } else { - return getModifiedTime() == m.getModifiedTime(); - } - } - @Override - public int hashCode() { - if (this instanceof Singleton) { - return System.identityHashCode(this); - } - // Hash digest by content, not reference. - if (getDigest() != null) { - return 37 * Long.hashCode(getSize()) + Arrays.hashCode(getDigest()); - } else { - return Long.hashCode(getModifiedTime()); + @Override + public String toString() { + return "OMITTED_FILE_MARKER"; } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileContentsProxy.java b/src/main/java/com/google/devtools/build/lib/actions/FileContentsProxy.java index 2b845edc38..b8a571bd25 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileContentsProxy.java +++ b/src/main/java/com/google/devtools/build/lib/actions/FileContentsProxy.java @@ -11,9 +11,8 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.skyframe; +package com.google.devtools.build.lib.actions; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.FileStatus; import java.io.IOException; import java.io.Serializable; @@ -29,7 +28,6 @@ import java.util.Objects; * So if files 'a' and 'b' initially have the same timestamp, then we would think 'b' is unchanged * after the user executes `mv a b` between two builds. */ -@AutoCodec public final class FileContentsProxy implements Serializable { private final long ctime; private final long nodeId; @@ -87,4 +85,3 @@ public final class FileContentsProxy implements Serializable { return String.format("ctime of %d and nodeId of %d", ctime, nodeId); } } - diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java b/src/main/java/com/google/devtools/build/lib/actions/FileStateValue.java index f92e561ffa..bc4b51ad71 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java +++ b/src/main/java/com/google/devtools/build/lib/actions/FileStateValue.java @@ -11,13 +11,12 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.skyframe; +package com.google.devtools.build.lib.actions; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; import com.google.common.collect.Interner; -import com.google.devtools.build.lib.actions.FileStateType; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; @@ -57,6 +56,7 @@ import javax.annotation.Nullable; */ @VisibleForTesting public abstract class FileStateValue implements SkyValue { + public static final SkyFunctionName FILE_STATE = SkyFunctionName.create("FILE_STATE"); @AutoCodec public static final DirectoryFileStateValue DIRECTORY_FILE_STATE_NODE = @@ -82,9 +82,11 @@ public abstract class FileStateValue implements SkyValue { return createWithStatNoFollow(rootedPath, FileStatusWithDigestAdapter.adapt(stat), tsgm); } - static FileStateValue createWithStatNoFollow(RootedPath rootedPath, - FileStatusWithDigest statNoFollow, @Nullable TimestampGranularityMonitor tsgm) - throws InconsistentFilesystemException, IOException { + public static FileStateValue createWithStatNoFollow( + RootedPath rootedPath, + FileStatusWithDigest statNoFollow, + @Nullable TimestampGranularityMonitor tsgm) + throws InconsistentFilesystemException, IOException { Path path = rootedPath.asPath(); if (statNoFollow.isFile()) { return statNoFollow.isSpecialFile() @@ -122,14 +124,14 @@ public abstract class FileStateValue implements SkyValue { @Override public SkyFunctionName functionName() { - return SkyFunctions.FILE_STATE; + return FILE_STATE; } } public abstract FileStateType getType(); /** Returns the target of the symlink, or throws an exception if this is not a symlink. */ - PathFragment getSymlinkTarget() { + public PathFragment getSymlinkTarget() { throw new IllegalStateException(); } @@ -335,8 +337,7 @@ public abstract class FileStateValue implements SkyValue { } /** Implementation of {@link FileStateValue} for directories that exist. */ - @AutoCodec.VisibleForSerialization - static final class DirectoryFileStateValue extends FileStateValue { + public static final class DirectoryFileStateValue extends FileStateValue { private DirectoryFileStateValue() { } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileValue.java b/src/main/java/com/google/devtools/build/lib/actions/FileValue.java index eeb9fc6f91..1fc72c1cae 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileValue.java +++ b/src/main/java/com/google/devtools/build/lib/actions/FileValue.java @@ -11,12 +11,11 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.skyframe; +package com.google.devtools.build.lib.actions; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.Interner; -import com.google.devtools.build.lib.actions.FileStateType; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; @@ -50,6 +49,7 @@ import javax.annotation.Nullable; @Immutable @ThreadSafe public abstract class FileValue implements SkyValue { + public static final SkyFunctionName FILE = SkyFunctionName.create("FILE"); /** * Exists to accommodate the control flow of {@link ActionMetadataHandler#getMetadata}. @@ -111,17 +111,17 @@ public abstract class FileValue implements SkyValue { * example could be a build rule that copies a set of input files to the output directory, but * upon encountering symbolic links it can decide between copying or following them. */ - PathFragment getUnresolvedLinkTarget() { + public PathFragment getUnresolvedLinkTarget() { throw new IllegalStateException(this.toString()); } - long getSize() { + public long getSize() { Preconditions.checkState(isFile(), this); return realFileStateValue().getSize(); } @Nullable - byte[] getDigest() { + public byte[] getDigest() { Preconditions.checkState(isFile(), this); return realFileStateValue().getDigest(); } @@ -149,15 +149,16 @@ public abstract class FileValue implements SkyValue { @Override public SkyFunctionName functionName() { - return SkyFunctions.FILE; + return FILE; } } - /** - * Only intended to be used by {@link FileFunction}. Should not be used for symlink cycles. - */ - static FileValue value(RootedPath rootedPath, FileStateValue fileStateValue, - RootedPath realRootedPath, FileStateValue realFileStateValue) { + /** Only intended to be used by {@link FileFunction}. Should not be used for symlink cycles. */ + public static FileValue value( + RootedPath rootedPath, + FileStateValue fileStateValue, + RootedPath realRootedPath, + FileStateValue realFileStateValue) { if (rootedPath.equals(realRootedPath)) { Preconditions.checkState(fileStateValue.getType() != FileStateType.SYMLINK, "rootedPath: %s, fileStateValue: %s, realRootedPath: %s, realFileStateValue: %s", @@ -231,13 +232,13 @@ public abstract class FileValue implements SkyValue { */ @AutoCodec.VisibleForSerialization @AutoCodec - static class DifferentRealPathFileValue extends FileValue { + public static class DifferentRealPathFileValue extends FileValue { protected final RootedPath realRootedPath; protected final FileStateValue realFileStateValue; - @AutoCodec.VisibleForSerialization - DifferentRealPathFileValue(RootedPath realRootedPath, FileStateValue realFileStateValue) { + public DifferentRealPathFileValue( + RootedPath realRootedPath, FileStateValue realFileStateValue) { this.realRootedPath = Preconditions.checkNotNull(realRootedPath); this.realFileStateValue = Preconditions.checkNotNull(realFileStateValue); } @@ -279,11 +280,11 @@ public abstract class FileValue implements SkyValue { /** Implementation of {@link FileValue} for files that are symlinks. */ @VisibleForTesting @AutoCodec - static final class SymlinkFileValue extends DifferentRealPathFileValue { + public static final class SymlinkFileValue extends DifferentRealPathFileValue { private final PathFragment linkTarget; @VisibleForTesting - SymlinkFileValue( + public SymlinkFileValue( RootedPath realRootedPath, FileStateValue realFileStateValue, PathFragment linkTarget) { super(realRootedPath, realFileStateValue); this.linkTarget = linkTarget; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/InconsistentFilesystemException.java b/src/main/java/com/google/devtools/build/lib/actions/InconsistentFilesystemException.java index 5397fb4937..e0b0f9a1c6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/InconsistentFilesystemException.java +++ b/src/main/java/com/google/devtools/build/lib/actions/InconsistentFilesystemException.java @@ -11,7 +11,7 @@ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. -package com.google.devtools.build.lib.skyframe; +package com.google.devtools.build.lib.actions; import java.io.IOException; diff --git a/src/main/java/com/google/devtools/build/lib/actions/MetadataProvider.java b/src/main/java/com/google/devtools/build/lib/actions/MetadataProvider.java index 80d4104686..60db714d17 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/MetadataProvider.java +++ b/src/main/java/com/google/devtools/build/lib/actions/MetadataProvider.java @@ -13,7 +13,6 @@ // limitations under the License. package com.google.devtools.build.lib.actions; -import com.google.devtools.build.lib.actions.cache.Metadata; import java.io.IOException; import javax.annotation.Nullable; @@ -30,21 +29,18 @@ public interface MetadataProvider { * calls. * * <p>Returned {@link Metadata} instance correspond to the final target of a symlink, and - * therefore must not have a type of - * {@link com.google.devtools.build.lib.actions.FileStateType#SYMLINK} themselves. + * therefore must not have a type of {@link FileStateType#SYMLINK} themselves. * - * The return value is owned by the cache and must not be modified. + * <p>The return value is owned by the cache and must not be modified. * * @param input the input to retrieve the digest for * @return the artifact's digest or null if digest cannot be obtained (due to artifact - * non-existence, lookup errors, or any other reason) - * + * non-existence, lookup errors, or any other reason) * @throws DigestOfDirectoryException in case {@code input} is a directory. * @throws IOException If the file cannot be digested. - * */ @Nullable - Metadata getMetadata(ActionInput input) throws IOException; + FileArtifactValue getMetadata(ActionInput input) throws IOException; /** Looks up an input from its exec path. */ @Nullable diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/ActionCache.java b/src/main/java/com/google/devtools/build/lib/actions/cache/ActionCache.java index fc21b41a2d..c6ab5604a2 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/cache/ActionCache.java +++ b/src/main/java/com/google/devtools/build/lib/actions/cache/ActionCache.java @@ -18,6 +18,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics.MissReason; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; @@ -79,7 +80,7 @@ public interface ActionCache { // Null iff the corresponding action does not do input discovery. private final List<String> files; // If null, md5Digest is non-null and the entry is immutable. - private Map<String, Metadata> mdMap; + private Map<String, FileArtifactValue> mdMap; private Md5Digest md5Digest; private final Md5Digest usedClientEnvDigest; @@ -103,10 +104,10 @@ public interface ActionCache { } /** - * Adds the artifact, specified by the executable relative path and its - * metadata into the cache entry. + * Adds the artifact, specified by the executable relative path and its metadata into the cache + * entry. */ - public void addFile(PathFragment relativePath, Metadata md) { + public void addFile(PathFragment relativePath, FileArtifactValue md) { Preconditions.checkState(mdMap != null); Preconditions.checkState(!isCorrupted()); Preconditions.checkState(md5Digest == null); diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/DigestUtils.java b/src/main/java/com/google/devtools/build/lib/actions/cache/DigestUtils.java index d16d1bae89..5e0f198273 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/cache/DigestUtils.java +++ b/src/main/java/com/google/devtools/build/lib/actions/cache/DigestUtils.java @@ -19,6 +19,7 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheStats; import com.google.common.io.BaseEncoding; import com.google.common.primitives.Longs; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.profiler.ProfilerTask; @@ -286,15 +287,15 @@ public class DigestUtils { } /** - * @param mdMap A collection of (execPath, Metadata) pairs. Values may be null. + * @param mdMap A collection of (execPath, FileArtifactValue) pairs. Values may be null. * @return an <b>order-independent</b> digest from the given "set" of (path, metadata) pairs. */ - public static Md5Digest fromMetadata(Map<String, Metadata> mdMap) { + public static Md5Digest fromMetadata(Map<String, FileArtifactValue> mdMap) { byte[] result = new byte[Md5Digest.MD5_SIZE]; // Profiling showed that MD5 engine instantiation was a hotspot, so create one instance for // this computation to amortize its cost. Fingerprint fp = new Fingerprint(); - for (Map.Entry<String, Metadata> entry : mdMap.entrySet()) { + for (Map.Entry<String, FileArtifactValue> entry : mdMap.entrySet()) { xorWith(result, getDigest(fp, entry.getKey(), entry.getValue())); } return new Md5Digest(result); @@ -315,7 +316,7 @@ public class DigestUtils { return new Md5Digest(result); } - private static byte[] getDigest(Fingerprint fp, String execPath, Metadata md) { + private static byte[] getDigest(Fingerprint fp, String execPath, FileArtifactValue md) { fp.addString(execPath); if (md == null) { diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/Metadata.java b/src/main/java/com/google/devtools/build/lib/actions/cache/Metadata.java deleted file mode 100644 index b9a137d248..0000000000 --- a/src/main/java/com/google/devtools/build/lib/actions/cache/Metadata.java +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright 2014 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package com.google.devtools.build.lib.actions.cache; - -import com.google.devtools.build.lib.actions.FileStateType; -import javax.annotation.Nullable; - -/** - * An interface to represent the state of a file system object for the execution phase. This is not - * used by Skyframe for invalidation, it is primarily used by the action cache and the various - * {@link com.google.devtools.build.lib.exec.SpawnRunner} implementations. - */ -public interface Metadata { - /** - * Marker interface for singleton implementations of the Metadata interface. This is only needed - * for a correct implementation of {@code equals}. - */ - public interface Singleton { - } - - /** - * The type of the underlying file system object. If it is a regular file, then it is - * guaranteed to have a digest. Otherwise it does not have a digest. - */ - FileStateType getType(); - - /** - * Returns a digest of the content of the underlying file system object; must always return a - * non-null value for instances of type {@link FileStateType#REGULAR_FILE}. Otherwise may return - * null. - * - * <p>All instances of this interface must either have a digest or return a last-modified time. - * Clients should prefer using the digest for content identification (e.g., for caching), and only - * fall back to the last-modified time if no digest is available. - * - * <p>The return value is owned by this object and must not be modified. - */ - @Nullable - byte[] getDigest(); - - /** Returns the file's size, or 0 if the underlying file system object is not a file. */ - // TODO(ulfjack): Throw an exception if it's not a file. - long getSize(); - - /** - * Returns the last modified time; see the documentation of {@link #getDigest} for when this can - * and should be called. - */ - long getModifiedTime(); - - /** - * Index used to resolve remote files. - * - * <p>0 indicates that no such information is available which can mean that it's either a local - * file or empty. - */ - default int getLocationIndex() { - return 0; - } -} diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/MetadataHandler.java b/src/main/java/com/google/devtools/build/lib/actions/cache/MetadataHandler.java index fc7e8b9983..62d03fd372 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/cache/MetadataHandler.java +++ b/src/main/java/com/google/devtools/build/lib/actions/cache/MetadataHandler.java @@ -16,16 +16,19 @@ package com.google.devtools.build.lib.actions.cache; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.vfs.FileStatus; import java.io.IOException; /** - * Retrieves {@link Metadata} of {@link Artifact}s, and inserts virtual metadata as well. Some - * methods on this interface may only be called after a call to {@link #discardOutputMetadata}. - * Calling them before such a call results in an {@link IllegalStateException}. + * Retrieves {@link FileArtifactValue} of {@link Artifact}s, and inserts virtual metadata as well. * - * <p>Note that implementations of this interface call chmod on output files if - * {@link #discardOutputMetadata} has been called. + * <p>Some methods on this interface may only be called after a call to {@link + * #discardOutputMetadata}. Calling them before such a call results in an {@link + * IllegalStateException}. + * + * <p>Note that implementations of this interface call chmod on output files if {@link + * #discardOutputMetadata} has been called. */ public interface MetadataHandler { /** @@ -35,7 +38,7 @@ public interface MetadataHandler { * @return metadata instance * @throws IOException if metadata could not be obtained. */ - Metadata getMetadata(Artifact artifact) throws IOException; + FileArtifactValue getMetadata(Artifact artifact) throws IOException; /** Sets digest for virtual artifacts (e.g. middlemen). {@code md5Digest} must not be null. */ void setDigestForVirtualArtifact(Artifact artifact, Md5Digest md5Digest); diff --git a/src/main/java/com/google/devtools/build/lib/actions/cache/VirtualActionInput.java b/src/main/java/com/google/devtools/build/lib/actions/cache/VirtualActionInput.java index e4c52747e2..1c80cb4364 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/cache/VirtualActionInput.java +++ b/src/main/java/com/google/devtools/build/lib/actions/cache/VirtualActionInput.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.actions.cache; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.actions.ActionInput; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.protobuf.ByteString; import java.io.IOException; @@ -38,11 +39,11 @@ public interface VirtualActionInput extends ActionInput { ByteString getBytes() throws IOException; /** - * Returns the Metadata for this input if available. Null otherwise. + * Returns the metadata for this input if available. Null otherwise. * * @throws IOException */ - default Metadata getMetadata() throws IOException { + default FileArtifactValue getMetadata() throws IOException { return null; } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java index 566e52b072..6e0a8b0fd8 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/MavenServerFunction.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.bazel.repository; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.bazel.rules.workspace.MavenServerRule; import com.google.devtools.build.lib.packages.Rule; @@ -24,7 +25,6 @@ import com.google.devtools.build.lib.repository.ExternalPackageUtil; import com.google.devtools.build.lib.repository.ExternalRuleNotFoundException; import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException; import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.Fingerprint; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java index fce8bf687b..f245e1dc73 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryContext.java @@ -18,6 +18,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.bazel.repository.DecompressorDescriptor; import com.google.devtools.build.lib.bazel.repository.DecompressorValue; import com.google.devtools.build.lib.bazel.repository.cache.RepositoryCache.KeyType; @@ -32,7 +33,6 @@ import com.google.devtools.build.lib.packages.StructProvider; import com.google.devtools.build.lib.rules.repository.RepositoryFunction; import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException; import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.skylarkbuildapi.repository.SkylarkRepositoryContextApi; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.EvalUtils; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java index cf61da68b9..c4a1d77e27 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidNdkRepositoryFunction.java @@ -17,6 +17,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSortedSet; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.bazel.rules.android.ndkcrosstools.AndroidNdkCrosstools; @@ -34,7 +35,6 @@ import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper; import com.google.devtools.build.lib.skyframe.DirectoryListingValue; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.ResourceFileLoader; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidRepositoryFunction.java index ccf3d53346..7118de468b 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidRepositoryFunction.java @@ -14,11 +14,11 @@ package com.google.devtools.build.lib.bazel.rules.android; import com.google.common.collect.ImmutableSortedSet; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.rules.repository.RepositoryFunction; import com.google.devtools.build.lib.skyframe.DirectoryListingValue; import com.google.devtools.build.lib.skyframe.Dirents; -import com.google.devtools.build.lib.skyframe.FileValue; -import com.google.devtools.build.lib.skyframe.InconsistentFilesystemException; import com.google.devtools.build.lib.vfs.Dirent; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java index f42c575ce1..ede9cd2620 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/android/AndroidSdkRepositoryFunction.java @@ -22,6 +22,8 @@ import com.google.common.collect.ImmutableSortedSet; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Streams; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.packages.Rule; @@ -29,8 +31,6 @@ import com.google.devtools.build.lib.rules.repository.RepositoryDirectoryValue; import com.google.devtools.build.lib.rules.repository.WorkspaceAttributeMapper; import com.google.devtools.build.lib.skyframe.DirectoryListingValue; import com.google.devtools.build.lib.skyframe.Dirents; -import com.google.devtools.build.lib.skyframe.FileValue; -import com.google.devtools.build.lib.skyframe.InconsistentFilesystemException; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; import com.google.devtools.build.lib.util.ResourceFileLoader; diff --git a/src/main/java/com/google/devtools/build/lib/exec/BinTools.java b/src/main/java/com/google/devtools/build/lib/exec/BinTools.java index c754386c56..651fea5238 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/BinTools.java +++ b/src/main/java/com/google/devtools/build/lib/exec/BinTools.java @@ -23,10 +23,9 @@ import com.google.common.io.ByteStreams; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.EnvironmentalExecException; import com.google.devtools.build.lib.actions.ExecException; -import com.google.devtools.build.lib.actions.cache.Metadata; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.analysis.BlazeDirectories; -import com.google.devtools.build.lib.skyframe.FileArtifactValue; import com.google.devtools.build.lib.vfs.Dirent; import com.google.devtools.build.lib.vfs.FileSystem.HashFunction; import com.google.devtools.build.lib.vfs.FileSystemUtils; @@ -231,7 +230,7 @@ public final class BinTools { public static final class PathActionInput implements VirtualActionInput { private final Path path; private final PathFragment execPath; - private Metadata metadata; + private FileArtifactValue metadata; public PathActionInput(Path path, PathFragment execPath) { this.path = path; @@ -253,7 +252,7 @@ public final class BinTools { } @Override - public synchronized Metadata getMetadata() throws IOException { + public synchronized FileArtifactValue getMetadata() throws IOException { // We intentionally delay hashing until it is necessary. if (metadata == null) { metadata = hash(path); @@ -261,7 +260,7 @@ public final class BinTools { return metadata; } - private static Metadata hash(Path path) throws IOException { + private static FileArtifactValue hash(Path path) throws IOException { HashFunction hashFn = path.getFileSystem().getDigestFunction(); Hasher hasher = hashFn.getHash().newHasher(); int bytesCopied = 0; diff --git a/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java b/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java index 073e3d989c..10a816c886 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java +++ b/src/main/java/com/google/devtools/build/lib/exec/SingleBuildFileCache.java @@ -19,8 +19,7 @@ import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputFileCache; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.DigestOfDirectoryException; -import com.google.devtools.build.lib.actions.cache.Metadata; -import com.google.devtools.build.lib.skyframe.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import java.io.IOException; @@ -55,7 +54,7 @@ public class SingleBuildFileCache implements ActionInputFileCache { .build(); @Override - public Metadata getMetadata(ActionInput input) throws IOException { + public FileArtifactValue getMetadata(ActionInput input) throws IOException { try { return pathToMetadata .get( @@ -95,11 +94,11 @@ public class SingleBuildFileCache implements ActionInputFileCache { /** Container class for caching I/O around ActionInputs. */ private static class ActionInputMetadata { private final ActionInput input; - private final Metadata metadata; + private final FileArtifactValue metadata; private final IOException exceptionOnAccess; /** Constructor for a successful lookup. */ - ActionInputMetadata(ActionInput input, Metadata metadata) { + ActionInputMetadata(ActionInput input, FileArtifactValue metadata) { this.input = input; this.metadata = metadata; this.exceptionOnAccess = null; @@ -112,7 +111,7 @@ public class SingleBuildFileCache implements ActionInputFileCache { this.metadata = null; } - Metadata getMetadata() throws IOException { + FileArtifactValue getMetadata() throws IOException { maybeRaiseException(); return metadata; } diff --git a/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java b/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java index c5952350bc..89d91e4b68 100644 --- a/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java +++ b/src/main/java/com/google/devtools/build/lib/exec/SpawnLogContext.java @@ -18,11 +18,11 @@ import com.google.common.hash.HashCode; import com.google.devtools.build.lib.actions.ActionContext; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ExecutionStrategy; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.MetadataProvider; import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnResult; import com.google.devtools.build.lib.actions.Spawns; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.analysis.platform.PlatformInfo; import com.google.devtools.build.lib.cmdline.Label; @@ -39,7 +39,6 @@ import com.google.devtools.build.lib.vfs.Symlinks; import com.google.protobuf.TextFormat; import com.google.protobuf.TextFormat.ParseException; import java.io.ByteArrayOutputStream; - import java.io.IOException; import java.time.Duration; import java.util.ArrayList; @@ -228,7 +227,7 @@ public class SpawnLogContext implements ActionContext { } // Try to access the cached metadata, otherwise fall back to local computation. try { - Metadata metadata = metadataProvider.getMetadata(input); + FileArtifactValue metadata = metadataProvider.getMetadata(input); if (metadata != null) { byte[] hash = metadata.getDigest(); if (hash != null) { 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 311171cc4a..382a8d2f73 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 @@ -40,6 +40,7 @@ import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.ListeningExecutorService; import com.google.common.util.concurrent.MoreExecutors; import com.google.common.util.concurrent.ThreadFactoryBuilder; +import com.google.devtools.build.lib.actions.FileStateValue; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.TargetParsingException; @@ -87,7 +88,6 @@ import com.google.devtools.build.lib.query2.engine.Uniquifier; import com.google.devtools.build.lib.query2.engine.VariableContext; import com.google.devtools.build.lib.skyframe.BlacklistedPackagePrefixesValue; import com.google.devtools.build.lib.skyframe.ContainingPackageLookupFunction; -import com.google.devtools.build.lib.skyframe.FileStateValue; import com.google.devtools.build.lib.skyframe.GraphBackedRecursivePackageProvider; import com.google.devtools.build.lib.skyframe.PackageLookupValue; import com.google.devtools.build.lib.skyframe.PackageValue; diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java index 8a304cf89a..837d53347e 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java +++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnCache.java @@ -18,11 +18,11 @@ import static com.google.common.base.Strings.isNullOrEmpty; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.actions.ExecutionStrategy; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnResult; import com.google.devtools.build.lib.actions.SpawnResult.Status; import com.google.devtools.build.lib.actions.Spawns; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.events.Event; @@ -34,7 +34,6 @@ import com.google.devtools.build.lib.remote.TreeNodeRepository.TreeNode; import com.google.devtools.build.lib.remote.util.DigestUtil; import com.google.devtools.build.lib.remote.util.DigestUtil.ActionKey; import com.google.devtools.build.lib.remote.util.TracingMetadataUtils; -import com.google.devtools.build.lib.skyframe.FileArtifactValue; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.remoteexecution.v1test.Action; @@ -205,7 +204,7 @@ final class RemoteSpawnCache implements SpawnCache { if (input instanceof VirtualActionInput) { continue; } - Metadata metadata = context.getActionInputFileCache().getMetadata(input); + FileArtifactValue metadata = context.getActionInputFileCache().getMetadata(input); if (metadata instanceof FileArtifactValue) { FileArtifactValue artifactValue = (FileArtifactValue) metadata; Path path = execRoot.getRelative(input.getExecPath()); diff --git a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java index 6ffbd135b7..114ce46ddc 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java +++ b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java @@ -28,8 +28,8 @@ import com.google.common.io.BaseEncoding; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputHelper; import com.google.devtools.build.lib.actions.DigestOfDirectoryException; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.MetadataProvider; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; @@ -441,7 +441,7 @@ public final class TreeNodeRepository { if (input instanceof VirtualActionInput) { return Preconditions.checkNotNull(virtualInputDigestCache.get(input)); } - Metadata metadata = getInputMetadata(input); + FileArtifactValue metadata = getInputMetadata(input); byte[] digest = metadata.getDigest(); if (digest == null) { // If the artifact does not have a digest, it is because it is a directory. @@ -492,8 +492,8 @@ public final class TreeNodeRepository { } } - private Metadata getInputMetadata(ActionInput input) throws IOException { - Metadata metadata = + private FileArtifactValue getInputMetadata(ActionInput input) throws IOException { + FileArtifactValue metadata = Preconditions.checkNotNull( inputFileCache.getMetadata(input), "Missing metadata for: %s", input); if (metadata.getDigest() != null) { diff --git a/src/main/java/com/google/devtools/build/lib/remote/util/DigestUtil.java b/src/main/java/com/google/devtools/build/lib/remote/util/DigestUtil.java index ae8b109d55..defc0652cc 100644 --- a/src/main/java/com/google/devtools/build/lib/remote/util/DigestUtil.java +++ b/src/main/java/com/google/devtools/build/lib/remote/util/DigestUtil.java @@ -20,9 +20,9 @@ import com.google.common.hash.HashCode; import com.google.common.hash.HashingOutputStream; import com.google.common.io.BaseEncoding; import com.google.devtools.build.lib.actions.ActionInput; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.MetadataProvider; import com.google.devtools.build.lib.actions.cache.DigestUtils; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.VirtualActionInput; import com.google.devtools.build.lib.vfs.FileSystem.HashFunction; import com.google.devtools.build.lib.vfs.Path; @@ -123,7 +123,7 @@ public class DigestUtil { public static Digest getFromInputCache(ActionInput input, MetadataProvider cache) throws IOException { - Metadata metadata = cache.getMetadata(input); + FileArtifactValue metadata = cache.getMetadata(input); Preconditions.checkNotNull(metadata, "Input cache %s returned no value for %s", cache, input); Preconditions.checkNotNull( metadata.getDigest(), diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java index ddbe96e913..512661dfc4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoSupport.java @@ -27,13 +27,13 @@ import com.google.common.collect.Iterables; import com.google.common.io.ByteSource; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactRoot; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.AnalysisEnvironment; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.rules.cpp.CcToolchainFeatures.FeatureConfiguration; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java index a335d9db8b..904f771b3f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java @@ -14,11 +14,11 @@ package com.google.devtools.build.lib.rules.repository; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.packages.BuildFileName; import com.google.devtools.build.lib.packages.Rule; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java index bcf15976f0..a7111ce0ca 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/NewLocalRepositoryFunction.java @@ -14,12 +14,12 @@ package com.google.devtools.build.lib.rules.repository; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.skyframe.DirectoryListingValue; -import com.google.devtools.build.lib.skyframe.FileValue; -import com.google.devtools.build.lib.skyframe.InconsistentFilesystemException; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java b/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java index 14efd5e10b..5e3e92f0ac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/NewRepositoryFileHandler.java @@ -14,12 +14,12 @@ package com.google.devtools.build.lib.rules.repository; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.LabelValidator; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.skyframe.PackageLookupValue; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; 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 f8f1c26af2..db74f31652 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 @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.repository; import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; @@ -25,7 +26,6 @@ import com.google.devtools.build.lib.repository.ExternalPackageException; import com.google.devtools.build.lib.repository.ExternalPackageUtil; import com.google.devtools.build.lib.repository.ExternalRuleNotFoundException; import com.google.devtools.build.lib.rules.repository.RepositoryFunction.RepositoryFunctionException; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue.Precomputed; import com.google.devtools.build.lib.util.Fingerprint; diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java index 2b15ced504..565780d478 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java @@ -18,6 +18,8 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.io.BaseEncoding; +import com.google.devtools.build.lib.actions.FileStateValue.RegularFileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.cmdline.Label; @@ -34,8 +36,6 @@ import com.google.devtools.build.lib.repository.ExternalPackageException; import com.google.devtools.build.lib.repository.ExternalPackageUtil; import com.google.devtools.build.lib.repository.ExternalRuleNotFoundException; import com.google.devtools.build.lib.skyframe.ActionEnvironmentFunction; -import com.google.devtools.build.lib.skyframe.FileStateValue.RegularFileStateValue; -import com.google.devtools.build.lib.skyframe.FileValue; import com.google.devtools.build.lib.skyframe.PackageLookupValue; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java index b1f816d87a..df74c5e1a1 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ASTFileLookupFunction.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.BuildFileNotFoundException; import com.google.devtools.build.lib.packages.RuleClassProvider; 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 fa22da4584..2ffe103975 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 @@ -25,11 +25,13 @@ import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.ActionCacheChecker.Token; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; +import com.google.devtools.build.lib.actions.ActionInputMap; import com.google.devtools.build.lib.actions.ActionLookupData; import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.ActionLookupValue.ActionLookupKey; import com.google.devtools.build.lib.actions.AlreadyReportedActionExecutionException; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.FilesetOutputSymlink; import com.google.devtools.build.lib.actions.MissingInputFileException; import com.google.devtools.build.lib.actions.NotifyOnActionCacheHit; @@ -42,7 +44,6 @@ import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.rules.cpp.IncludeScannable; -import com.google.devtools.build.lib.skyframe.InputArtifactData.MutableInputArtifactData; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.Path; @@ -151,7 +152,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver env.getValues(state.allInputs.keysRequested); Preconditions.checkState(!env.valuesMissing(), "%s %s", action, state); } - Pair<MutableInputArtifactData, Map<Artifact, Collection<Artifact>>> checkedInputs = null; + Pair<ActionInputMap, Map<Artifact, Collection<Artifact>>> checkedInputs = null; try { // Declare deps on known inputs to action. We do this unconditionally to maintain our // invariant of asking for the same deps each build. @@ -574,13 +575,13 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver }; private static Iterable<SkyKey> newlyDiscoveredInputsToSkyKeys( - Iterable<Artifact> discoveredInputs, MutableInputArtifactData inputArtifactData) { + Iterable<Artifact> discoveredInputs, ActionInputMap inputArtifactData) { return Iterables.transform( filterKnownInputs(discoveredInputs, inputArtifactData), TO_NONMANDATORY_SKYKEY); } private static void addDiscoveredInputs( - MutableInputArtifactData inputData, + ActionInputMap inputData, Map<Artifact, Collection<Artifact>> expandedArtifacts, Iterable<Artifact> discoveredInputs, Environment env) @@ -663,7 +664,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver * Declare dependency on all known inputs of action. Throws exception if any are known to be * missing. Some inputs may not yet be in the graph, in which case the builder should abort. */ - private Pair<MutableInputArtifactData, Map<Artifact, Collection<Artifact>>> checkInputs( + private Pair<ActionInputMap, Map<Artifact, Collection<Artifact>>> checkInputs( Environment env, Action action, Map<SkyKey, ValueOrException2<MissingInputFileException, ActionExecutionException>> inputDeps) @@ -676,8 +677,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver // some deps are still missing. boolean populateInputData = !env.valuesMissing(); NestedSetBuilder<Cause> rootCauses = NestedSetBuilder.stableOrder(); - MutableInputArtifactData inputArtifactData = - new MutableInputArtifactData(populateInputData ? inputDeps.size() : 0); + ActionInputMap inputArtifactData = new ActionInputMap(populateInputData ? inputDeps.size() : 0); Map<Artifact, Collection<Artifact>> expandedArtifacts = new HashMap<>(populateInputData ? 128 : 0); @@ -768,8 +768,8 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver } private static Iterable<Artifact> filterKnownInputs( - Iterable<Artifact> newInputs, MutableInputArtifactData inputArtifactData) { - return Iterables.filter(newInputs, input -> !inputArtifactData.contains(input)); + Iterable<Artifact> newInputs, ActionInputMap inputArtifactData) { + return Iterables.filter(newInputs, input -> inputArtifactData.getMetadata(input) == null); } /** @@ -824,7 +824,7 @@ public class ActionExecutionFunction implements SkyFunction, CompletionReceiver private static class ContinuationState { AllInputs allInputs; /** Mutable map containing metadata for known artifacts. */ - MutableInputArtifactData inputArtifactData = null; + ActionInputMap inputArtifactData = null; Map<Artifact, Collection<Artifact>> expandedArtifacts = null; Token token = null; 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 a45983c1e9..8ddb52a905 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 @@ -23,6 +23,9 @@ import com.google.common.collect.Maps; import com.google.devtools.build.lib.actions.ActionLookupData; import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.FilesetOutputSymlink; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java index cd99db964f..591dd6c224 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionFileSystem.java @@ -23,11 +23,13 @@ import com.google.common.hash.Hashing; import com.google.common.io.BaseEncoding; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputFileCache; +import com.google.devtools.build.lib.actions.ActionInputMap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileArtifactValue.RemoteFileArtifactValue; import com.google.devtools.build.lib.actions.FileStateType; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.profiler.ProfilerTask; -import com.google.devtools.build.lib.skyframe.FileArtifactValue.RemoteFileArtifactValue; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -67,7 +69,7 @@ final class ActionFileSystem extends FileSystem implements ActionInputFileCache, private final Path execRootPath; private final ImmutableList<PathFragment> sourceRoots; - private final InputArtifactData inputArtifactData; + private final ActionInputMap inputArtifactData; /** exec path → artifact and metadata */ private final HashMap<PathFragment, OptionalInputMetadata> optionalInputs; @@ -93,7 +95,7 @@ final class ActionFileSystem extends FileSystem implements ActionInputFileCache, FileSystem delegate, Path execRoot, ImmutableList<Root> sourceRoots, - InputArtifactData inputArtifactData, + ActionInputMap inputArtifactData, Iterable<Artifact> allowedInputs, Iterable<Artifact> outputArtifacts) { try { @@ -119,7 +121,7 @@ final class ActionFileSystem extends FileSystem implements ActionInputFileCache, // // TODO(shahan): there are no currently known cases where metadata is requested for an // optional source input. If there are any, we may want to stage those. - if (input.isSourceArtifact() || inputArtifactData.contains(input)) { + if (input.isSourceArtifact() || inputArtifactData.getMetadata(input) != null) { continue; } optionalInputs.computeIfAbsent( @@ -157,6 +159,12 @@ final class ActionFileSystem extends FileSystem implements ActionInputFileCache, return getMetadataChecked(actionInput.getExecPath()); } + @Override + @Nullable + public ActionInput getInput(String execPath) { + return inputArtifactData.getInput(execPath); + } + // -------------------- InjectionListener Implementation -------------------- @Override @@ -265,7 +273,7 @@ final class ActionFileSystem extends FileSystem implements ActionInputFileCache, @Override protected void createSymbolicLink(Path linkPath, PathFragment targetFragment) throws IOException { PathFragment targetExecPath = asExecPath(targetFragment); - FileArtifactValue inputMetadata = inputArtifactData.get(targetExecPath); + FileArtifactValue inputMetadata = inputArtifactData.getMetadata(targetExecPath.getPathString()); if (inputMetadata == null) { OptionalInputMetadata metadataHolder = optionalInputs.get(targetExecPath); if (metadataHolder != null) { @@ -381,7 +389,7 @@ final class ActionFileSystem extends FileSystem implements ActionInputFileCache, @Nullable private FileArtifactValue getMetadataChecked(PathFragment execPath) throws IOException { { - FileArtifactValue metadata = inputArtifactData.get(execPath); + FileArtifactValue metadata = inputArtifactData.getMetadata(execPath.getPathString()); if (metadata != null) { return metadata; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java index b68930e492..af2a14347b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java @@ -22,11 +22,14 @@ import com.google.common.collect.Sets; import com.google.common.io.BaseEncoding; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputHelper; +import com.google.devtools.build.lib.actions.ActionInputMap; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.cache.Md5Digest; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.MetadataHandler; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.FileStatus; @@ -78,7 +81,7 @@ public class ActionMetadataHandler implements MetadataHandler { * * <p>This should never be read directly. Use {@link #getInputFileArtifactValue} instead. */ - private final InputArtifactData inputArtifactData; + private final ActionInputMap inputArtifactData; /** FileValues for each output Artifact. */ private final ConcurrentMap<Artifact, FileValue> outputArtifactData = @@ -130,7 +133,7 @@ public class ActionMetadataHandler implements MetadataHandler { @VisibleForTesting public ActionMetadataHandler( - InputArtifactData inputArtifactData, + ActionInputMap inputArtifactData, Iterable<Artifact> outputs, TimestampGranularityMonitor tsgm, ArtifactPathResolver artifactPathResolver) { @@ -153,7 +156,8 @@ public class ActionMetadataHandler implements MetadataHandler { return artifact.isConstantMetadata() ? null : tsgm; } - private static Metadata metadataFromValue(FileArtifactValue value) throws FileNotFoundException { + private static FileArtifactValue metadataFromValue(FileArtifactValue value) + throws FileNotFoundException { if (value == FileArtifactValue.MISSING_FILE_MARKER || value == FileArtifactValue.OMITTED_FILE_MARKER) { throw new FileNotFoundException(); @@ -171,11 +175,11 @@ public class ActionMetadataHandler implements MetadataHandler { return null; } - return inputArtifactData.get(input); + return inputArtifactData.getMetadata(input); } @Override - public Metadata getMetadata(Artifact artifact) throws IOException { + public FileArtifactValue getMetadata(Artifact artifact) throws IOException { FileArtifactValue value = getInputFileArtifactValue(artifact); if (value != null) { return metadataFromValue(value); @@ -248,8 +252,8 @@ public class ActionMetadataHandler implements MetadataHandler { * for normal (non-middleman) artifacts. */ @Nullable - private Metadata maybeStoreAdditionalData(Artifact artifact, FileValue data, - @Nullable byte[] injectedDigest) throws IOException { + private FileArtifactValue maybeStoreAdditionalData( + Artifact artifact, FileValue data, @Nullable byte[] injectedDigest) throws IOException { if (!data.exists()) { // Nonexistent files should only occur before executing an action. throw new FileNotFoundException(artifact.prettyPrint() + " does not exist"); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AggregatingArtifactValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AggregatingArtifactValue.java index 2fb2199e7c..e6e045bce4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AggregatingArtifactValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AggregatingArtifactValue.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.skyframe.SkyValue; import java.util.Collection; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java index bee72a2321..6913091c73 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java @@ -28,6 +28,8 @@ import com.google.devtools.build.lib.actions.ActionLookupValue.ActionLookupKey; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; import com.google.devtools.build.lib.actions.ArtifactOwner; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.MissingInputFileException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.Event; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index 79498d734b..24cd665d6b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Actions.GeneratingActions; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.AspectResolver; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java index 8d96dd3d40..eb0f645987 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BlacklistedPackagePrefixesFunction.java @@ -16,6 +16,8 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableSet; import com.google.common.io.CharStreams; import com.google.common.io.LineProcessor; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.Root; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingFunction.java index 97ee8b78bc..35265ce12b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/DirectoryListingFunction.java @@ -13,6 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; 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 8d19cc1739..8fc8afde8f 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 @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.Interner; +import com.google.devtools.build.lib.actions.FileValue; 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; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java b/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java index 94a1a3b1d2..ce4de19e82 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/DirtinessCheckerUtils.java @@ -13,12 +13,13 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import static com.google.devtools.build.lib.actions.FileStateValue.FILE_STATE; import static com.google.devtools.build.lib.skyframe.SkyFunctions.DIRECTORY_LISTING_STATE; -import static com.google.devtools.build.lib.skyframe.SkyFunctions.FILE_STATE; import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.FileStateValue; import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.FileType; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.Root; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java index f110ef82b6..7256adab7b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/EnvironmentBackedRecursivePackageProvider.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.events.Event; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java index dc04d4b306..53b1cec194 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java @@ -19,6 +19,9 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.devtools.build.lib.actions.FileStateType; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.util.Pair; import com.google.devtools.build.lib.vfs.Path; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java index 52876f2264..8eba4cd769 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateFunction.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.actions.FileStateValue; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.RootedPath; import com.google.devtools.build.skyframe.SkyFunction; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java index bd2f0263b3..e154a08780 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 @@ -25,6 +25,7 @@ import com.google.common.collect.Range; import com.google.common.collect.Sets; import com.google.common.util.concurrent.ThreadFactoryBuilder; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.concurrent.ExecutorUtil; import com.google.devtools.build.lib.concurrent.Sharder; import com.google.devtools.build.lib.concurrent.ThrowableRecordingRunnableWrapper; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java index 3dcb7f604f..9d2c94ac8f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java @@ -18,6 +18,8 @@ import com.google.common.cache.Cache; import com.google.common.cache.CacheBuilder; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java index 86effea4ac..2c3ebcad41 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/GraphBackedRecursivePackageProvider.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.google.common.collect.Sets.SetView; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.cmdline.TargetPattern; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/InputArtifactData.java b/src/main/java/com/google/devtools/build/lib/skyframe/InputArtifactData.java deleted file mode 100644 index 65b16d7462..0000000000 --- a/src/main/java/com/google/devtools/build/lib/skyframe/InputArtifactData.java +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2018 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -package com.google.devtools.build.lib.skyframe; - -import static java.nio.charset.StandardCharsets.US_ASCII; - -import com.google.common.io.BaseEncoding; -import com.google.devtools.build.lib.actions.ActionInput; -import com.google.devtools.build.lib.actions.ActionInputMap; -import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.vfs.PathFragment; -import com.google.protobuf.ByteString; -import javax.annotation.Nullable; - -/** A mapping from artifacts to metadata. */ -interface InputArtifactData { - - boolean contains(ActionInput input); - - @Nullable - FileArtifactValue get(ActionInput input); - - @Nullable - FileArtifactValue get(PathFragment execPath); - - @Nullable - ActionInput getInput(String execpath); - - /** - * This implementation has a privileged {@link put} method supporting mutations. - * - * <p>Action execution has distinct phases where this data can be read from multiple threads. It's - * important that the underlying data is not modified during those phases. - */ - final class MutableInputArtifactData implements InputArtifactData { - private final ActionInputMap inputs; - - public MutableInputArtifactData(int sizeHint) { - this.inputs = new ActionInputMap(sizeHint); - } - - @Override - public boolean contains(ActionInput input) { - return inputs.getMetadata(input) != null; - } - - @Override - @Nullable - public FileArtifactValue get(ActionInput input) { - return (FileArtifactValue) inputs.getMetadata(input); - } - - @Override - @Nullable - public FileArtifactValue get(PathFragment execPath) { - return (FileArtifactValue) inputs.getMetadata(execPath.getPathString()); - } - - @Override - public ActionInput getInput(String execPath) { - return inputs.getInput(execPath); - } - - public void put(Artifact artifact, FileArtifactValue value) { - inputs.put(artifact, value); - } - - @Override - public String toString() { - return inputs.toString(); - } - - private static ByteString toByteString(byte[] digest) { - return ByteString.copyFrom( - BaseEncoding.base16().lowerCase().encode(digest).getBytes(US_ASCII)); - } - } -} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java index 4c699ab635..cb1012df1d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunction.java @@ -16,6 +16,8 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.RepositoryName; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java index 6f7a53f96b..635040e66f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java @@ -25,6 +25,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java index 4b26017315..bc1b80a049 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java @@ -16,6 +16,8 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelValidator; import com.google.devtools.build.lib.cmdline.PackageIdentifier; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java b/src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java index 54dc3a1835..b5660181e4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java @@ -16,8 +16,9 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputFileCache; +import com.google.devtools.build.lib.actions.ActionInputMap; import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.actions.cache.Metadata; +import com.google.devtools.build.lib.actions.FileArtifactValue; import javax.annotation.Nullable; /** @@ -28,7 +29,7 @@ import javax.annotation.Nullable; * the source of truth. */ class PerActionFileCache implements ActionInputFileCache { - private final InputArtifactData inputArtifactData; + private final ActionInputMap inputArtifactData; private final boolean missingArtifactsAllowed; /** @@ -36,18 +37,19 @@ class PerActionFileCache implements ActionInputFileCache { * @param missingArtifactsAllowed whether to tolerate missing artifacts: can happen during input * discovery. */ - PerActionFileCache(InputArtifactData inputArtifactData, boolean missingArtifactsAllowed) { + PerActionFileCache(ActionInputMap inputArtifactData, boolean missingArtifactsAllowed) { this.inputArtifactData = Preconditions.checkNotNull(inputArtifactData); this.missingArtifactsAllowed = missingArtifactsAllowed; } @Nullable @Override - public Metadata getMetadata(ActionInput input) { + public FileArtifactValue getMetadata(ActionInput input) { + // TODO(shahan): is this bypass needed? if (!(input instanceof Artifact)) { return null; } - Metadata result = inputArtifactData.get(input); + FileArtifactValue result = inputArtifactData.getMetadata(input); Preconditions.checkState(missingArtifactsAllowed || result != null, "null for %s", input); return result; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java b/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java index 2768bde16d..40dce87169 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ProcessPackageDirectory.java @@ -18,6 +18,8 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java index 2948e4e16d..a03f87977f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunction.java @@ -18,6 +18,9 @@ import com.google.common.base.Preconditions; import com.google.common.base.Verify; import com.google.common.collect.Collections2; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.events.Event; 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 8d16da6439..05bce4b1d4 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 @@ -18,6 +18,7 @@ import com.google.common.base.Objects; import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.Interner; +import com.google.devtools.build.lib.actions.FileStateValue; import com.google.devtools.build.lib.actions.FilesetTraversalParams.DirectTraversalRoot; import com.google.devtools.build.lib.actions.FilesetTraversalParams.PackageBoundaryMode; import com.google.devtools.build.lib.collect.nestedset.NestedSet; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RunfilesArtifactValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RunfilesArtifactValue.java index 8969a2cbc6..644bd5e331 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/RunfilesArtifactValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RunfilesArtifactValue.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.util.Pair; /** The artifacts behind a runfiles middleman. */ 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 cf49cc96c8..b1cd6b022a 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 @@ -29,6 +29,8 @@ import com.google.common.collect.Sets; import com.google.devtools.build.lib.actions.ActionKeyContext; import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.actions.CommandLineExpansionException; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -313,8 +315,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { private static final ImmutableSet<SkyFunctionName> PACKAGE_LOCATOR_DEPENDENT_VALUES = ImmutableSet.of( SkyFunctions.AST_FILE_LOOKUP, - SkyFunctions.FILE_STATE, - SkyFunctions.FILE, + FileStateValue.FILE_STATE, + FileValue.FILE, SkyFunctions.DIRECTORY_LISTING_STATE, SkyFunctions.TARGET_PATTERN, SkyFunctions.PREPARE_DEPS_OF_PATTERN, @@ -561,8 +563,8 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { private static int getNumberOfModifiedFiles(Iterable<SkyKey> modifiedValues) { // We are searching only for changed files, DirectoryListingValues don't depend on // child values, that's why they are invalidated separately - return Iterables.size(Iterables.filter(modifiedValues, - SkyFunctionName.functionIs(SkyFunctions.FILE_STATE))); + return Iterables.size( + Iterables.filter(modifiedValues, SkyFunctionName.functionIs(FileStateValue.FILE_STATE))); } /** 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 7b9ca6d81f..0ef296c944 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 @@ -27,14 +27,12 @@ public final class SkyFunctions { SkyFunctionName.create("CLIENT_ENVIRONMENT_VARIABLE"); public static final SkyFunctionName ACTION_ENVIRONMENT_VARIABLE = SkyFunctionName.create("ACTION_ENVIRONMENT_VARIABLE"); - public static final SkyFunctionName FILE_STATE = SkyFunctionName.create("FILE_STATE"); public static final SkyFunctionName DIRECTORY_LISTING_STATE = SkyFunctionName.create("DIRECTORY_LISTING_STATE"); public static final SkyFunctionName FILE_SYMLINK_CYCLE_UNIQUENESS = SkyFunctionName.create("FILE_SYMLINK_CYCLE_UNIQUENESS"); public static final SkyFunctionName FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS = SkyFunctionName.create("FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS"); - public static final SkyFunctionName FILE = SkyFunctionName.create("FILE"); public static final SkyFunctionName DIRECTORY_LISTING = SkyFunctionName.create("DIRECTORY_LISTING"); public static final SkyFunctionName PACKAGE_LOOKUP = SkyFunctionName.create("PACKAGE_LOOKUP"); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java index 5efc8cdddb..d0cb1433a6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java @@ -55,6 +55,7 @@ import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; import com.google.devtools.build.lib.actions.CachedActionEvent; import com.google.devtools.build.lib.actions.EnvironmentalExecException; import com.google.devtools.build.lib.actions.Executor; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.FilesetOutputSymlink; import com.google.devtools.build.lib.actions.MapBasedActionGraph; import com.google.devtools.build.lib.actions.MutableActionGraph; @@ -63,7 +64,6 @@ import com.google.devtools.build.lib.actions.NotifyOnActionCacheHit; import com.google.devtools.build.lib.actions.NotifyOnActionCacheHit.ActionCachedContext; import com.google.devtools.build.lib.actions.PackageRootResolver; import com.google.devtools.build.lib.actions.TargetOutOfDateException; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.MetadataHandler; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ExecutorUtil; @@ -1266,8 +1266,8 @@ public final class SkyframeActionExecutor { } @Override - public Metadata getMetadata(ActionInput input) throws IOException { - Metadata metadata = perActionCache.getMetadata(input); + public FileArtifactValue getMetadata(ActionInput input) throws IOException { + FileArtifactValue metadata = perActionCache.getMetadata(input); return (metadata != null) && (metadata != FileArtifactValue.MISSING_FILE_MARKER) ? metadata : perBuildFileCache.getMetadata(input); 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 dea750e808..2b4da1b4a0 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 @@ -53,6 +53,8 @@ import com.google.devtools.build.lib.actions.CommandLineExpansionException; import com.google.devtools.build.lib.actions.EnvironmentalExecException; import com.google.devtools.build.lib.actions.Executor; import com.google.devtools.build.lib.actions.FileStateType; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.ResourceManager; import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer; import com.google.devtools.build.lib.analysis.AspectCollection; @@ -405,14 +407,14 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { map.put(SkyFunctions.PRECOMPUTED, new PrecomputedFunction()); map.put(SkyFunctions.CLIENT_ENVIRONMENT_VARIABLE, new ClientEnvironmentFunction(clientEnv)); map.put(SkyFunctions.ACTION_ENVIRONMENT_VARIABLE, new ActionEnvironmentFunction()); - map.put(SkyFunctions.FILE_STATE, new FileStateFunction(tsgm, externalFilesHelper)); + map.put(FileStateValue.FILE_STATE, new FileStateFunction(tsgm, externalFilesHelper)); map.put(SkyFunctions.DIRECTORY_LISTING_STATE, new DirectoryListingStateFunction(externalFilesHelper)); map.put(SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS, new FileSymlinkCycleUniquenessFunction()); map.put(SkyFunctions.FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS, new FileSymlinkInfiniteExpansionUniquenessFunction()); - map.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + map.put(FileValue.FILE, new FileFunction(pkgLocator)); map.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); map.put( SkyFunctions.PACKAGE_LOOKUP, @@ -1038,7 +1040,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { Map<SkyKey, SkyValue> valuesToInject = new HashMap<>(); for (Map.Entry<SkyKey, Delta> entry : diff.changedKeysWithNewAndOldValues().entrySet()) { SkyKey key = entry.getKey(); - Preconditions.checkState(key.functionName().equals(SkyFunctions.FILE_STATE), key); + Preconditions.checkState(key.functionName().equals(FileStateValue.FILE_STATE), key); RootedPath rootedPath = (RootedPath) key.argument(); Delta delta = entry.getValue(); FileStateValue oldValue = (FileStateValue) delta.getOldValue(); @@ -1074,7 +1076,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { } } for (SkyKey key : diff.changedKeysWithoutNewValues()) { - Preconditions.checkState(key.functionName().equals(SkyFunctions.FILE_STATE), key); + Preconditions.checkState(key.functionName().equals(FileStateValue.FILE_STATE), key); RootedPath rootedPath = (RootedPath) key.argument(); valuesToInvalidate.add(parentDirectoryListingStateKey(rootedPath)); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeIncrementalBuildMonitor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeIncrementalBuildMonitor.java index 462e51f852..3ab37e296d 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeIncrementalBuildMonitor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeIncrementalBuildMonitor.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableSet; import com.google.common.eventbus.EventBus; import com.google.devtools.build.lib.actions.ChangedFilesMessage; +import com.google.devtools.build.lib.actions.FileStateValue; import com.google.devtools.build.lib.concurrent.ThreadSafety; import com.google.devtools.build.lib.vfs.PathFragment; import com.google.devtools.build.lib.vfs.RootedPath; @@ -37,7 +38,7 @@ class SkyframeIncrementalBuildMonitor { public void accrue(Iterable<SkyKey> invalidatedValues) { for (SkyKey skyKey : invalidatedValues) { - if (skyKey.functionName().equals(SkyFunctions.FILE_STATE)) { + if (skyKey.functionName().equals(FileStateValue.FILE_STATE)) { RootedPath file = (RootedPath) skyKey.argument(); maybeAddFile(file.getRootRelativePath()); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java index 9903969613..a674abb8f5 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframePackageLoaderWithValueEnvironment.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; import com.google.devtools.build.lib.analysis.config.BuildOptions; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java index 93f7596723..9dc5ed80ab 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkImportLookupFunction.java @@ -26,6 +26,7 @@ import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; import com.google.devtools.build.lib.cmdline.PackageIdentifier; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunction.java index 1758fb3f1f..234eb6c9ec 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TargetMarkerFunction.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.PackageIdentifier; import com.google.devtools.build.lib.packages.BuildFileNotFoundException; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java index 4cf001457a..b7ca9088e5 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/TreeArtifactValue.java @@ -21,8 +21,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.cache.DigestUtils; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; @@ -61,7 +61,7 @@ class TreeArtifactValue implements SkyValue { * and their corresponding FileArtifactValues. */ static TreeArtifactValue create(Map<TreeFileArtifact, FileArtifactValue> childFileValues) { - Map<String, Metadata> digestBuilder = + Map<String, FileArtifactValue> digestBuilder = Maps.newHashMapWithExpectedSize(childFileValues.size()); for (Map.Entry<TreeFileArtifact, FileArtifactValue> e : childFileValues.entrySet()) { digestBuilder.put(e.getKey().getParentRelativePath().getPathString(), e.getValue()); @@ -76,7 +76,7 @@ class TreeArtifactValue implements SkyValue { return FileArtifactValue.createProxy(digest); } - Metadata getMetadata() { + FileArtifactValue getMetadata() { return getSelfData(); } @@ -129,57 +129,57 @@ class TreeArtifactValue implements SkyValue { } /** - * A TreeArtifactValue that represents a missing TreeArtifact. - * This is occasionally useful because Java's concurrent collections disallow null members. + * A TreeArtifactValue that represents a missing TreeArtifact. This is occasionally useful because + * Java's concurrent collections disallow null members. */ - static final TreeArtifactValue MISSING_TREE_ARTIFACT = new TreeArtifactValue(null, - ImmutableMap.<TreeFileArtifact, FileArtifactValue>of()) { - @Override - FileArtifactValue getSelfData() { - throw new UnsupportedOperationException(); - } + static final TreeArtifactValue MISSING_TREE_ARTIFACT = + new TreeArtifactValue(null, ImmutableMap.<TreeFileArtifact, FileArtifactValue>of()) { + @Override + FileArtifactValue getSelfData() { + throw new UnsupportedOperationException(); + } - @Override - Iterable<TreeFileArtifact> getChildren() { - throw new UnsupportedOperationException(); - } + @Override + Iterable<TreeFileArtifact> getChildren() { + throw new UnsupportedOperationException(); + } - @Override - Map<TreeFileArtifact, FileArtifactValue> getChildValues() { - throw new UnsupportedOperationException(); - } + @Override + Map<TreeFileArtifact, FileArtifactValue> getChildValues() { + throw new UnsupportedOperationException(); + } - @Override - Metadata getMetadata() { - throw new UnsupportedOperationException(); - } + @Override + FileArtifactValue getMetadata() { + throw new UnsupportedOperationException(); + } - @Override - Set<PathFragment> getChildPaths() { - throw new UnsupportedOperationException(); - } + @Override + Set<PathFragment> getChildPaths() { + throw new UnsupportedOperationException(); + } - @Nullable - @Override - byte[] getDigest() { - throw new UnsupportedOperationException(); - } + @Nullable + @Override + byte[] getDigest() { + throw new UnsupportedOperationException(); + } - @Override - public int hashCode() { - return 24; // my favorite number - } + @Override + public int hashCode() { + return 24; // my favorite number + } - @Override - public boolean equals(Object other) { - return this == other; - } + @Override + public boolean equals(Object other) { + return this == other; + } - @Override - public String toString() { - return "MISSING_TREE_ARTIFACT"; - } - }; + @Override + public String toString() { + return "MISSING_TREE_ARTIFACT"; + } + }; private static void explodeDirectory(Artifact treeArtifact, PathFragment pathToExplode, ImmutableSet.Builder<PathFragment> valuesBuilder) diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java index a36fd32677..a8d14cae61 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunction.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.BuildFileContainsErrorsException; import com.google.devtools.build.lib.packages.RuleClassProvider; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java index d8f4cb8b83..d0f74c5957 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java @@ -23,6 +23,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.eventbus.EventBus; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.clock.BlazeClock; @@ -388,12 +390,12 @@ public abstract class AbstractPackageLoader implements PackageLoader { ImmutableMap.Builder<SkyFunctionName, SkyFunction> builder = ImmutableMap.builder(); builder .put(SkyFunctions.PRECOMPUTED, new PrecomputedFunction()) - .put(SkyFunctions.FILE_STATE, new FileStateFunction(tsgm, externalFilesHelper)) + .put(FileStateValue.FILE_STATE, new FileStateFunction(tsgm, externalFilesHelper)) .put(SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS, new FileSymlinkCycleUniquenessFunction()) .put( SkyFunctions.FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS, new FileSymlinkInfiniteExpansionUniquenessFunction()) - .put(SkyFunctions.FILE, new FileFunction(pkgLocatorRef)) + .put(FileValue.FILE, new FileFunction(pkgLocatorRef)) .put( SkyFunctions.PACKAGE_LOOKUP, new PackageLookupFunction( diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD index 7cb108a81d..1fc1d1730b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/BUILD @@ -17,6 +17,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:io", "//src/main/java/com/google/devtools/build/lib:packages-internal", + "//src/main/java/com/google/devtools/build/lib/actions", "//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/lib/clock", diff --git a/src/main/java/com/google/devtools/build/lib/worker/WorkerFilesHash.java b/src/main/java/com/google/devtools/build/lib/worker/WorkerFilesHash.java index ddc7da791f..f35823a83e 100644 --- a/src/main/java/com/google/devtools/build/lib/worker/WorkerFilesHash.java +++ b/src/main/java/com/google/devtools/build/lib/worker/WorkerFilesHash.java @@ -23,8 +23,8 @@ import com.google.devtools.build.lib.actions.ActionInputFileCache; import com.google.devtools.build.lib.actions.ActionInputHelper; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.Spawn; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.nio.charset.Charset; @@ -72,7 +72,7 @@ class WorkerFilesHash { for (Map.Entry<PathFragment, Artifact> mapping : rootAndMappings.getValue().entrySet()) { Artifact localArtifact = mapping.getValue(); if (localArtifact != null) { - Metadata metadata = actionInputFileCache.getMetadata(localArtifact); + FileArtifactValue metadata = actionInputFileCache.getMetadata(localArtifact); if (metadata.getType().isFile()) { workerFilesMap.put( root.getRelative(mapping.getKey()), diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD index 0e83b5905a..29b35fd409 100644 --- a/src/test/java/com/google/devtools/build/lib/BUILD +++ b/src/test/java/com/google/devtools/build/lib/BUILD @@ -1487,6 +1487,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib:events", "//src/main/java/com/google/devtools/build/lib:io", "//src/main/java/com/google/devtools/build/lib:packages-internal", + "//src/main/java/com/google/devtools/build/lib/actions", "//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", diff --git a/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java b/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java index 87578eb195..a84efb34ca 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java +++ b/src/test/java/com/google/devtools/build/lib/actions/ActionCacheCheckerTest.java @@ -22,7 +22,6 @@ import com.google.devtools.build.lib.actions.ActionCacheChecker.Token; import com.google.devtools.build.lib.actions.cache.ActionCache; import com.google.devtools.build.lib.actions.cache.CompactPersistentActionCache; import com.google.devtools.build.lib.actions.cache.Md5Digest; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.MetadataHandler; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics.MissDetail; @@ -32,7 +31,6 @@ import com.google.devtools.build.lib.actions.util.ActionsTestUtil.FakeMetadataHa import com.google.devtools.build.lib.actions.util.ActionsTestUtil.MissDetailsBuilder; import com.google.devtools.build.lib.actions.util.ActionsTestUtil.NullAction; import com.google.devtools.build.lib.clock.Clock; -import com.google.devtools.build.lib.skyframe.FileArtifactValue; import com.google.devtools.build.lib.testutil.ManualClock; import com.google.devtools.build.lib.testutil.Scratch; import com.google.devtools.build.lib.util.Fingerprint; @@ -335,7 +333,7 @@ public class ActionCacheCheckerTest { /** A fake metadata handler that is able to obtain metadata from the file system. */ private static class FakeMetadataHandler extends FakeMetadataHandlerBase { @Override - public Metadata getMetadata(Artifact artifact) throws IOException { + public FileArtifactValue getMetadata(Artifact artifact) throws IOException { return FileArtifactValue.create(artifact); } diff --git a/src/test/java/com/google/devtools/build/lib/actions/ActionInputMapTest.java b/src/test/java/com/google/devtools/build/lib/actions/ActionInputMapTest.java index 5690fecaf5..2f3313e2ea 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/ActionInputMapTest.java +++ b/src/test/java/com/google/devtools/build/lib/actions/ActionInputMapTest.java @@ -16,7 +16,7 @@ package com.google.devtools.build.lib.actions; import static com.google.common.truth.Truth.assertThat; import static java.nio.charset.StandardCharsets.US_ASCII; -import com.google.devtools.build.lib.actions.cache.Metadata; +import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.util.ArrayList; import java.util.Collections; @@ -160,7 +160,7 @@ public final class ActionInputMapTest { } } - private static class TestMetadata implements Metadata { + private static class TestMetadata extends FileArtifactValue { private final int id; public TestMetadata(int id) { @@ -188,6 +188,11 @@ public final class ActionInputMapTest { } @Override + public boolean wasModifiedSinceDigest(Path path) { + throw new UnsupportedOperationException(); + } + + @Override @SuppressWarnings("EqualsHashCode") public boolean equals(Object o) { if (!(o instanceof TestMetadata)) { diff --git a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java index 90eec0c6ce..54b4d9dc28 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java +++ b/src/test/java/com/google/devtools/build/lib/actions/cache/CompactPersistentActionCacheTest.java @@ -17,7 +17,7 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; import com.google.common.collect.ImmutableMap; -import com.google.devtools.build.lib.skyframe.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.testutil.ManualClock; import com.google.devtools.build.lib.testutil.Scratch; import com.google.devtools.build.lib.vfs.Path; diff --git a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java index bad5203a0c..013f57e162 100644 --- a/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java +++ b/src/test/java/com/google/devtools/build/lib/actions/util/ActionsTestUtil.java @@ -46,11 +46,11 @@ import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.actions.ArtifactResolver; import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.actions.Executor; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.MutableActionGraph; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.PackageRootResolver; import com.google.devtools.build.lib.actions.cache.Md5Digest; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.cache.MetadataHandler; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics.MissDetail; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics.MissReason; @@ -709,7 +709,7 @@ public final class ActionsTestUtil { */ public static class FakeMetadataHandlerBase implements MetadataHandler { @Override - public Metadata getMetadata(Artifact artifact) throws IOException { + public FileArtifactValue getMetadata(Artifact artifact) throws IOException { throw new UnsupportedOperationException(); } diff --git a/src/test/java/com/google/devtools/build/lib/exec/SpawnInputExpanderTest.java b/src/test/java/com/google/devtools/build/lib/exec/SpawnInputExpanderTest.java index 211dbe911b..67be7faaf4 100644 --- a/src/test/java/com/google/devtools/build/lib/exec/SpawnInputExpanderTest.java +++ b/src/test/java/com/google/devtools/build/lib/exec/SpawnInputExpanderTest.java @@ -27,12 +27,12 @@ import com.google.devtools.build.lib.actions.ActionInputHelper; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.actions.EmptyRunfilesSupplier; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.FilesetOutputSymlink; import com.google.devtools.build.lib.actions.RunfilesSupplier; import com.google.devtools.build.lib.analysis.Runfiles; import com.google.devtools.build.lib.analysis.RunfilesSupplierImpl; import com.google.devtools.build.lib.exec.util.FakeActionInputFileCache; -import com.google.devtools.build.lib.skyframe.FileArtifactValue; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; diff --git a/src/test/java/com/google/devtools/build/lib/exec/util/FakeActionInputFileCache.java b/src/test/java/com/google/devtools/build/lib/exec/util/FakeActionInputFileCache.java index 9c215fceb4..6eb2668981 100644 --- a/src/test/java/com/google/devtools/build/lib/exec/util/FakeActionInputFileCache.java +++ b/src/test/java/com/google/devtools/build/lib/exec/util/FakeActionInputFileCache.java @@ -16,24 +16,24 @@ package com.google.devtools.build.lib.exec.util; import com.google.common.base.Preconditions; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputFileCache; -import com.google.devtools.build.lib.actions.cache.Metadata; +import com.google.devtools.build.lib.actions.FileArtifactValue; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** A fake implementation of the {@link ActionInputFileCache} interface. */ public final class FakeActionInputFileCache implements ActionInputFileCache { - private final Map<ActionInput, Metadata> inputs = new HashMap<>(); + private final Map<ActionInput, FileArtifactValue> inputs = new HashMap<>(); public FakeActionInputFileCache() { } - public void put(ActionInput artifact, Metadata metadata) { + public void put(ActionInput artifact, FileArtifactValue metadata) { inputs.put(artifact, metadata); } @Override - public Metadata getMetadata(ActionInput input) throws IOException { + public FileArtifactValue getMetadata(ActionInput input) throws IOException { return Preconditions.checkNotNull(inputs.get(input)); } } diff --git a/src/test/java/com/google/devtools/build/lib/remote/FakeActionInputFileCache.java b/src/test/java/com/google/devtools/build/lib/remote/FakeActionInputFileCache.java index 26cc290503..729eeb2dbf 100644 --- a/src/test/java/com/google/devtools/build/lib/remote/FakeActionInputFileCache.java +++ b/src/test/java/com/google/devtools/build/lib/remote/FakeActionInputFileCache.java @@ -19,10 +19,9 @@ import com.google.common.collect.HashBiMap; import com.google.common.hash.HashCode; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputFileCache; -import com.google.devtools.build.lib.actions.cache.Metadata; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileContentsProxy; import com.google.devtools.build.lib.remote.util.DigestUtil; -import com.google.devtools.build.lib.skyframe.FileArtifactValue; -import com.google.devtools.build.lib.skyframe.FileContentsProxy; import com.google.devtools.build.lib.vfs.FileStatus; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; @@ -43,7 +42,7 @@ final class FakeActionInputFileCache implements ActionInputFileCache { } @Override - public Metadata getMetadata(ActionInput input) throws IOException { + public FileArtifactValue getMetadata(ActionInput input) throws IOException { String hexDigest = Preconditions.checkNotNull(cas.get(input), input); Path path = execRoot.getRelative(input.getExecPath()); FileStatus stat = path.stat(Symlinks.FOLLOW); diff --git a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java index 4655acc06a..709d9dc237 100644 --- a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java +++ b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java @@ -20,6 +20,8 @@ import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory. import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.analysis.util.AnalysisMock; @@ -110,10 +112,10 @@ public class ExternalPackageUtilTest extends BuildViewTestCase { CrossRepositoryLabelViolationStrategy.ERROR, BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY)); skyFunctions.put( - SkyFunctions.FILE_STATE, + FileStateValue.FILE_STATE, new FileStateFunction( new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); RuleClassProvider ruleClassProvider = analysisMock.createRuleClassProvider(); skyFunctions.put(SkyFunctions.WORKSPACE_AST, new WorkspaceASTFunction(ruleClassProvider)); skyFunctions.put( diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java index 78f2d01952..8bde0bc8d2 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java @@ -18,6 +18,8 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.cmdline.RepositoryName; @@ -98,10 +100,10 @@ public class RepositoryDelegatorTest extends FoundationTestCase { new InMemoryMemoizingEvaluator( ImmutableMap.<SkyFunctionName, SkyFunction>builder() .put( - SkyFunctions.FILE_STATE, + FileStateValue.FILE_STATE, new FileStateFunction( new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)) - .put(SkyFunctions.FILE, new FileFunction(pkgLocator)) + .put(FileValue.FILE, new FileFunction(pkgLocator)) .put(SkyFunctions.REPOSITORY_DIRECTORY, delegatorFunction) .put( SkyFunctions.PACKAGE, diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryFunctionTest.java index c767d51599..f399544ede 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryFunctionTest.java @@ -18,15 +18,15 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.annotations.VisibleForTesting; import com.google.common.io.BaseEncoding; +import com.google.devtools.build.lib.actions.FileContentsProxy; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileStateValue.RegularFileStateValue; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.FileValue.RegularFileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.RuleDefinition; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.packages.Rule; -import com.google.devtools.build.lib.skyframe.FileContentsProxy; -import com.google.devtools.build.lib.skyframe.FileStateValue; -import com.google.devtools.build.lib.skyframe.FileStateValue.RegularFileStateValue; -import com.google.devtools.build.lib.skyframe.FileValue; -import com.google.devtools.build.lib.skyframe.FileValue.RegularFileValue; import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java index 9703fb466f..ef300318ac 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionFunctionTest.java @@ -33,6 +33,7 @@ import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; import com.google.devtools.build.lib.actions.ArtifactRoot; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.util.ActionsTestUtil; import com.google.devtools.build.lib.analysis.ConfiguredTarget; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java index 4615783887..2b137edcf2 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java @@ -14,7 +14,7 @@ package com.google.devtools.build.lib.skyframe; import static com.google.common.truth.Truth.assertThat; -import static com.google.devtools.build.lib.skyframe.FileArtifactValue.create; +import static com.google.devtools.build.lib.actions.FileArtifactValue.create; import static org.junit.Assert.fail; import com.google.common.collect.ImmutableList; @@ -33,6 +33,8 @@ import com.google.devtools.build.lib.actions.Artifact.SpecialArtifactType; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.actions.BasicActionLookupValue; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.MissingInputFileException; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.util.ActionsTestUtil; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java index c0c2d73559..aa736834a8 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java @@ -19,6 +19,8 @@ import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionKeyContext; import com.google.devtools.build.lib.actions.ActionLookupValue.ActionLookupKey; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; @@ -91,10 +93,10 @@ abstract class ArtifactFunctionTestCase { new InMemoryMemoizingEvaluator( ImmutableMap.<SkyFunctionName, SkyFunction>builder() .put( - SkyFunctions.FILE_STATE, + FileStateValue.FILE_STATE, new FileStateFunction( new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)) - .put(SkyFunctions.FILE, new FileFunction(pkgLocator)) + .put(FileValue.FILE, new FileFunction(pkgLocator)) .put(SkyFunctions.ARTIFACT, new ArtifactFunction()) .put(SkyFunctions.ACTION_EXECUTION, new SimpleActionExecutionFunction()) .put( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java index 100b0868a5..4c845afc2d 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java @@ -19,6 +19,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.testing.EqualsTester; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.analysis.util.AnalysisMock; @@ -108,9 +110,11 @@ public class ContainingPackageLookupFunctionTest extends FoundationTestCase { new BlacklistedPackagePrefixesFunction( /*hardcodedBlacklistedPackagePrefixes=*/ ImmutableSet.of(), /*additionalBlacklistedPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT)); - skyFunctions.put(SkyFunctions.FILE_STATE, new FileStateFunction( - new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put( + FileStateValue.FILE_STATE, + new FileStateFunction( + new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); skyFunctions.put( SkyFunctions.DIRECTORY_LISTING_STATE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java index 87e4bd2a6d..92ed59611f 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileArtifactValueTest.java @@ -14,11 +14,12 @@ package com.google.devtools.build.lib.skyframe; import static com.google.common.truth.Truth.assertThat; -import static com.google.devtools.build.lib.skyframe.FileArtifactValue.create; +import static com.google.devtools.build.lib.actions.FileArtifactValue.create; import static org.junit.Assert.fail; import com.google.common.io.BaseEncoding; import com.google.common.testing.EqualsTester; +import com.google.devtools.build.lib.actions.FileArtifactValue; import com.google.devtools.build.lib.testutil.ManualClock; import com.google.devtools.build.lib.vfs.FileSystem; import com.google.devtools.build.lib.vfs.FileSystemUtils; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileContentsProxyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileContentsProxyTest.java index 0ca3da5f80..db4cdc028b 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileContentsProxyTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileContentsProxyTest.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe; import static com.google.common.truth.Truth.assertThat; import com.google.common.testing.EqualsTester; +import com.google.devtools.build.lib.actions.FileContentsProxy; import com.google.devtools.build.lib.vfs.FileStatus; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java index 926d63b2ac..390436b0c7 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java @@ -30,6 +30,9 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.google.common.testing.EqualsTester; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.clock.BlazeClock; @@ -140,7 +143,7 @@ public class FileFunctionTest { new InMemoryMemoizingEvaluator( ImmutableMap.<SkyFunctionName, SkyFunction>builder() .put( - SkyFunctions.FILE_STATE, + FileStateValue.FILE_STATE, new FileStateFunction( new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)) .put( @@ -149,7 +152,7 @@ public class FileFunctionTest { .put( SkyFunctions.FILE_SYMLINK_INFINITE_EXPANSION_UNIQUENESS, new FileSymlinkInfiniteExpansionUniquenessFunction()) - .put(SkyFunctions.FILE, new FileFunction(pkgLocatorRef)) + .put(FileValue.FILE, new FileFunction(pkgLocatorRef)) .put( SkyFunctions.PACKAGE, new PackageFunction(null, null, null, null, null, null, null)) @@ -765,7 +768,7 @@ public class FileFunctionTest { Iterables.transform( Iterables.filter( graph.getValues().keySet(), - SkyFunctionName.functionIs(SkyFunctions.FILE_STATE)), + SkyFunctionName.functionIs(FileStateValue.FILE_STATE)), new Function<SkyKey, Object>() { @Override public Object apply(SkyKey skyKey) { diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileStateValueTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileStateValueTest.java index 36f8d248b7..f3b3c5851d 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileStateValueTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileStateValueTest.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.actions.FileContentsProxy; +import com.google.devtools.build.lib.actions.FileStateValue; import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester; import com.google.devtools.build.lib.vfs.PathFragment; import org.junit.Test; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileValueTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileValueTest.java index c6d0a34d74..2b059ab170 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FileValueTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileValueTest.java @@ -14,6 +14,8 @@ package com.google.devtools.build.lib.skyframe; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.skyframe.serialization.testutils.FsUtils; import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester; import com.google.devtools.build.lib.vfs.FileSystem; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java index 02088a9d7e..df0320f16d 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java @@ -26,6 +26,8 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactRoot; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.FilesetOutputSymlink; import com.google.devtools.build.lib.actions.FilesetTraversalParams; import com.google.devtools.build.lib.actions.FilesetTraversalParams.PackageBoundaryMode; @@ -101,9 +103,11 @@ public final class FilesetEntryFunctionTest extends FoundationTestCase { Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>(); - skyFunctions.put(SkyFunctions.FILE_STATE, new FileStateFunction( - new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put( + FileStateValue.FILE_STATE, + new FileStateFunction( + new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); skyFunctions.put( SkyFunctions.DIRECTORY_LISTING_STATE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java index f0112d4c9f..385b738a19 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java @@ -30,6 +30,9 @@ import com.google.devtools.build.lib.actions.Artifact.SpecialArtifactType; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.actions.ArtifactRoot; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.util.TestAction; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; @@ -117,9 +120,11 @@ public class FilesystemValueCheckerTest { TestConstants.PRODUCT_NAME); ExternalFilesHelper externalFilesHelper = ExternalFilesHelper.createForTesting( pkgLocator, ExternalFileAction.DEPEND_ON_EXTERNAL_PKG_FOR_EXTERNAL_REPO_PATHS, directories); - skyFunctions.put(SkyFunctions.FILE_STATE, new FileStateFunction( - new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put( + FileStateValue.FILE_STATE, + new FileStateFunction( + new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); skyFunctions.put( SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS, new FileSymlinkCycleUniquenessFunction()); skyFunctions.put( diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java index 167672a346..7d118c6f0c 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java @@ -24,6 +24,9 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.testing.EqualsTester; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; +import com.google.devtools.build.lib.actions.InconsistentFilesystemException; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.analysis.util.AnalysisMock; @@ -160,10 +163,10 @@ public abstract class GlobFunctionTest { /*hardcodedBlacklistedPackagePrefixes=*/ ImmutableSet.of(), /*additionalBlacklistedPackagePrefixesFile=*/ PathFragment.EMPTY_FRAGMENT)); skyFunctions.put( - SkyFunctions.FILE_STATE, + FileStateValue.FILE_STATE, new FileStateFunction( new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); skyFunctions.put( SkyFunctions.DIRECTORY_LISTING_STATE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java index 3e457ba8be..30524ff2bf 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java @@ -18,6 +18,8 @@ import static com.google.devtools.build.skyframe.EvaluationResultSubjectFactory. import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.analysis.util.AnalysisMock; @@ -90,10 +92,10 @@ public class LocalRepositoryLookupFunctionTest extends FoundationTestCase { CrossRepositoryLabelViolationStrategy.ERROR, BazelSkyframeExecutorConstants.BUILD_FILES_BY_PRIORITY)); skyFunctions.put( - SkyFunctions.FILE_STATE, + FileStateValue.FILE_STATE, new FileStateFunction( new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); skyFunctions.put( SkyFunctions.DIRECTORY_LISTING_STATE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java index db71edaf96..b6681d023f 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java @@ -22,6 +22,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.common.collect.Sets; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.clock.BlazeClock; import com.google.devtools.build.lib.cmdline.Label; @@ -570,7 +572,7 @@ public class PackageFunctionTest extends BuildViewTestCase { getSkyframeExecutor() .invalidate( Predicates.equalTo( - com.google.devtools.build.lib.skyframe.FileStateValue.key( + FileStateValue.key( RootedPath.toRootedPath( Root.fromPath(workspacePath.getParentDirectory()), PathFragment.create(workspacePath.getBaseName()))))); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java index 4d6339922f..75625593ae 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java @@ -21,6 +21,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.testing.EqualsTester; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.BlazeDirectories; import com.google.devtools.build.lib.analysis.ServerDirectories; import com.google.devtools.build.lib.analysis.util.AnalysisMock; @@ -117,9 +119,11 @@ public abstract class PackageLookupFunctionTest extends FoundationTestCase { skyFunctions.put( SkyFunctions.PACKAGE, new PackageFunction(null, null, null, null, null, null, null)); - skyFunctions.put(SkyFunctions.FILE_STATE, new FileStateFunction( - new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put( + FileStateValue.FILE_STATE, + new FileStateFunction( + new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); skyFunctions.put( SkyFunctions.DIRECTORY_LISTING_STATE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java index 6e62d1afdb..6ccaa19a3b 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java @@ -28,6 +28,9 @@ import com.google.common.collect.ImmutableSet; import com.google.common.collect.Sets; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ArtifactRoot; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.FilesetTraversalParams.DirectTraversalRoot; import com.google.devtools.build.lib.actions.FilesetTraversalParams.PackageBoundaryMode; import com.google.devtools.build.lib.analysis.BlazeDirectories; @@ -112,9 +115,10 @@ public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTe ConfiguredRuleClassProvider ruleClassProvider = analysisMock.createRuleClassProvider(); Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>(); - skyFunctions.put(SkyFunctions.FILE_STATE, new FileStateFunction( - new AtomicReference<>(), externalFilesHelper)); - skyFunctions.put(SkyFunctions.FILE, new FileFunction(pkgLocator)); + skyFunctions.put( + FileStateValue.FILE_STATE, + new FileStateFunction(new AtomicReference<>(), externalFilesHelper)); + skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator)); skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction()); skyFunctions.put( SkyFunctions.DIRECTORY_LISTING_STATE, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java index 00cdc24dba..3bd08d38ec 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.actions.ActionKeyContext; import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Executor; +import com.google.devtools.build.lib.actions.FileStateValue; import com.google.devtools.build.lib.actions.util.ActionsTestUtil; import com.google.devtools.build.lib.actions.util.DummyExecutor; import com.google.devtools.build.lib.testutil.TimestampGranularityUtils; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java index e17e673f5f..2b16cdfb1c 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java @@ -44,6 +44,8 @@ import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.actions.BasicActionLookupValue; import com.google.devtools.build.lib.actions.BuildFailedException; import com.google.devtools.build.lib.actions.Executor; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.ResourceManager; import com.google.devtools.build.lib.actions.ResourceSet; @@ -203,8 +205,8 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase { final InMemoryMemoizingEvaluator evaluator = new InMemoryMemoizingEvaluator( ImmutableMap.<SkyFunctionName, SkyFunction>builder() - .put(SkyFunctions.FILE_STATE, new FileStateFunction(tsgmRef, externalFilesHelper)) - .put(SkyFunctions.FILE, new FileFunction(pkgLocator)) + .put(FileStateValue.FILE_STATE, new FileStateFunction(tsgmRef, externalFilesHelper)) + .put(FileValue.FILE, new FileFunction(pkgLocator)) .put(SkyFunctions.ARTIFACT, new ArtifactFunction()) .put( SkyFunctions.ACTION_EXECUTION, diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java index 54a9302f46..1b9b6bc4f8 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java @@ -34,10 +34,11 @@ import com.google.devtools.build.lib.actions.Artifact.SpecialArtifactType; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.actions.BasicActionLookupValue; +import com.google.devtools.build.lib.actions.FileArtifactValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.actions.MissingInputFileException; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.cache.DigestUtils; -import com.google.devtools.build.lib.actions.cache.Metadata; import com.google.devtools.build.lib.actions.util.TestAction.DummyAction; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.vfs.FileStatus; @@ -101,9 +102,9 @@ public class TreeArtifactMetadataTest extends ArtifactFunctionTestCase { // Assertions about digest. As of this writing this logic is essentially the same // as that in TreeArtifact, but it's good practice to unit test anyway to guard against // breaking changes. - Map<String, Metadata> digestBuilder = new HashMap<>(); + Map<String, FileArtifactValue> digestBuilder = new HashMap<>(); for (PathFragment child : children) { - Metadata subdigest = FileArtifactValue.create(tree.getPath().getRelative(child)); + FileArtifactValue subdigest = FileArtifactValue.create(tree.getPath().getRelative(child)); digestBuilder.put(child.getPathString(), subdigest); } assertThat(DigestUtils.fromMetadata(digestBuilder).getDigestBytesUnsafe()) @@ -114,7 +115,7 @@ public class TreeArtifactMetadataTest extends ArtifactFunctionTestCase { @Test public void testEmptyTreeArtifacts() throws Exception { TreeArtifactValue value = doTestTreeArtifacts(ImmutableList.<PathFragment>of()); - // Additional test, only for this test method: we expect the Metadata is equal to + // Additional test, only for this test method: we expect the FileArtifactValue is equal to // the digest [0, 0, ...] assertThat(value.getMetadata().getDigest()).isEqualTo(value.getDigest()); // Java zero-fills arrays. diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java index ece3f59aed..b06f6c7546 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceASTFunctionTest.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe; import static com.google.common.truth.Truth.assertThat; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.skyframe.WorkspaceFileFunctionTest.FakeFileValue; @@ -67,7 +68,7 @@ public class WorkspaceASTFunctionTest extends BuildViewTestCase { private SkyFunction.Environment getEnv() throws InterruptedException { SkyFunction.Environment env = Mockito.mock(SkyFunction.Environment.class); - Mockito.when(env.getValue(Matchers.argThat(new SkyKeyMatchers(SkyFunctions.FILE)))) + Mockito.when(env.getValue(Matchers.argThat(new SkyKeyMatchers(FileValue.FILE)))) .thenReturn(fakeWorkspaceFileValue); return env; } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java index 95e9e880fa..4e633e4632 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/WorkspaceFileFunctionTest.java @@ -17,6 +17,8 @@ package com.google.devtools.build.lib.skyframe; import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.FileStateValue; +import com.google.devtools.build.lib.actions.FileValue; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.util.BuildViewTestCase; import com.google.devtools.build.lib.cmdline.Label; @@ -131,7 +133,7 @@ public class WorkspaceFileFunctionTest extends BuildViewTestCase { // Dummy harmcrest matcher that match the function name of a skykey static class SkyKeyMatchers extends BaseMatcher<SkyKey> { private final SkyFunctionName functionName; - + public SkyKeyMatchers(SkyFunctionName functionName) { this.functionName = functionName; } @@ -142,14 +144,14 @@ public class WorkspaceFileFunctionTest extends BuildViewTestCase { } return false; } - + @Override public void describeTo(Description description) {} } private SkyFunction.Environment getEnv() throws InterruptedException { SkyFunction.Environment env = Mockito.mock(SkyFunction.Environment.class); - Mockito.when(env.getValue(Matchers.argThat(new SkyKeyMatchers(SkyFunctions.FILE)))) + Mockito.when(env.getValue(Matchers.argThat(new SkyKeyMatchers(FileValue.FILE)))) .thenReturn(fakeWorkspaceFileValue); Mockito.when(env.getValue(Matchers.argThat(new SkyKeyMatchers(SkyFunctions.WORKSPACE_FILE)))) .then( |