aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar Janak Ramakrishnan <janakr@google.com>2016-11-11 18:48:23 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2016-11-14 14:54:47 +0000
commit11a842bce58668fcfb30e4f117df1de55adb2c74 (patch)
tree109eaa4a946a2696a9106f213f5b4451caa04083 /src/main/java/com/google
parent0a05086f17c72a3614747b1897e95234bcb07260 (diff)
Cache PerBuildSyscallCache if concurrency level is unchanged.
-- MOS_MIGRATED_REVID=138893829
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PerBuildSyscallCache.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutor.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java21
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);