aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
diff options
context:
space:
mode:
authorGravatar janakr <janakr@google.com>2018-06-13 21:57:19 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-13 21:58:58 -0700
commitb9d8d58ef58645544c84ac4bcace869adad7abe5 (patch)
treef4faa461747d1e96b299ed67a3f520679d5481b2 /src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
parent594e8588bcd0257c5a3c7e1dd8eae82ce28173b2 (diff)
Add functionality to make certain SkyValues unshareable, meaning they are not serialized. Tag TestCompletionValue and any ActionExecutionValue coming from a NotifyOnActionCacheHit (i.e., tests) like that. To make such values really not shared, request the ActionExecutionValue from TestCompletionFunction as opposed to the ArtifactValue (propagating the unshareable bit up seemed like too much fuss, and I have a dream of getting rid of ArtifactValue anyway).
PiperOrigin-RevId: 200504358
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java43
1 files changed, 38 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
index 687a787628..85664fd7bc 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java
@@ -31,6 +31,7 @@ import com.google.devtools.build.lib.actions.FileValue;
import com.google.devtools.build.lib.actions.FilesetOutputSymlink;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe;
+import com.google.devtools.build.lib.skyframe.serialization.UnshareableValue;
import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
@@ -86,7 +87,7 @@ public class ActionExecutionValue implements SkyValue {
* ActionExecutionValues.
* @param outputSymlinks This represents the SymlinkTree which is the output of a fileset action.
*/
- ActionExecutionValue(
+ private ActionExecutionValue(
Map<Artifact, FileValue> artifactData,
Map<Artifact, TreeArtifactValue> treeArtifactData,
Map<Artifact, FileArtifactValue> additionalOutputData,
@@ -97,6 +98,19 @@ public class ActionExecutionValue implements SkyValue {
this.outputSymlinks = outputSymlinks;
}
+ static ActionExecutionValue create(
+ Map<Artifact, FileValue> artifactData,
+ Map<Artifact, TreeArtifactValue> treeArtifactData,
+ Map<Artifact, FileArtifactValue> additionalOutputData,
+ @Nullable ImmutableList<FilesetOutputSymlink> outputSymlinks,
+ boolean notifyOnActionCacheHitAction) {
+ return notifyOnActionCacheHitAction
+ ? new CrossServerUnshareableActionExecutionValue(
+ artifactData, treeArtifactData, additionalOutputData, outputSymlinks)
+ : new ActionExecutionValue(
+ artifactData, treeArtifactData, additionalOutputData, outputSymlinks);
+ }
+
/**
* Returns metadata for a given artifact, if that metadata cannot be inferred from the
* corresponding {@link #getData} call for that Artifact. See {@link
@@ -153,7 +167,7 @@ public class ActionExecutionValue implements SkyValue {
*/
@ThreadSafe
@VisibleForTesting
- public static SkyKey key(ActionLookupValue.ActionLookupKey lookupKey, int index) {
+ public static ActionLookupData key(ActionLookupValue.ActionLookupKey lookupKey, int index) {
return ActionLookupData.create(lookupKey, index);
}
@@ -171,7 +185,10 @@ public class ActionExecutionValue implements SkyValue {
if (this == obj) {
return true;
}
- if (!(obj instanceof ActionExecutionValue)) {
+ if (obj == null) {
+ return false;
+ }
+ if (!obj.getClass().equals(getClass())) {
return false;
}
ActionExecutionValue o = (ActionExecutionValue) obj;
@@ -201,6 +218,21 @@ public class ActionExecutionValue implements SkyValue {
return value;
}
+ /**
+ * Marker subclass that indicates this value cannot be shared across servers. Note that this is
+ * unrelated to the concept of shared actions.
+ */
+ private static class CrossServerUnshareableActionExecutionValue extends ActionExecutionValue
+ implements UnshareableValue {
+ CrossServerUnshareableActionExecutionValue(
+ Map<Artifact, FileValue> artifactData,
+ Map<Artifact, TreeArtifactValue> treeArtifactData,
+ Map<Artifact, FileArtifactValue> additionalOutputData,
+ @Nullable ImmutableList<FilesetOutputSymlink> outputSymlinks) {
+ super(artifactData, treeArtifactData, additionalOutputData, outputSymlinks);
+ }
+ }
+
private static <V> ImmutableMap<Artifact, V> transformKeys(
ImmutableMap<Artifact, V> data, Map<OwnerlessArtifactWrapper, Artifact> newArtifactMap) {
if (data.isEmpty()) {
@@ -223,10 +255,11 @@ public class ActionExecutionValue implements SkyValue {
.collect(Collectors.toMap(OwnerlessArtifactWrapper::new, Function.identity()));
// This is only called for shared actions, so we'll almost certainly have to transform all keys
// in all sets.
- return new ActionExecutionValue(
+ return create(
transformKeys(artifactData, newArtifactMap),
transformKeys(treeArtifactData, newArtifactMap),
transformKeys(additionalOutputData, newArtifactMap),
- outputSymlinks);
+ outputSymlinks,
+ this instanceof CrossServerUnshareableActionExecutionValue);
}
}