aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools
diff options
context:
space:
mode:
authorGravatar olaola <olaola@google.com>2018-03-08 09:56:12 -0800
committerGravatar Copybara-Service <copybara-piper@google.com>2018-03-08 09:58:08 -0800
commit2838dd9f7f8556247f480b1e2ce0ced0e349e474 (patch)
treeca14ea665b1ccd49136dfd3076baf8d53f662899 /src/main/java/com/google/devtools
parentd72e9e8e464864b2edf43ee77303ef29c301dacc (diff)
Remove unnecessary I/O operations from handling remotely executed actions (fixes performance regression #4749). Also adding Skylark tests for input/output directories.
TESTED=locally RELNOTES: Fix performance regression PiperOrigin-RevId: 188346410
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java14
3 files changed, 14 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java b/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java
index d0a05fa473..2828424d83 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/AbstractRemoteActionCache.java
@@ -132,13 +132,7 @@ public abstract class AbstractRemoteActionCache implements AutoCloseable {
downloadFile(path, file.getDigest(), file.getIsExecutable(), file.getContent());
}
for (OutputDirectory dir : result.getOutputDirectoriesList()) {
- Digest treeDigest = dir.getTreeDigest();
- byte[] b = downloadBlob(treeDigest);
- Digest receivedTreeDigest = digestUtil.compute(b);
- if (!receivedTreeDigest.equals(treeDigest)) {
- throw new IOException(
- "Digest does not match " + receivedTreeDigest + " != " + treeDigest);
- }
+ byte[] b = downloadBlob(dir.getTreeDigest());
Tree tree = Tree.parseFrom(b);
Map<Digest, Directory> childrenMap = new HashMap<>();
for (Directory child : tree.getChildrenList()) {
diff --git a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java
index fc27127ec7..1b7a0809d6 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/RemoteSpawnRunner.java
@@ -19,6 +19,7 @@ import com.google.common.base.Throwables;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.ActionInput;
import com.google.devtools.build.lib.actions.ActionInputFileCache;
+import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.EnvironmentalExecException;
import com.google.devtools.build.lib.actions.ExecException;
import com.google.devtools.build.lib.actions.Spawn;
@@ -296,7 +297,7 @@ class RemoteSpawnRunner implements SpawnRunner {
ArrayList<String> outputDirectoryPaths = new ArrayList<>();
for (ActionInput output : outputs) {
String pathString = output.getExecPathString();
- if (execRoot.getRelative(pathString).isDirectory()) {
+ if (output instanceof Artifact && ((Artifact) output).isTreeArtifact()) {
outputDirectoryPaths.add(pathString);
} else {
outputPaths.add(pathString);
diff --git a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
index 2d2de7e92a..5763b25e51 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/TreeNodeRepository.java
@@ -25,6 +25,7 @@ import com.google.common.collect.TreeTraverser;
import com.google.devtools.build.lib.actions.ActionInput;
import com.google.devtools.build.lib.actions.ActionInputFileCache;
import com.google.devtools.build.lib.actions.ActionInputHelper;
+import com.google.devtools.build.lib.actions.DigestOfDirectoryException;
import com.google.devtools.build.lib.actions.cache.Metadata;
import com.google.devtools.build.lib.actions.cache.VirtualActionInput;
import com.google.devtools.build.lib.concurrent.BlazeInterners;
@@ -311,10 +312,17 @@ public final class TreeNodeRepository extends TreeTraverser<TreeNodeRepository.T
// Leaf node reached. Must be unique.
Preconditions.checkArgument(
inputsStart == inputsEnd - 1, "Encountered two inputs with the same path.");
- // TODO: check that the actionInput is a single file!
ActionInput input = inputs.get(inputsStart);
- Path leafPath = execRoot.getRelative(input.getExecPathString());
- if (leafPath.isDirectory()) {
+ try {
+ if (!(input instanceof VirtualActionInput)
+ && Preconditions.checkNotNull(inputFileCache.getMetadata(input))
+ .getType()
+ .isDirectory()) {
+ Path leafPath = execRoot.getRelative(input.getExecPathString());
+ return interner.intern(new TreeNode(buildInputDirectoryEntries(leafPath), input));
+ }
+ } catch (DigestOfDirectoryException e) {
+ Path leafPath = execRoot.getRelative(input.getExecPathString());
return interner.intern(new TreeNode(buildInputDirectoryEntries(leafPath), input));
}
return interner.intern(new TreeNode(input));