Search in sources :

Example 1 with MiddlemanType

use of com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType in project bazel by bazelbuild.

the class ActionCacheChecker method getTokenIfNeedToExecute.

/**
   * Checks whether {@code action} needs to be executed and returns a non-null Token if so.
   *
   * <p>The method checks if any of the action's inputs or outputs have changed. Returns a non-null
   * {@link Token} if the action needs to be executed, and null otherwise.
   *
   * <p>If this method returns non-null, indicating that the action will be executed, the
   * metadataHandler's {@link MetadataHandler#discardOutputMetadata} method must be called, so that
   * it does not serve stale metadata for the action's outputs after the action is executed.
   */
// Note: the handler should only be used for DEPCHECKER events; there's no
// guarantee it will be available for other events.
public Token getTokenIfNeedToExecute(Action action, Iterable<Artifact> resolvedCacheArtifacts, Map<String, String> clientEnv, EventHandler handler, MetadataHandler metadataHandler) {
    // TODO(bazel-team): (2010) For RunfilesAction/SymlinkAction and similar actions that
    // produce only symlinks we should not check whether inputs are valid at all - all that matters
    // that inputs and outputs are still exist (and new inputs have not appeared). All other checks
    // are unnecessary. In other words, the only metadata we should check for them is file existence
    // itself.
    MiddlemanType middlemanType = action.getActionType();
    if (middlemanType.isMiddleman()) {
        // propagate invalidation of their inputs.
        if (middlemanType != MiddlemanType.ERROR_PROPAGATING_MIDDLEMAN) {
            checkMiddlemanAction(action, handler, metadataHandler);
        }
        return null;
    }
    if (!cacheConfig.enabled()) {
        return new Token(getKeyString(action));
    }
    Iterable<Artifact> actionInputs = action.getInputs();
    // Resolve action inputs from cache, if necessary.
    boolean inputsDiscovered = action.inputsDiscovered();
    if (!inputsDiscovered && resolvedCacheArtifacts != null) {
        // The action doesn't know its inputs, but the caller has a good idea of what they are.
        Preconditions.checkState(action.discoversInputs(), "Actions that don't know their inputs must discover them: %s", action);
        actionInputs = resolvedCacheArtifacts;
    }
    ActionCache.Entry entry = getCacheEntry(action);
    if (mustExecute(action, entry, handler, metadataHandler, actionInputs, clientEnv)) {
        if (entry != null) {
            removeCacheEntry(action);
        }
        return new Token(getKeyString(action));
    }
    if (!inputsDiscovered) {
        action.updateInputs(actionInputs);
    }
    return null;
}
Also used : ActionCache(com.google.devtools.build.lib.actions.cache.ActionCache) Entry(com.google.devtools.build.lib.actions.cache.ActionCache.Entry) MiddlemanType(com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType)

Aggregations

MiddlemanType (com.google.devtools.build.lib.actions.ActionAnalysisMetadata.MiddlemanType)1 ActionCache (com.google.devtools.build.lib.actions.cache.ActionCache)1 Entry (com.google.devtools.build.lib.actions.cache.ActionCache.Entry)1