Automated rollback of commit f2bee5658d2991ccd1674f2c8bec303db30f3371.

*** Reason for rollback ***

fix GlobFunction and add regression test.

PiperOrigin-RevId: 438676535
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
index 2885689..752036e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
@@ -35,7 +35,9 @@
 import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
 import com.google.devtools.build.skyframe.SkyKey;
 import com.google.devtools.build.skyframe.SkyValue;
+import com.google.devtools.build.skyframe.SkyframeIterableResult;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
@@ -168,17 +170,15 @@
                   globSubdir,
                   patternTail,
                   globberOperation);
-          Map<SkyKey, SkyValue> listingAndRecursiveGlobMap =
-              env.getValues(
+          SkyframeIterableResult listingAndRecursiveGlobResult =
+              env.getOrderedValuesAndExceptions(
                   ImmutableList.of(keyForRecursiveGlobInCurrentDirectory, directoryListingKey));
           if (env.valuesMissing()) {
             return null;
           }
-          GlobValue globValue =
-              (GlobValue) listingAndRecursiveGlobMap.get(keyForRecursiveGlobInCurrentDirectory);
+          GlobValue globValue = (GlobValue) listingAndRecursiveGlobResult.next();
           matches.addTransitive(globValue.getMatches());
-          listingValue =
-              (DirectoryListingValue) listingAndRecursiveGlobMap.get(directoryListingKey);
+          listingValue = (DirectoryListingValue) listingAndRecursiveGlobResult.next();
         }
       }
 
@@ -233,8 +233,9 @@
         }
       }
 
-      Map<SkyKey, SkyValue> subdirAndSymlinksResult =
-          env.getValues(Sets.union(subdirMap.keySet(), symlinkFileMap.keySet()));
+      Set<SkyKey> subdirAndSymlinksKeys = Sets.union(subdirMap.keySet(), symlinkFileMap.keySet());
+      SkyframeIterableResult subdirAndSymlinksResult =
+          env.getOrderedValuesAndExceptions(subdirAndSymlinksKeys);
       if (env.valuesMissing()) {
         return null;
       }
@@ -242,14 +243,17 @@
       // Second pass: process the symlinks and subdirectories from the first pass, and maybe
       // collect further SkyKeys if fully resolved symlink targets are themselves directories.
       // Also process any known directories.
-      for (Map.Entry<SkyKey, SkyValue> lookedUpKeyAndValue : subdirAndSymlinksResult.entrySet()) {
-        if (symlinkFileMap.containsKey(lookedUpKeyAndValue.getKey())) {
-          FileValue symlinkFileValue = (FileValue) lookedUpKeyAndValue.getValue();
+      for (SkyKey subdirAndSymlinksKey : subdirAndSymlinksKeys) {
+        if (symlinkFileMap.containsKey(subdirAndSymlinksKey)) {
+          FileValue symlinkFileValue = (FileValue) subdirAndSymlinksResult.next();
+          if (symlinkFileValue == null) {
+            return null;
+          }
           if (!symlinkFileValue.isSymlink()) {
             throw new GlobFunctionException(
                 new InconsistentFilesystemException(
                     "readdir and stat disagree about whether "
-                        + ((RootedPath) lookedUpKeyAndValue.getKey().argument()).asPath()
+                        + ((RootedPath) subdirAndSymlinksKey.argument()).asPath()
                         + " is a symlink."),
                 Transience.TRANSIENT);
           }
@@ -278,7 +282,7 @@
             throw new GlobFunctionException(symlinkException, Transience.PERSISTENT);
           }
 
-          Dirent dirent = symlinkFileMap.get(lookedUpKeyAndValue.getKey());
+          Dirent dirent = symlinkFileMap.get(subdirAndSymlinksKey);
           String fileName = dirent.getName();
           if (symlinkFileValue.isDirectory()) {
             SkyKey keyToRequest = getSkyKeyForSubdir(fileName, glob, subdirPattern);
@@ -289,18 +293,32 @@
             sortedResultMap.put(dirent, glob.getSubdir().getRelative(fileName));
           }
         } else {
-          processSubdir(lookedUpKeyAndValue, subdirMap, glob, sortedResultMap);
+          SkyValue value = subdirAndSymlinksResult.next();
+          if (value == null) {
+            return null;
+          }
+          processSubdir(Map.entry(subdirAndSymlinksKey, value), subdirMap, glob, sortedResultMap);
         }
       }
 
-      Map<SkyKey, SkyValue> symlinkSubdirResult = env.getValues(symlinkSubdirMap.keySet());
+      Set<SkyKey> symlinkSubdirKeys = symlinkSubdirMap.keySet();
+      SkyframeIterableResult symlinkSubdirResult =
+          env.getOrderedValuesAndExceptions(symlinkSubdirKeys);
       if (env.valuesMissing()) {
         return null;
       }
       // Third pass: do needed subdirectories of symlinked directories discovered during the second
       // pass.
-      for (Map.Entry<SkyKey, SkyValue> lookedUpKeyAndValue : symlinkSubdirResult.entrySet()) {
-        processSubdir(lookedUpKeyAndValue, symlinkSubdirMap, glob, sortedResultMap);
+      for (SkyKey symlinkSubdirKey : symlinkSubdirKeys) {
+        SkyValue symlinkSubdirValue = symlinkSubdirResult.next();
+        if (symlinkSubdirValue == null) {
+          return null;
+        }
+        processSubdir(
+            Map.entry(symlinkSubdirKey, symlinkSubdirValue),
+            symlinkSubdirMap,
+            glob,
+            sortedResultMap);
       }
       for (Map.Entry<Dirent, Object> fileMatches : sortedResultMap.entrySet()) {
         addToMatches(fileMatches.getValue(), matches);