Skip to content

Commit

Permalink
Add experimental_remote_cache_key_ignore_stamping to skip volatile …
Browse files Browse the repository at this point in the history
…stamping files on compute shared cache key
  • Loading branch information
bozaro committed Mar 31, 2023
1 parent e97f62d commit 0514eda
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,7 @@
import io.reactivex.rxjava3.core.SingleObserver;
import io.reactivex.rxjava3.disposables.Disposable;
import io.reactivex.rxjava3.schedulers.Schedulers;

import java.io.IOException;
import java.time.Instant;
import java.util.ArrayList;
Expand Down Expand Up @@ -340,7 +341,8 @@ public CachePolicy getWriteCachePolicy(Spawn spawn) {
public boolean mayBeExecutedRemotely(Spawn spawn) {
return remoteCache instanceof RemoteExecutionCache
&& remoteExecutor != null
&& Spawns.mayBeExecutedRemotely(spawn);
&& Spawns.mayBeExecutedRemotely(spawn)
&& !(remoteOptions.remoteCacheKeyIgnoreStamping && hasVolatileArtifacts(spawn));
}

private SortedMap<PathFragment, ActionInput> buildOutputDirMap(Spawn spawn) {
Expand Down Expand Up @@ -398,7 +400,7 @@ private MerkleTree buildInputMerkleTree(
inputMap = newInputMap;
}
return MerkleTree.build(
inputMap,
filterInputs(inputMap),
toolSignature == null ? ImmutableSet.of() : toolSignature.toolInputs,
context.getMetadataProvider(),
execRoot,
Expand Down Expand Up @@ -430,7 +432,7 @@ public MerkleTree uncachedBuildMerkleTreeVisitor(
ConcurrentLinkedQueue<MerkleTree> subMerkleTrees = new ConcurrentLinkedQueue<>();
subMerkleTrees.add(
MerkleTree.build(
walker.getLeavesInputMapping(),
filterInputs(walker.getLeavesInputMapping()),
metadataProvider,
execRoot,
artifactPathResolver,
Expand All @@ -444,6 +446,20 @@ public MerkleTree uncachedBuildMerkleTreeVisitor(
return MerkleTree.merge(subMerkleTrees, digestUtil);
}

private SortedMap<PathFragment, ActionInput> filterInputs(SortedMap<PathFragment, ActionInput> inputs) {
if (!remoteOptions.remoteCacheKeyIgnoreStamping) {
return inputs;
}
SortedMap<PathFragment, ActionInput> result = new TreeMap<>();
for (Entry<PathFragment, ActionInput> entry : inputs.entrySet()) {
ActionInput input = entry.getValue();
if (!isConstantMetadata(input)) {
result.put(entry.getKey(), input);
}
}
return result;
}

@Nullable
private static ByteString buildSalt(Spawn spawn) {
CacheSalt.Builder saltBuilder =
Expand Down Expand Up @@ -1585,6 +1601,23 @@ void report(Event evt) {
}
}

private static boolean hasVolatileArtifacts(Spawn spawn) {
var inputFiles = spawn.getInputFiles();
for (ActionInput inputFile : inputFiles.getLeaves()) {
if (isConstantMetadata(inputFile)) {
return true;
}
}
return false;
}

private static boolean isConstantMetadata(ActionInput input) {
if (input instanceof Artifact) {
return ((Artifact) input).isConstantMetadata();
}
return false;
}

/**
* A simple value class combining a hash of the tool inputs (and their digests) as well as a set
* of the relative paths of all tool inputs.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,14 @@ public final class RemoteOptions extends CommonRemoteOptions {
+ "disable TLS.")
public String remoteExecutor;

@Option(
name = "experimental_remote_cache_key_ignore_stamping",
defaultValue = "false",
documentationCategory = OptionDocumentationCategory.REMOTE,
effectTags = {OptionEffectTag.UNKNOWN},
help = "Don't use volatile stamping data in shared cache key. Also disable remote execution for stamping actions.")
public boolean remoteCacheKeyIgnoreStamping;

@Option(
name = "experimental_remote_execution_keepalive",
defaultValue = "false",
Expand Down

0 comments on commit 0514eda

Please sign in to comment.