From 9e344ec089f3f46ac6d4cdf2638b671242f87631 Mon Sep 17 00:00:00 2001 From: ulfjack Date: Tue, 30 Jan 2018 08:19:47 -0800 Subject: 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 --- .../build/lib/skyframe/FileArtifactValue.java | 25 +++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'src/main/java/com') 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()); } } -- cgit v1.2.3