Make the number of threads that are used in the FilesystemValueChecker configurable.

RELNOTES: None
PiperOrigin-RevId: 305244825
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));