Search in sources :

Example 36 with Digest

use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.

the class CASFileCache method findMissingBlobs.

@Override
public Iterable<Digest> findMissingBlobs(Iterable<Digest> digests) throws InterruptedException {
    ImmutableList.Builder<Digest> builder = ImmutableList.builder();
    ImmutableList.Builder<String> found = ImmutableList.builder();
    for (Digest digest : digests) {
        if (digest.getSizeBytes() != 0 && !containsLocal(digest, null, found::add)) {
            builder.add(digest);
        }
    }
    List<String> foundDigests = found.build();
    if (!foundDigests.isEmpty()) {
        accessed(foundDigests);
    }
    ImmutableList<Digest> missingDigests = builder.build();
    return CasFallbackDelegate.findMissingBlobs(delegate, missingDigests);
}
Also used : Digest(build.bazel.remote.execution.v2.Digest) ImmutableList(com.google.common.collect.ImmutableList) ByteString(com.google.protobuf.ByteString)

Example 37 with Digest

use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.

the class CASFileCache method charge.

@SuppressWarnings({ "ConstantConditions", "ResultOfMethodCallIgnored" })
private boolean charge(String key, long blobSizeInBytes, AtomicBoolean requiresDischarge) throws IOException, InterruptedException {
    boolean interrupted = false;
    Iterable<ListenableFuture<Digest>> expiredDigestsFutures;
    synchronized (this) {
        if (referenceIfExists(key)) {
            return false;
        }
        sizeInBytes += blobSizeInBytes;
        requiresDischarge.set(true);
        ImmutableList.Builder<ListenableFuture<Digest>> builder = ImmutableList.builder();
        try {
            while (!interrupted && sizeInBytes > maxSizeInBytes) {
                ListenableFuture<Entry> expiredFuture = expireEntry(blobSizeInBytes, expireService);
                interrupted = Thread.interrupted();
                if (expiredFuture != null) {
                    builder.add(transformAsync(expiredFuture, (expiredEntry) -> {
                        String expiredKey = expiredEntry.key;
                        try {
                            Files.delete(getPath(expiredKey));
                        } catch (NoSuchFileException eNoEnt) {
                            logger.log(Level.SEVERE, format("CASFileCache::putImpl: expired key %s did not exist to delete", expiredKey));
                        }
                        FileEntryKey fileEntryKey = parseFileEntryKey(expiredKey, expiredEntry.size);
                        if (fileEntryKey == null) {
                            logger.log(Level.SEVERE, format("error parsing expired key %s", expiredKey));
                        } else if (storage.containsKey(getKey(fileEntryKey.getDigest(), !fileEntryKey.getIsExecutable()))) {
                            return immediateFuture(null);
                        }
                        expiredKeyCounter.inc();
                        logger.log(Level.INFO, format("expired key %s", expiredKey));
                        return immediateFuture(fileEntryKey.getDigest());
                    }, expireService));
                }
            }
        } catch (InterruptedException e) {
            // clear interrupted flag
            Thread.interrupted();
            interrupted = true;
        }
        expiredDigestsFutures = builder.build();
    }
    ImmutableSet.Builder<Digest> builder = ImmutableSet.builder();
    for (ListenableFuture<Digest> expiredDigestFuture : expiredDigestsFutures) {
        Digest digest = getOrIOException(expiredDigestFuture);
        if (Thread.interrupted()) {
            interrupted = true;
        }
        if (digest != null) {
            builder.add(digest);
        }
    }
    Set<Digest> expiredDigests = builder.build();
    if (!expiredDigests.isEmpty()) {
        onExpire.accept(expiredDigests);
    }
    if (interrupted || Thread.currentThread().isInterrupted()) {
        throw new InterruptedException();
    }
    return true;
}
Also used : LoadingCache(com.google.common.cache.LoadingCache) DirectoryNode(build.bazel.remote.execution.v2.DirectoryNode) Futures.successfulAsList(com.google.common.util.concurrent.Futures.successfulAsList) BooleanSupplier(java.util.function.BooleanSupplier) Duration(java.time.Duration) Map(java.util.Map) Utils.listDirentSorted(build.buildfarm.common.io.Utils.listDirentSorted) Path(java.nio.file.Path) ServerCallStreamObserver(io.grpc.stub.ServerCallStreamObserver) EvenMoreFiles.setReadOnlyPerms(build.buildfarm.common.io.EvenMoreFiles.setReadOnlyPerms) EntryLimitException(build.buildfarm.common.EntryLimitException) Set(java.util.Set) FilterOutputStream(java.io.FilterOutputStream) MILLISECONDS(java.util.concurrent.TimeUnit.MILLISECONDS) FileStatus(build.buildfarm.common.io.FileStatus) GuardedBy(javax.annotation.concurrent.GuardedBy) Executors(java.util.concurrent.Executors) MoreExecutors.directExecutor(com.google.common.util.concurrent.MoreExecutors.directExecutor) ClosedByInterruptException(java.nio.channels.ClosedByInterruptException) NamedFileKey(build.buildfarm.common.io.NamedFileKey) ByteStreams(com.google.common.io.ByteStreams) Directory(build.bazel.remote.execution.v2.Directory) Iterables(com.google.common.collect.Iterables) MoreExecutors.newDirectExecutorService(com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService) MINUTES(java.util.concurrent.TimeUnit.MINUTES) Utils.getFileKey(build.buildfarm.common.io.Utils.getFileKey) Supplier(java.util.function.Supplier) DigestUtil(build.buildfarm.common.DigestUtil) Directories(build.buildfarm.common.io.Directories) FileNode(build.bazel.remote.execution.v2.FileNode) Nullable(javax.annotation.Nullable) Futures.immediateFuture(com.google.common.util.concurrent.Futures.immediateFuture) FileStore(java.nio.file.FileStore) Files(java.nio.file.Files) Executor(java.util.concurrent.Executor) ClosedChannelException(java.nio.channels.ClosedChannelException) Throwables(com.google.common.base.Throwables) IOException(java.io.IOException) Futures.whenAllComplete(com.google.common.util.concurrent.Futures.whenAllComplete) ExecutionException(java.util.concurrent.ExecutionException) Lock(java.util.concurrent.locks.Lock) CREATE(java.nio.file.StandardOpenOption.CREATE) Utils.listDir(build.buildfarm.common.io.Utils.listDir) HOURS(java.util.concurrent.TimeUnit.HOURS) RemovalListener(com.google.common.cache.RemovalListener) Futures.transform(com.google.common.util.concurrent.Futures.transform) NoSuchFileException(java.nio.file.NoSuchFileException) Futures.transformAsync(com.google.common.util.concurrent.Futures.transformAsync) RequestMetadata(build.bazel.remote.execution.v2.RequestMetadata) ContentAddressableStorage(build.buildfarm.cas.ContentAddressableStorage) SettableFuture(com.google.common.util.concurrent.SettableFuture) Digest(build.bazel.remote.execution.v2.Digest) Gauge(io.prometheus.client.Gauge) ImmutableSet(com.google.common.collect.ImmutableSet) ImmutableMap(com.google.common.collect.ImmutableMap) Directories.disableAllWriteAccess(build.buildfarm.common.io.Directories.disableAllWriteAccess) UUID(java.util.UUID) Instant(java.time.Instant) Logger(java.util.logging.Logger) String.format(java.lang.String.format) Preconditions.checkState(com.google.common.base.Preconditions.checkState) CacheLoader(com.google.common.cache.CacheLoader) ByteString(com.google.protobuf.ByteString) List(java.util.List) JSONObject(org.json.simple.JSONObject) SymlinkNode(build.bazel.remote.execution.v2.SymlinkNode) CacheBuilder(com.google.common.cache.CacheBuilder) BlobWriteKey(build.buildfarm.v1test.BlobWriteKey) ThreadFactoryBuilder(com.google.common.util.concurrent.ThreadFactoryBuilder) MoreExecutors.listeningDecorator(com.google.common.util.concurrent.MoreExecutors.listeningDecorator) ListenableFuture(com.google.common.util.concurrent.ListenableFuture) Deadline(io.grpc.Deadline) CompleteWrite(build.buildfarm.common.Write.CompleteWrite) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Counter(io.prometheus.client.Counter) ConcurrentMap(java.util.concurrent.ConcurrentMap) Level(java.util.logging.Level) RejectedExecutionException(java.util.concurrent.RejectedExecutionException) APPEND(java.nio.file.StandardOpenOption.APPEND) ImmutableList(com.google.common.collect.ImmutableList) UncheckedExecutionException(com.google.common.util.concurrent.UncheckedExecutionException) FeedbackOutputStream(build.buildfarm.common.io.FeedbackOutputStream) ByteStreams.nullOutputStream(com.google.common.io.ByteStreams.nullOutputStream) ExecutorService(java.util.concurrent.ExecutorService) OutputStream(java.io.OutputStream) Response(build.bazel.remote.execution.v2.BatchReadBlobsResponse.Response) HashingOutputStream(com.google.common.hash.HashingOutputStream) EvenMoreFiles.isReadOnlyExecutable(build.buildfarm.common.io.EvenMoreFiles.isReadOnlyExecutable) Utils.stat(build.buildfarm.common.io.Utils.stat) Preconditions.checkNotNull(com.google.common.base.Preconditions.checkNotNull) FileAlreadyExistsException(java.nio.file.FileAlreadyExistsException) Maps(com.google.common.collect.Maps) Write(build.buildfarm.common.Write) Futures.catchingAsync(com.google.common.util.concurrent.Futures.catchingAsync) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) Condition(java.util.concurrent.locks.Condition) DigestMismatchException(build.buildfarm.cas.DigestMismatchException) Futures.immediateFailedFuture(com.google.common.util.concurrent.Futures.immediateFailedFuture) Utils.getOrIOException(build.buildfarm.common.io.Utils.getOrIOException) VisibleForTesting(com.google.common.annotations.VisibleForTesting) Collections(java.util.Collections) SECONDS(java.util.concurrent.TimeUnit.SECONDS) InputStream(java.io.InputStream) Digest(build.bazel.remote.execution.v2.Digest) ImmutableList(com.google.common.collect.ImmutableList) NoSuchFileException(java.nio.file.NoSuchFileException) ByteString(com.google.protobuf.ByteString) ImmutableSet(com.google.common.collect.ImmutableSet) ListenableFuture(com.google.common.util.concurrent.ListenableFuture)

