diff options
author | ulfjack <ulfjack@google.com> | 2018-01-30 08:19:47 -0800 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-01-30 08:21:32 -0800 |
commit | 9e344ec089f3f46ac6d4cdf2638b671242f87631 (patch) | |
tree | 45ffcba907b449cb495568e40e29f523268302b1 /src/main/java/com | |
parent | 74e268dbaebfd95f675440c17c8d0820e6403af9 (diff) |
Fix RegularFileArtifactValue.equals
If two SkyValue objects are equal, then Skyframe caches and returns the old one, instead of the new one. That's a problem for the detection of file changes, which uses the FileContentsProxy, which wasn't part of the equals check before this change.
Progress on #3360.
PiperOrigin-RevId: 183834897
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/FileArtifactValue.java | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileArtifactValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileArtifactValue.java index aaba2245dc..4c9a273139 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/FileArtifactValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileArtifactValue.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.MoreObjects; import com.google.common.base.Preconditions; +import com.google.common.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; @@ -28,6 +29,7 @@ import com.google.devtools.build.lib.vfs.Symlinks; import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; import java.util.Arrays; +import java.util.Objects; import javax.annotation.Nullable; /** @@ -204,7 +206,28 @@ public abstract class FileArtifactValue implements SkyValue, Metadata { @Override public String toString() { - return MoreObjects.toStringHelper(this).add("digest", digest).add("size", size).toString(); + return MoreObjects.toStringHelper(this) + .add("digest", BaseEncoding.base16().lowerCase().encode(digest)) + .add("size", size) + .add("proxy", proxy).toString(); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (!(o instanceof RegularFileArtifactValue)) { + return false; + } + RegularFileArtifactValue r = (RegularFileArtifactValue) o; + return Arrays.equals(digest, r.digest) && Objects.equals(proxy, r.proxy) && size == r.size; + } + + @Override + public int hashCode() { + return (proxy != null ? 127 * proxy.hashCode() : 0) + + 37 * Long.hashCode(getSize()) + Arrays.hashCode(getDigest()); } } |