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