Example 38 with Digest

use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.

the class CASFileCache method computeDirectories.

@SuppressWarnings("ConstantConditions")
private List<Path> computeDirectories(CacheScanResults cacheScanResults) throws InterruptedException {
    // create thread pool
    int nThreads = Runtime.getRuntime().availableProcessors();
    String threadNameFormat = "compute-cache-pool-%d";
    ExecutorService pool = Executors.newFixedThreadPool(nThreads, new ThreadFactoryBuilder().setNameFormat(threadNameFormat).build());
    ImmutableList.Builder<Path> invalidDirectories = new ImmutableList.Builder<>();
    for (Path path : cacheScanResults.computeDirs) {
        pool.execute(() -> {
            try {
                ImmutableList.Builder<String> inputsBuilder = ImmutableList.builder();
                List<NamedFileKey> sortedDirent = listDirentSorted(path, fileStore);
                Directory directory = computeDirectory(path, sortedDirent, cacheScanResults.fileKeys, inputsBuilder);
                Digest digest = directory == null ? null : digestUtil.compute(directory);
                // apply legacy rename if possible
                // Remove on major release or when #677 is closed
                Path dirPath = path;
                String basename = path.getFileName().toString();
                if (basename.equals(digest.getHash() + "_" + digest.getSizeBytes() + "_dir")) {
                    dirPath = getDirectoryPath(digest);
                    if (Files.exists(dirPath)) {
                        // destroy this directory if the destination already exists
                        digest = null;
                    } else {
                        Files.move(path, dirPath);
                    }
                }
                if (digest != null && getDirectoryPath(digest).equals(dirPath)) {
                    DirectoryEntry e = new DirectoryEntry(directory, Deadline.after(10, SECONDS));
                    directoriesIndex.put(digest, inputsBuilder.build());
                    directoryStorage.put(digest, e);
                } else {
                    synchronized (invalidDirectories) {
                        invalidDirectories.add(dirPath);
                    }
                }
            } catch (Exception e) {
                logger.log(Level.SEVERE, "error processing directory " + path.toString(), e);
            }
        });
    }
    joinThreads(pool, "Populating Directories...");
    return invalidDirectories.build();
}
Also used : Path(java.nio.file.Path) Digest(build.bazel.remote.execution.v2.Digest) ImmutableList(com.google.common.collect.ImmutableList) CacheBuilder(com.google.common.cache.CacheBuilder) ThreadFactoryBuilder(com.google.common.util.concurrent.ThreadFactoryBuilder) ByteString(com.google.protobuf.ByteString) NamedFileKey(build.buildfarm.common.io.NamedFileKey) EntryLimitException(build.buildfarm.common.EntryLimitException) ClosedByInterruptException(java.nio.channels.ClosedByInterruptException) ClosedChannelException(java.nio.channels.ClosedChannelException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) NoSuchFileException(java.nio.file.NoSuchFileException) RejectedExecutionException(java.util.concurrent.RejectedExecutionException) UncheckedExecutionException(com.google.common.util.concurrent.UncheckedExecutionException) FileAlreadyExistsException(java.nio.file.FileAlreadyExistsException) DigestMismatchException(build.buildfarm.cas.DigestMismatchException) Utils.getOrIOException(build.buildfarm.common.io.Utils.getOrIOException) MoreExecutors.newDirectExecutorService(com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService) ExecutorService(java.util.concurrent.ExecutorService) ThreadFactoryBuilder(com.google.common.util.concurrent.ThreadFactoryBuilder) Directory(build.bazel.remote.execution.v2.Directory)

