From 528957e26a957da7abcb8a3b3bcfe7e7f6428687 Mon Sep 17 00:00:00 2001 From: Michajlo Matijkiw Date: Tue, 19 Jan 2016 21:17:45 +0000 Subject: Support unreadable files -- MOS_MIGRATED_REVID=112507181 --- .../devtools/build/lib/skyframe/ArtifactFunction.java | 9 ++++++++- .../devtools/build/lib/skyframe/FileStateValue.java | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) (limited to 'src/main/java/com/google/devtools') 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; -- cgit v1.2.3