Make the number of threads that are used in the FilesystemValueChecker configurable.
RELNOTES: None
PiperOrigin-RevId: 305244825
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java
index 4c7384e..0305a71 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequestOptions.java
@@ -463,6 +463,27 @@
+ "line. It is an error to specify a file here as well as command-line patterns.")
public String targetPatternFile;
+ /** Converter for filesystem value checker threads. */
+ public static class ThreadConverter extends ResourceConverter {
+ public ThreadConverter() {
+ super(
+ /* autoSupplier= */ () ->
+ (int) Math.ceil(LocalHostCapacity.getLocalHostCapacity().getCpuUsage()),
+ /* minValue= */ 1,
+ /* maxValue= */ Integer.MAX_VALUE);
+ }
+ }
+
+ @Option(
+ name = "experimental_fsvc_threads",
+ defaultValue = "200",
+ converter = ThreadConverter.class,
+ documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
+ metadataTags = OptionMetadataTag.EXPERIMENTAL,
+ effectTags = {OptionEffectTag.EXECUTION},
+ help = "The number of threads that are used by the FileSystemValueChecker.")
+ public int fsvcThreads;
+
/**
* Converter for jobs: Takes keyword ({@value #FLAG_SYNTAX}). Values must be between 1 and
* MAX_JOBS.
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
index e34eef5..7df88ce 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
@@ -115,8 +115,12 @@
TopLevelArtifactContext topLevelArtifactContext,
boolean trustRemoteArtifacts)
throws BuildFailedException, AbruptExitException, TestExecException, InterruptedException {
+ BuildRequestOptions buildRequestOptions = options.getOptions(BuildRequestOptions.class);
+ // TODO(bazel-team): Should use --experimental_fsvc_threads instead of the hardcoded constant
+ // but plumbing the flag through is hard.
+ int fsvcThreads = buildRequestOptions == null ? 200 : buildRequestOptions.fsvcThreads;
skyframeExecutor.detectModifiedOutputFiles(
- modifiedOutputFiles, lastExecutionTimeRange, trustRemoteArtifacts);
+ modifiedOutputFiles, lastExecutionTimeRange, trustRemoteArtifacts, fsvcThreads);
try (SilentCloseable c = Profiler.instance().profile("configureActionExecutor")) {
skyframeExecutor.configureActionExecutor(fileCache, actionInputPrefetcher);
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
index 7eb39de..9ddce19 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FilesystemValueChecker.java
@@ -76,22 +76,24 @@
*/
public class FilesystemValueChecker {
- private static final int DIRTINESS_CHECK_THREADS = 200;
private static final Logger logger = Logger.getLogger(FilesystemValueChecker.class.getName());
private static final Predicate<SkyKey> ACTION_FILTER =
SkyFunctionName.functionIs(SkyFunctions.ACTION_EXECUTION);
@Nullable private final TimestampGranularityMonitor tsgm;
- @Nullable
- private final Range<Long> lastExecutionTimeRange;
+ @Nullable private final Range<Long> lastExecutionTimeRange;
private AtomicInteger modifiedOutputFilesCounter = new AtomicInteger(0);
private AtomicInteger modifiedOutputFilesIntraBuildCounter = new AtomicInteger(0);
+ private final int numThreads;
public FilesystemValueChecker(
- @Nullable TimestampGranularityMonitor tsgm, @Nullable Range<Long> lastExecutionTimeRange) {
+ @Nullable TimestampGranularityMonitor tsgm,
+ @Nullable Range<Long> lastExecutionTimeRange,
+ int numThreads) {
this.tsgm = tsgm;
this.lastExecutionTimeRange = lastExecutionTimeRange;
+ this.numThreads = numThreads;
}
/**
* Returns a {@link Differencer.DiffWithDelta} containing keys from the give map that are dirty
@@ -516,7 +518,7 @@
throws InterruptedException {
ExecutorService executor =
Executors.newFixedThreadPool(
- DIRTINESS_CHECK_THREADS,
+ numThreads,
new ThreadFactoryBuilder().setNameFormat("FileSystem Value Invalidator %d").build());
ThrowableRecordingRunnableWrapper wrapper =
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 32f0363..ac86a9c 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
@@ -36,6 +36,7 @@
import com.google.devtools.build.lib.analysis.WorkspaceStatusAction.Factory;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
+import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
import com.google.devtools.build.lib.cmdline.LabelConstants;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.concurrent.Uninterruptibles;
@@ -345,14 +346,19 @@
modifiedFilesByPathEntry.put(pathEntry, modifiedFileSet);
}
}
+ BuildRequestOptions buildRequestOptions = options.getOptions(BuildRequestOptions.class);
+ // TODO(bazel-team): Should use --experimental_fsvc_threads instead of the hardcoded constant
+ // but plumbing the flag through is hard.
+ int fsvcThreads = buildRequestOptions == null ? 200 : buildRequestOptions.fsvcThreads;
handleDiffsWithCompleteDiffInformation(
- tsgm, modifiedFilesByPathEntry, managedDirectoriesChanged);
+ tsgm, modifiedFilesByPathEntry, managedDirectoriesChanged, fsvcThreads);
handleDiffsWithMissingDiffInformation(
eventHandler,
tsgm,
pathEntriesWithoutDiffInformation,
checkOutputFiles,
- managedDirectoriesChanged);
+ managedDirectoriesChanged,
+ fsvcThreads);
handleClientEnvironmentChanges();
}
@@ -416,7 +422,8 @@
private void handleDiffsWithCompleteDiffInformation(
TimestampGranularityMonitor tsgm,
Map<Root, ProcessableModifiedFileSet> modifiedFilesByPathEntry,
- boolean managedDirectoriesChanged)
+ boolean managedDirectoriesChanged,
+ int fsvcThreads)
throws InterruptedException {
for (Root pathEntry : ImmutableSet.copyOf(modifiedFilesByPathEntry.keySet())) {
DiffAwarenessManager.ProcessableModifiedFileSet processableModifiedFileSet =
@@ -425,7 +432,7 @@
Preconditions.checkState(!modifiedFileSet.treatEverythingAsModified(), pathEntry);
handleChangedFiles(
ImmutableList.of(pathEntry),
- getDiff(tsgm, modifiedFileSet.modifiedSourceFiles(), pathEntry),
+ getDiff(tsgm, modifiedFileSet.modifiedSourceFiles(), pathEntry, fsvcThreads),
/*numSourceFilesCheckedIfDiffWasMissing=*/ 0,
managedDirectoriesChanged);
processableModifiedFileSet.markProcessed();
@@ -441,7 +448,8 @@
TimestampGranularityMonitor tsgm,
Set<Pair<Root, ProcessableModifiedFileSet>> pathEntriesWithoutDiffInformation,
boolean checkOutputFiles,
- boolean managedDirectoriesChanged)
+ boolean managedDirectoriesChanged,
+ int fsvcThreads)
throws InterruptedException {
ExternalFilesKnowledge externalFilesKnowledge =
externalFilesHelper.getExternalFilesKnowledge();
@@ -465,7 +473,8 @@
.build();
getDriver().evaluate(ImmutableList.of(), evaluationContext);
- FilesystemValueChecker fsvc = new FilesystemValueChecker(tsgm, null);
+ FilesystemValueChecker fsvc =
+ new FilesystemValueChecker(tsgm, /* lastExecutionTimeRange= */ null, fsvcThreads);
// We need to manually check for changes to known files. This entails finding all dirty file
// system values under package roots for which we don't have diff information. If at least
// one path entry doesn't have diff information, then we're going to have to iterate over
@@ -674,10 +683,10 @@
Differencer.Diff diff;
if (modifiedFileSet.treatEverythingAsModified()) {
diff =
- new FilesystemValueChecker(tsgm, null)
+ new FilesystemValueChecker(tsgm, /* lastExecutionTimeRange= */ null, /* numThreads= */ 20)
.getDirtyKeys(memoizingEvaluator.getValues(), new BasicFilesystemDirtinessChecker());
} else {
- diff = getDiff(tsgm, modifiedFileSet.modifiedSourceFiles(), pathEntry);
+ diff = getDiff(tsgm, modifiedFileSet.modifiedSourceFiles(), pathEntry, /* fsvcThreads= */ 20);
}
syscalls.set(getPerBuildSyscallCache(/*concurrencyLevel=*/ 42));
recordingDiffer.invalidate(diff.changedKeysWithoutNewValues());
@@ -696,11 +705,13 @@
public void detectModifiedOutputFiles(
ModifiedFileSet modifiedOutputFiles,
@Nullable Range<Long> lastExecutionTimeRange,
- boolean trustRemoteArtifacts)
+ boolean trustRemoteArtifacts,
+ int fsvcThreads)
throws InterruptedException {
long startTime = System.nanoTime();
FilesystemValueChecker fsvc =
- new FilesystemValueChecker(Preconditions.checkNotNull(tsgm.get()), lastExecutionTimeRange);
+ new FilesystemValueChecker(
+ Preconditions.checkNotNull(tsgm.get()), lastExecutionTimeRange, fsvcThreads);
BatchStat batchStatter = outputService == null ? null : outputService.getBatchStatter();
recordingDiffer.invalidate(
fsvc.getDirtyActionValues(
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 0c42c22..50ea0d1 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
@@ -1258,7 +1258,8 @@
protected Differencer.Diff getDiff(
TimestampGranularityMonitor tsgm,
Collection<PathFragment> modifiedSourceFiles,
- final Root pathEntry)
+ final Root pathEntry,
+ int fsvcThreads)
throws InterruptedException {
if (modifiedSourceFiles.isEmpty()) {
return new ImmutableDiff(ImmutableList.<SkyKey>of(), ImmutableMap.<SkyKey, SkyValue>of());
@@ -1280,7 +1281,8 @@
logger.info(
"About to recompute filesystem nodes corresponding to files that are known to have "
+ "changed");
- FilesystemValueChecker fsvc = new FilesystemValueChecker(tsgm, null);
+ FilesystemValueChecker fsvc =
+ new FilesystemValueChecker(tsgm, /* lastExecutionTimeRange= */ null, fsvcThreads);
Map<SkyKey, SkyValue> valuesMap = memoizingEvaluator.getValues();
Differencer.DiffWithDelta diff =
fsvc.getNewAndOldValues(valuesMap, dirtyFileStateSkyKeys, new FileDirtinessChecker());
@@ -2807,7 +2809,8 @@
public abstract void detectModifiedOutputFiles(
ModifiedFileSet modifiedOutputFiles,
@Nullable Range<Long> lastExecutionTimeRange,
- boolean trustRemoteArtifacts)
+ boolean trustRemoteArtifacts,
+ int fsvcThreads)
throws AbruptExitException, InterruptedException;
/**
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 12da7a1..d94cd94 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -115,6 +115,8 @@
private MockFileSystem fs;
private Path pkgRoot;
+ private static final int FSVC_THREADS_FOR_TEST = 20;
+
@Before
public final void setUp() throws Exception {
ImmutableMap.Builder<SkyFunctionName, SkyFunction> skyFunctions = ImmutableMap.builder();
@@ -180,13 +182,17 @@
@Test
public void testEmpty() throws Exception {
- FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
+ FilesystemValueChecker checker =
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST);
assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
}
@Test
public void testSimple() throws Exception {
- FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
+ FilesystemValueChecker checker =
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST);
Path path = fs.getPath("/foo");
FileSystemUtils.createEmptyFile(path);
@@ -222,7 +228,9 @@
*/
@Test
public void testDirtySymlink() throws Exception {
- FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
+ FilesystemValueChecker checker =
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST);
Path path = fs.getPath("/foo");
FileSystemUtils.writeContentAsLatin1(path, "foo contents");
@@ -285,7 +293,9 @@
@Test
public void testExplicitFiles() throws Exception {
- FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
+ FilesystemValueChecker checker =
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST);
Path path1 = fs.getPath("/foo1");
Path path2 = fs.getPath("/foo2");
@@ -340,7 +350,9 @@
assertThat(result.hasError()).isTrue();
fs.readlinkThrowsIoException = false;
- FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
+ FilesystemValueChecker checker =
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST);
Diff diff = getDirtyFilesystemKeys(evaluator, checker);
assertThat(diff.changedKeysWithoutNewValues()).isEmpty();
assertThat(diff.changedKeysWithNewValues()).isEmpty();
@@ -360,7 +372,9 @@
driver.evaluate(ImmutableList.of(fileKey1), EVALUATION_OPTIONS);
assertThat(result.hasError()).isTrue();
- FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
+ FilesystemValueChecker checker =
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST);
Diff diff = getDirtyFilesystemKeys(evaluator, checker);
assertThat(diff.changedKeysWithoutNewValues()).isEmpty();
assertThat(diff.changedKeysWithNewValues()).isEmpty();
@@ -428,7 +442,8 @@
ImmutableSet.of(out2)))));
assertThat(driver.evaluate(ImmutableList.<SkyKey>of(), evaluationContext).hasError()).isFalse();
assertThat(
- new FilesystemValueChecker(tsgm, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -443,7 +458,8 @@
Artifact file, SkyKey actionKey, BatchStat batchStatter, TimestampGranularityMonitor tsgm)
throws InterruptedException {
assertThat(
- new FilesystemValueChecker(tsgm, null)
+ new FilesystemValueChecker(
+ tsgm, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -451,7 +467,8 @@
/* trustRemoteArtifacts= */ false))
.containsExactly(actionKey);
assertThat(
- new FilesystemValueChecker(tsgm, null)
+ new FilesystemValueChecker(
+ tsgm, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -459,7 +476,8 @@
/* trustRemoteArtifacts= */ false))
.containsExactly(actionKey);
assertThat(
- new FilesystemValueChecker(tsgm, null)
+ new FilesystemValueChecker(
+ tsgm, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -469,7 +487,8 @@
/* trustRemoteArtifacts= */ false))
.isEmpty();
assertThat(
- new FilesystemValueChecker(tsgm, null)
+ new FilesystemValueChecker(
+ tsgm, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -540,7 +559,8 @@
.build();
assertThat(driver.evaluate(ImmutableList.<SkyKey>of(), evaluationContext).hasError()).isFalse();
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -551,7 +571,8 @@
// Touching the TreeArtifact directory should have no effect
FileSystemUtils.touchFile(out1.getPath());
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -561,7 +582,8 @@
// Neither should touching a subdirectory.
FileSystemUtils.touchFile(out2.getPath().getChild("subdir"));
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -574,7 +596,8 @@
// Removing a directory (even if empty) should have an effect
outEmpty.getPath().delete();
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -586,7 +609,8 @@
FileSystemUtils.createDirectoryAndParents(dummyEmptyDir);
FileSystemUtils.ensureSymbolicLink(outEmpty.getPath(), dummyEmptyDir);
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -605,7 +629,8 @@
// so it's just a sanity check.
FileSystemUtils.writeContentAsLatin1(file11.getPath(), "goodbye");
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -626,7 +651,8 @@
file21.getPath().delete();
// now, let's test our changes are actually visible
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -634,7 +660,8 @@
/* trustRemoteArtifacts= */ false))
.containsExactly(actionKey1, actionKey2, actionKeyEmpty);
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -648,7 +675,8 @@
// We also check that if the modified file set does not contain our modified files on disk,
// we are not going to check and return them.
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -659,7 +687,8 @@
/* trustRemoteArtifacts= */ false))
.containsExactly(actionKey2, actionKeyEmpty);
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -672,7 +701,8 @@
// Check modifying the last (lexicographically) tree artifact.
last.getPath().delete();
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -685,7 +715,8 @@
.containsExactly(actionKey1, actionKey2, actionKeyLast);
// Check ModifiedFileSet without the last (lexicographically) tree artifact.
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -701,7 +732,8 @@
// We add a test for NOTHING_MODIFIED, because FileSystemValueChecker doesn't
// pay attention to file sets for TreeArtifact directory listings.
assertThat(
- new FilesystemValueChecker(null, null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
batchStatter,
@@ -968,7 +1000,8 @@
driver.evaluate(ImmutableList.of(actionKey1, actionKey2), evaluationContext).hasError())
.isFalse();
assertThat(
- new FilesystemValueChecker(/* tsgm= */ null, /* lastExecutionTimeRange= */ null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
/* batchStatter= */ null,
@@ -980,7 +1013,8 @@
// action's SkyKey.
FileSystemUtils.writeContentAsLatin1(out1.getPath(), "new-foo-content");
assertThat(
- new FilesystemValueChecker(/* tsgm= */ null, /* lastExecutionTimeRange= */ null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
/* batchStatter= */ null,
@@ -1024,7 +1058,8 @@
assertThat(driver.evaluate(ImmutableList.of(actionKey), evaluationContext).hasError())
.isFalse();
assertThat(
- new FilesystemValueChecker(/* tsgm= */ null, /* lastExecutionTimeRange= */ null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
/* batchStatter= */ null,
@@ -1037,7 +1072,8 @@
ActionsTestUtil.createTreeFileArtifactWithNoGeneratingAction(treeArtifact, "foo");
FileSystemUtils.writeContentAsLatin1(fooArtifact.getPath(), "new-foo-content");
assertThat(
- new FilesystemValueChecker(/* tsgm= */ null, /* lastExecutionTimeRange= */ null)
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST)
.getDirtyActionValues(
evaluator.getValues(),
/* batchStatter= */ null,
@@ -1053,7 +1089,9 @@
FileValue.key(
RootedPath.toRootedPath(Root.fromPath(pkgRoot), PathFragment.create("foo"))));
driver.evaluate(values, EVALUATION_OPTIONS);
- FilesystemValueChecker checker = new FilesystemValueChecker(null, null);
+ FilesystemValueChecker checker =
+ new FilesystemValueChecker(
+ /* tsgm= */ null, /* lastExecutionTimeRange= */ null, FSVC_THREADS_FOR_TEST);
assertEmptyDiff(getDirtyFilesystemKeys(evaluator, checker));
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
index a4453c4..4ed7512 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SequencedSkyframeExecutorTest.java
@@ -450,7 +450,10 @@
private Collection<SkyKey> dirtyValues() throws InterruptedException {
Diff diff =
- new FilesystemValueChecker(new TimestampGranularityMonitor(BlazeClock.instance()), null)
+ new FilesystemValueChecker(
+ new TimestampGranularityMonitor(BlazeClock.instance()),
+ /* lastExecutionTimeRange= */ null,
+ /* numThreads= */ 20)
.getDirtyKeys(
skyframeExecutor.getEvaluatorForTesting().getValues(),
new BasicFilesystemDirtinessChecker());
diff --git a/src/test/shell/integration/execution_phase_tests.sh b/src/test/shell/integration/execution_phase_tests.sh
index f787067..78dcbb6 100755
--- a/src/test/shell/integration/execution_phase_tests.sh
+++ b/src/test/shell/integration/execution_phase_tests.sh
@@ -374,6 +374,7 @@
# part of the build, so this flag, which we should test here, isn't
# available: --experimental_include_scanning_parallelism="${threads}"
bazel build --nobuild \
+ --experimental_fsvc_threads="${threads}" \
--experimental_sandbox_async_tree_delete_idle_threads="${threads}" \
--jobs="${threads}" \
--legacy_globbing_threads="${threads}" \