// Copyright 2014 The Bazel Authors. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.devtools.build.lib.actions.cache; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics; import com.google.devtools.build.lib.actions.cache.Protos.ActionCacheStatistics.MissReason; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Nullable; /** * An interface defining a cache of already-executed Actions. * *
This class' naming is misleading; it doesn't cache the actual actions, but it stores a * fingerprint of the action state (ie. a hash of the input and output files on disk), so * we can tell if we need to rerun an action given the state of the file system. * *
Each action entry uses one of its output paths as a key (after conversion
* to the string).
*/
@ThreadCompatible
public interface ActionCache {
/**
* Updates the cache entry for the specified key.
*/
void put(String key, ActionCache.Entry entry);
/**
* Returns the corresponding cache entry for the specified key, if any, or
* null if not found.
*/
ActionCache.Entry get(String key);
/**
* Removes entry from cache
*/
void remove(String key);
/**
* An entry in the ActionCache that contains all action input and output
* artifact paths and their metadata plus action key itself.
*
* Cache entry operates under assumption that once it is fully initialized
* and getFileDigest() method is called, it becomes logically immutable (all methods
* will continue to return same result regardless of internal data transformations).
*/
final class Entry {
/** Unique instance to represent a corrupted cache entry. */
public static final ActionCache.Entry CORRUPTED =
new ActionCache.Entry(null, ImmutableMap. This may compresses the data into a more compact representation, and makes the object
* immutable.
*/
public Md5Digest getFileDigest() {
if (md5Digest == null) {
md5Digest = DigestUtils.fromMetadata(mdMap);
mdMap = null;
}
return md5Digest;
}
/**
* Returns true if this cache entry is corrupted and should be ignored.
*/
public boolean isCorrupted() {
return this == CORRUPTED;
}
/**
* @return stored path strings, or null if the corresponding action does not discover inputs.
*/
public Collection The extracted values are not guaranteed to be a consistent snapshot of the metrics tracked
* by the action cache. Therefore, even if it is safe to call this function at any point in time,
* this should only be called once there are no actions running.
*/
void mergeIntoActionCacheStatistics(ActionCacheStatistics.Builder builder);
/** Resets the current statistics to zero. */
void resetStatistics();
}