diff options
author | 2016-11-11 18:48:23 +0000 | |
---|---|---|
committer | 2016-11-14 14:54:47 +0000 | |
commit | 11a842bce58668fcfb30e4f117df1de55adb2c74 (patch) | |
tree | 109eaa4a946a2696a9106f213f5b4451caa04083 /src/main/java/com/google/devtools/build/lib/skyframe | |
parent | 0a05086f17c72a3614747b1897e95234bcb07260 (diff) |
Cache PerBuildSyscallCache if concurrency level is unchanged.
--
MOS_MIGRATED_REVID=138893829
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
3 files changed, 26 insertions, 3 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 ebb0618ae9..646d6093dd 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 @@ -22,7 +22,6 @@ import com.google.devtools.build.lib.vfs.FileStatus; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.Symlinks; import com.google.devtools.build.lib.vfs.UnixGlob; - import java.io.IOException; import java.util.Collection; @@ -110,6 +109,11 @@ public class PerBuildSyscallCache implements UnixGlob.FilesystemCalls { return (status == NO_STATUS) ? null : status; } + public void clear() { + statCache.invalidateAll(); + readdirCache.invalidateAll(); + } + // This is used because the cache implementations don't allow null. private static final class FakeFileStatus implements FileStatus { @Override diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java index 40e8a5d14f..f64ed90fae 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java @@ -543,7 +543,7 @@ public final class SequencedSkyframeExecutor extends SkyframeExecutor { } else { diff = getDiff(tsgm, modifiedFileSet.modifiedSourceFiles(), pathEntry); } - syscalls.set(newPerBuildSyscallCache(/*concurrencyLevel=*/42)); + syscalls.set(getPerBuildSyscallCache(/*concurrencyLevel=*/ 42)); recordingDiffer.invalidate(diff.changedKeysWithoutNewValues()); recordingDiffer.inject(diff.changedKeysWithNewValues()); // Blaze invalidates transient errors on every build. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 6e7d591afd..825fc78a60 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -279,6 +279,9 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { private final List<BuildFileName> buildFilesByPriority; + private PerBuildSyscallCache perBuildSyscallCache; + private int lastConcurrencyLevel = -1; + private static final Logger LOG = Logger.getLogger(SkyframeExecutor.class.getName()); protected SkyframeExecutor( @@ -462,6 +465,22 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { return PerBuildSyscallCache.newBuilder().setConcurrencyLevel(concurrencyLevel).build(); } + /** + * Gets a (possibly cached) syscalls cache, re-initialized each build. + * + * <p>We cache the syscalls cache if possible because construction of the cache is surprisingly + * expensive, and is on the critical path of null builds. + */ + protected final PerBuildSyscallCache getPerBuildSyscallCache(int concurrencyLevel) { + if (lastConcurrencyLevel == concurrencyLevel) { + perBuildSyscallCache.clear(); + return perBuildSyscallCache; + } + lastConcurrencyLevel = concurrencyLevel; + perBuildSyscallCache = newPerBuildSyscallCache(concurrencyLevel); + return perBuildSyscallCache; + } + @ThreadCompatible public void setActive(boolean active) { this.active = active; @@ -934,7 +953,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { setupDefaultPackage(defaultsPackageContents); setPackageLocator(pkgLocator); - syscalls.set(newPerBuildSyscallCache(packageCacheOptions.globbingThreads)); + syscalls.set(getPerBuildSyscallCache(packageCacheOptions.globbingThreads)); this.pkgFactory.setGlobbingThreads(packageCacheOptions.globbingThreads); this.pkgFactory.setMaxDirectoriesToEagerlyVisitInGlobbing( packageCacheOptions.maxDirectoriesToEagerlyVisitInGlobbing); |