aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
diff options
context:
space:
mode:
authorGravatar felly <felly@google.com>2017-04-14 20:09:49 +0200
committerGravatar Klaus Aehlig <aehlig@google.com>2017-04-18 11:27:18 +0200
commit8fd7f754771a3793d1089e3845320342cf6d61bb (patch)
tree171688a66675022343480d9a8b7f0750350d5c11 /src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
parenta45939bba2e85eb5f5941033e37dc2d6f8e87489 (diff)
Migrate UnixGlob to Path#statIfFound() instead of #statNullable(). The latter swallows all filesystem failures, and does not disambiguate missing files from filesystem problems.
The syscall cache now tracks IOExceptions if they are present, just as it does with readdir(). RELNOTES: None PiperOrigin-RevId: 153185433
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java b/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
index 646d6093dd..d9eb4506a6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java
@@ -30,13 +30,14 @@ import java.util.Collection;
*/
public class PerBuildSyscallCache implements UnixGlob.FilesystemCalls {
- private final LoadingCache<Pair<Path, Symlinks>, FileStatus> statCache;
+ private final LoadingCache<Pair<Path, Symlinks>, Pair<FileStatus, IOException>> statCache;
private final LoadingCache<Pair<Path, Symlinks>, Pair<Collection<Dirent>, IOException>>
readdirCache;
private static final FileStatus NO_STATUS = new FakeFileStatus();
- private PerBuildSyscallCache(LoadingCache<Pair<Path, Symlinks>, FileStatus> statCache,
+ private PerBuildSyscallCache(
+ LoadingCache<Pair<Path, Symlinks>, Pair<FileStatus, IOException>> statCache,
LoadingCache<Pair<Path, Symlinks>, Pair<Collection<Dirent>, IOException>> readdirCache) {
this.statCache = statCache;
this.readdirCache = readdirCache;
@@ -104,9 +105,12 @@ public class PerBuildSyscallCache implements UnixGlob.FilesystemCalls {
}
@Override
- public FileStatus statNullable(Path path, Symlinks symlinks) {
- FileStatus status = statCache.getUnchecked(Pair.of(path, symlinks));
- return (status == NO_STATUS) ? null : status;
+ public FileStatus statIfFound(Path path, Symlinks symlinks) throws IOException {
+ Pair<FileStatus, IOException> status = statCache.getUnchecked(Pair.of(path, symlinks));
+ if (status.getFirst() != null) {
+ return (status.getFirst() == NO_STATUS) ? null : status.getFirst();
+ }
+ throw status.getSecond();
}
public void clear() {
@@ -162,12 +166,16 @@ public class PerBuildSyscallCache implements UnixGlob.FilesystemCalls {
* Input: (path, following_symlinks)
* Output: FileStatus
*/
- private static CacheLoader<Pair<Path, Symlinks>, FileStatus> newStatLoader() {
- return new CacheLoader<Pair<Path, Symlinks>, FileStatus>() {
+ private static CacheLoader<Pair<Path, Symlinks>, Pair<FileStatus, IOException>> newStatLoader() {
+ return new CacheLoader<Pair<Path, Symlinks>, Pair<FileStatus, IOException>>() {
@Override
- public FileStatus load(Pair<Path, Symlinks> p) {
- FileStatus f = p.first.statNullable(p.second);
- return (f == null) ? NO_STATUS : f;
+ public Pair<FileStatus, IOException> load(Pair<Path, Symlinks> p) {
+ try {
+ FileStatus f = p.first.statIfFound(p.second);
+ return Pair.of((f == null) ? NO_STATUS : f, null);
+ } catch (IOException e) {
+ return Pair.of(null, e);
+ }
}
};
}