aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2018-01-30 08:19:47 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-01-30 08:21:32 -0800
commit9e344ec089f3f46ac6d4cdf2638b671242f87631 (patch)
tree45ffcba907b449cb495568e40e29f523268302b1 /src/main/java/com
parent74e268dbaebfd95f675440c17c8d0820e6403af9 (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.java25
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());
}
}