Propagate IO exceptions encountered while globbing during include scanning, rather than swallowing them: we already handle IO exceptions, and there is no great clamor from users to allow a build to complete even if the filesystem is bad.

PiperOrigin-RevId: 397080099
diff --git a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java
index a8d1dde..0e405b0 100644
--- a/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java
+++ b/src/main/java/com/google/devtools/build/lib/includescanning/IncludeParser.java
@@ -266,7 +266,8 @@
      */
     @Nullable
     ImmutableSet<Artifact> getPathLevelHintedInclusions(
-        ImmutableList<PathFragment> paths, Environment env) throws InterruptedException {
+        ImmutableList<PathFragment> paths, Environment env)
+        throws InterruptedException, IOException {
       ImmutableList<String> pathStrings =
           paths.stream()
               .map(PathFragment::getPathString)
@@ -359,15 +360,9 @@
         return null;
       }
       for (Map.Entry<SkyKey, ValueOrException<IOException>> globEntry : globResults.entrySet()) {
-        GlobValue globValue;
         GlobDescriptor globKey = (GlobDescriptor) globEntry.getKey();
         PathFragment packageFragment = globKey.getPackageId().getPackageFragment();
-        try {
-          globValue = (GlobValue) globEntry.getValue().get();
-        } catch (IOException e) {
-          logger.atWarning().withCause(e).log("Error getting hints for %s", packageFragment);
-          continue;
-        }
+        GlobValue globValue = (GlobValue) globEntry.getValue().get();
         for (PathFragment file : globValue.getMatches().toList()) {
           hints.add(
               artifactFactory.getSourceArtifact(
diff --git a/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java
index 64106a9..c8d6aea 100644
--- a/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/buildtool/CustomRealFilesystemBuildIntegrationTest.java
@@ -47,6 +47,8 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Consumer;
 import java.util.regex.Pattern;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -578,6 +580,7 @@
     private final Map<PathFragment, Integer> badPaths = new HashMap<>();
     private final Map<PathFragment, Integer> statBadPaths = new HashMap<>();
     private final Set<String> createDirectoryErrorNames = new HashSet<>();
+    private Consumer<PathFragment> pathConsumer = null;
 
     private CustomRealFilesystem(DigestHashFunction digestHashFunction) {
       super(digestHashFunction, /*hashAttributeName=*/ "");
@@ -603,6 +606,10 @@
       return badPaths.getOrDefault(path.asFragment(), 0);
     }
 
+    void setConsumer(Consumer<PathFragment> pathConsumer) {
+      this.pathConsumer = pathConsumer;
+    }
+
     private static boolean shouldThrowExn(PathFragment path, Map<PathFragment, Integer> paths) {
       if (paths.containsKey(path)) {
         Integer numCallsRemaining = paths.get(path);
@@ -619,6 +626,9 @@
       if (shouldThrowExn(path, badPaths)) {
         throw new IOException("nope");
       }
+      if (pathConsumer != null) {
+        pathConsumer.accept(path);
+      }
     }
 
     @Override