aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar Michajlo Matijkiw <michajlo@google.com>2016-01-19 21:17:45 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2016-01-20 11:35:41 +0000
commit528957e26a957da7abcb8a3b3bcfe7e7f6428687 (patch)
tree5a5bcc75d2428151a203783678fbb1b2172c6295 /src/main/java/com/google/devtools
parent085c1a1d95dd80f26f4a46c3d4d486427bb24d83 (diff)
Support unreadable files
-- MOS_MIGRATED_REVID=112507181
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java19
2 files changed, 23 insertions, 5 deletions
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 8e897fb078..ae5231a95e 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
@@ -106,7 +106,7 @@ class ArtifactFunction implements SkyFunction {
return null;
}
if (!fileValue.exists()) {
- if (allowedMissingInputs.apply(((RootedPath) fileSkyKey.argument()).getRelativePath())) {
+ if (isAllowedMissingInput(fileSkyKey)) {
return FileArtifactValue.MISSING_FILE_MARKER;
} else {
return missingInputFile(artifact, mandatory, null, env.getListener());
@@ -115,10 +115,17 @@ class ArtifactFunction implements SkyFunction {
try {
return FileArtifactValue.create(artifact, fileValue);
} catch (IOException e) {
+ if (isAllowedMissingInput(fileSkyKey)) {
+ return FileArtifactValue.MISSING_FILE_MARKER;
+ }
throw makeMissingInputFileExn(artifact, mandatory, e, env.getListener());
}
}
+ private boolean isAllowedMissingInput(SkyKey fileSkyKey) {
+ return allowedMissingInputs.apply(((RootedPath) fileSkyKey.argument()).getRelativePath());
+ }
+
private static ArtifactValue missingInputFile(Artifact artifact, boolean mandatory,
Exception failure, EventHandler reporter) throws MissingInputFileException {
if (!mandatory) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java
index 80b43a7486..459d1caa48 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java
@@ -164,11 +164,9 @@ public abstract class FileStateValue implements SkyValue {
@Nullable TimestampGranularityMonitor tsgm)
throws InconsistentFilesystemException {
Preconditions.checkState(stat.isFile(), path);
+
try {
- byte[] digest = stat.getDigest();
- if (digest == null) {
- digest = path.getFastDigest();
- }
+ byte[] digest = tryGetDigest(path, stat);
if (digest == null) {
long mtime = stat.getLastModifiedTime();
// Note that TimestampGranularityMonitor#notifyDependenceOnFileTime is a thread-safe
@@ -193,6 +191,19 @@ public abstract class FileStateValue implements SkyValue {
}
}
+ @Nullable
+ private static byte[] tryGetDigest(Path path, FileStatusWithDigest stat) throws IOException {
+ try {
+ byte[] digest = stat.getDigest();
+ return digest != null ? digest : path.getFastDigest();
+ } catch (IOException ioe) {
+ if (!path.isReadable()) {
+ return null;
+ }
+ throw ioe;
+ }
+ }
+
@Override
public Type getType() {
return Type.REGULAR_FILE;