From b9d8d58ef58645544c84ac4bcace869adad7abe5 Mon Sep 17 00:00:00 2001 From: janakr Date: Wed, 13 Jun 2018 21:57:19 -0700 Subject: 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 --- .../build/lib/skyframe/ActionExecutionValue.java | 43 +++++++++++++++++++--- 1 file changed, 38 insertions(+), 5 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ActionExecutionValue.java') 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 artifactData, Map treeArtifactData, Map additionalOutputData, @@ -97,6 +98,19 @@ public class ActionExecutionValue implements SkyValue { this.outputSymlinks = outputSymlinks; } + static ActionExecutionValue create( + Map artifactData, + Map treeArtifactData, + Map additionalOutputData, + @Nullable ImmutableList 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 artifactData, + Map treeArtifactData, + Map additionalOutputData, + @Nullable ImmutableList outputSymlinks) { + super(artifactData, treeArtifactData, additionalOutputData, outputSymlinks); + } + } + private static ImmutableMap transformKeys( ImmutableMap data, Map 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); } } -- cgit v1.2.3