Make tree artifact directory creation ActionFS-aware.
PiperOrigin-RevId: 211471272
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 5b916ff..890a9d4 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -225,7 +225,6 @@
ActionGraph actionGraph = analysisResult.getActionGraph();
-
OutputService outputService = env.getOutputService();
ModifiedFileSet modifiedOutputFiles = ModifiedFileSet.EVERYTHING_MODIFIED;
if (outputService != null) {
@@ -241,8 +240,10 @@
}
}
- // Must be created after the output path is created above.
- createActionLogDirectory();
+ if (outputService == null || !outputService.supportsActionFileSystem()) {
+ // Must be created after the output path is created above.
+ createActionLogDirectory();
+ }
// Create convenience symlinks from the configurations actually used by the requested targets.
// Symlinks will be created if all such configurations would point the symlink to the same path;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
index 484eda7..51ba6f0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ArtifactFunction.java
@@ -16,6 +16,7 @@
import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
+import com.google.common.base.Supplier;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
@@ -51,6 +52,12 @@
/** A builder of values for {@link ArtifactSkyKey} keys. */
class ArtifactFunction implements SkyFunction {
+ private final Supplier<Boolean> usesActionFS;
+
+ public ArtifactFunction(Supplier<Boolean> usesActionFS) {
+ this.usesActionFS = usesActionFS;
+ }
+
@Override
public SkyValue compute(SkyKey skyKey, Environment env)
throws ArtifactFunctionException, InterruptedException {
@@ -87,16 +94,18 @@
// actions, execute those actions in parallel and then aggregate the action execution results.
if (artifact.isTreeArtifact() && actionLookupValue.isActionTemplate(actionIndex)) {
// Create the directory structures for the output TreeArtifact first.
- try {
- artifact.getPath().createDirectoryAndParents();
- } catch (IOException e) {
- env.getListener()
- .handle(
- Event.error(
- String.format(
- "Failed to create output directory for TreeArtifact %s: %s",
- artifact, e.getMessage())));
- throw new ArtifactFunctionException(e, Transience.TRANSIENT);
+ if (!usesActionFS.get()) {
+ try {
+ artifact.getPath().createDirectoryAndParents();
+ } catch (IOException e) {
+ env.getListener()
+ .handle(
+ Event.error(
+ String.format(
+ "Failed to create output directory for TreeArtifact %s: %s",
+ artifact, e.getMessage())));
+ throw new ArtifactFunctionException(e, Transience.TRANSIENT);
+ }
}
return createTreeArtifactValueFromActionKey(actionLookupKey, actionIndex, artifact, env);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 7f8b61f..e5fd307 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -524,7 +524,7 @@
SkyFunctions.ASPECT_COMPLETION,
CompletionFunction.aspectCompletionFunction(pathResolverFactory));
map.put(SkyFunctions.TEST_COMPLETION, new TestCompletionFunction());
- map.put(Artifact.ARTIFACT, new ArtifactFunction());
+ map.put(Artifact.ARTIFACT, new ArtifactFunction(skyframeActionExecutor::usesActionFileSystem));
map.put(
SkyFunctions.BUILD_INFO_COLLECTION,
new BuildInfoCollectionFunction(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
index 5a1ca44..1617a11 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
@@ -13,6 +13,7 @@
// limitations under the License.
package com.google.devtools.build.lib.skyframe;
+import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
@@ -97,7 +98,7 @@
new FileStateFunction(
new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper))
.put(FileValue.FILE, new FileFunction(pkgLocator))
- .put(Artifact.ARTIFACT, new ArtifactFunction())
+ .put(Artifact.ARTIFACT, new ArtifactFunction(Suppliers.ofInstance(false)))
.put(SkyFunctions.ACTION_EXECUTION, new SimpleActionExecutionFunction())
.put(
SkyFunctions.PACKAGE,
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index c8908eb..6d022f6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -18,6 +18,7 @@
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -215,7 +216,7 @@
ImmutableMap.<SkyFunctionName, SkyFunction>builder()
.put(FileStateValue.FILE_STATE, new FileStateFunction(tsgmRef, externalFilesHelper))
.put(FileValue.FILE, new FileFunction(pkgLocator))
- .put(Artifact.ARTIFACT, new ArtifactFunction())
+ .put(Artifact.ARTIFACT, new ArtifactFunction(Suppliers.ofInstance(false)))
.put(
SkyFunctions.ACTION_EXECUTION,
new ActionExecutionFunction(skyframeActionExecutor, directories, tsgmRef))