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);