Example 39 with Digest

use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.

the class CASFileCache method decrementReferencesSynchronized.

@GuardedBy("this")
private void decrementReferencesSynchronized(Iterable<String> inputFiles, Iterable<Digest> inputDirectories) throws IOException {
    // decrement references and notify if any dropped to 0
    // insert after the last 0-reference count entry in list
    int entriesDereferenced = decrementInputReferences(inputFiles);
    for (Digest inputDirectory : inputDirectories) {
        DirectoryEntry dirEntry = directoryStorage.get(inputDirectory);
        if (dirEntry == null) {
            throw new IllegalStateException("inputDirectory " + DigestUtil.toString(inputDirectory) + " is not in directoryStorage");
        }
        entriesDereferenced += decrementInputReferences(directoriesIndex.directoryEntries(inputDirectory));
    }
    if (entriesDereferenced > 0) {
        notify();
    }
}
Also used : Digest(build.bazel.remote.execution.v2.Digest) GuardedBy(javax.annotation.concurrent.GuardedBy)

Example 40 with Digest

use of com.google.cloud.kms.v1.Digest in project bazel-buildfarm by bazelbuild.

the class ContentAddressableStorages method createFilesystemCAS.

public static ContentAddressableStorage createFilesystemCAS(FilesystemCASConfig config) throws ConfigurationException {
    String path = config.getPath();
    if (path.isEmpty()) {
        throw new ConfigurationException("filesystem cas path is empty");
    }
    long maxSizeBytes = config.getMaxSizeBytes();
    long maxEntrySizeBytes = config.getMaxEntrySizeBytes();
    int hexBucketLevels = config.getHexBucketLevels();
    boolean storeFileDirsIndexInMemory = config.getFileDirectoriesIndexInMemory();
    if (maxSizeBytes <= 0) {
        throw new ConfigurationException("filesystem cas max_size_bytes <= 0");
    }
    if (maxEntrySizeBytes <= 0) {
        throw new ConfigurationException("filesystem cas max_entry_size_bytes <= 0");
    }
    if (maxEntrySizeBytes > maxSizeBytes) {
        throw new ConfigurationException("filesystem cas max_entry_size_bytes > maxSizeBytes");
    }
    if (hexBucketLevels < 0) {
        throw new ConfigurationException("filesystem cas hex_bucket_levels <= 0");
    }
    CASFileCache cas = new CASFileCache(Paths.get(path), maxSizeBytes, maxEntrySizeBytes, hexBucketLevels, storeFileDirsIndexInMemory, DigestUtil.forHash("SHA256"), /* expireService=*/
    newDirectExecutorService(), /* accessRecorder=*/
    directExecutor()) {

        @Override
        protected InputStream newExternalInput(Digest digest) throws IOException {
            throw new NoSuchFileException(digest.getHash());
        }
    };
    try {
        cas.start(false);
    } catch (IOException | InterruptedException e) {
        throw new RuntimeException("error starting filesystem cas", e);
    }
    return cas;
}
Also used : ConfigurationException(javax.naming.ConfigurationException) Digest(build.bazel.remote.execution.v2.Digest) CASFileCache(build.buildfarm.cas.cfc.CASFileCache) NoSuchFileException(java.nio.file.NoSuchFileException) ByteString(com.google.protobuf.ByteString) IOException(java.io.IOException)

Aggregations

Digest (build.bazel.remote.execution.v2.Digest)191 ByteString (com.google.protobuf.ByteString)110 Test (org.junit.Test)99 IOException (java.io.IOException)55 Directory (build.bazel.remote.execution.v2.Directory)42 ImmutableList (com.google.common.collect.ImmutableList)35 Path (java.nio.file.Path)33 Status (io.grpc.Status)30 ExecutionException (java.util.concurrent.ExecutionException)29 RequestMetadata (build.bazel.remote.execution.v2.RequestMetadata)27 InputStream (java.io.InputStream)25 Instance (build.buildfarm.instance.Instance)24 Action (build.bazel.remote.execution.v2.Action)22 DigestUtil (build.buildfarm.common.DigestUtil)22 OutputStream (java.io.OutputStream)22 Write (build.buildfarm.common.Write)21 ListenableFuture (com.google.common.util.concurrent.ListenableFuture)21 Operation (com.google.longrunning.Operation)21 UUID (java.util.UUID)20 ExecuteResponse (build.bazel.remote.execution.v2.ExecuteResponse)19