diff options
author | 2015-04-03 23:06:31 +0000 | |
---|---|---|
committer | 2015-04-06 18:48:15 +0000 | |
commit | a5c1f969d33a8e3e552ee300d23d2e5a458b3794 (patch) | |
tree | 9f93f69f29a081e8b156d771ec463b39f01f07ab /src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java | |
parent | a8371e252367be958b72d312add5ce2fa963c209 (diff) |
Split FileAndMetadataCache into two classes, since most of the shared functionality is gone.
--
MOS_MIGRATED_REVID=90289916
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java b/src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java new file mode 100644 index 0000000000..5dde5a5346 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PerActionFileCache.java @@ -0,0 +1,107 @@ +// Copyright 2014 Google Inc. 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.skyframe; + +import com.google.common.base.Preconditions; +import com.google.common.collect.Interner; +import com.google.common.collect.Interners; +import com.google.common.io.BaseEncoding; +import com.google.devtools.build.lib.actions.ActionInput; +import com.google.devtools.build.lib.actions.ActionInputFileCache; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.protobuf.ByteString; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import javax.annotation.Nullable; + +/** + * Cache provided by an {@link ActionExecutionFunction}, allowing Blaze to obtain artifact metadata + * from the graph. + * + * <p>Data for the action's inputs is injected into this cache on construction, using the graph as + * the source of truth. + */ +class PerActionFileCache implements ActionInputFileCache { + private final Map<Artifact, FileArtifactValue> inputArtifactData; + private final File execRoot; + // Populated lazily, on calls to #getDigest. + private final Map<ByteString, Artifact> reverseMap = new ConcurrentHashMap<>(); + + private static final Interner<ByteString> BYTE_INTERNER = Interners.newWeakInterner(); + + /** + * @param inputArtifactData Map from artifact to metadata, used to return metadata upon request. + * @param execRoot Path to the execution root, used to convert Artifacts' relative paths into + * absolute ones in the execution root. + */ + PerActionFileCache(Map<Artifact, FileArtifactValue> inputArtifactData, + File execRoot) { + this.inputArtifactData = Preconditions.checkNotNull(inputArtifactData); + this.execRoot = Preconditions.checkNotNull(execRoot); + } + + @Nullable + private FileArtifactValue getInputFileArtifactValue(ActionInput input) { + if (!(input instanceof Artifact)) { + return null; + } + return Preconditions.checkNotNull(inputArtifactData.get(input), input); + } + + @Override + public long getSizeInBytes(ActionInput input) throws IOException { + FileArtifactValue metadata = getInputFileArtifactValue(input); + if (metadata != null) { + return metadata.getSize(); + } + return -1; + } + + @Nullable + @Override + public File getFileFromDigest(ByteString digest) throws IOException { + Artifact artifact = reverseMap.get(digest); + if (artifact != null) { + String relPath = artifact.getExecPathString(); + return new File(execRoot, relPath); + } + return null; + } + + @Nullable + @Override + public ByteString getDigest(ActionInput input) throws IOException { + FileArtifactValue value = getInputFileArtifactValue(input); + if (value != null) { + byte[] bytes = value.getDigest(); + if (bytes != null) { + ByteString digest = ByteString.copyFrom(BaseEncoding.base16().lowerCase().encode(bytes) + .getBytes(StandardCharsets.US_ASCII)); + reverseMap.put(BYTE_INTERNER.intern(digest), (Artifact) input); + return digest; + } + } + return null; + } + + @Override + public boolean contentsAvailableLocally(ByteString digest) { + return reverseMap.containsKey(digest); + } +} |