diff options
author | 2018-03-19 20:47:37 -0700 | |
---|---|---|
committer | 2018-03-19 20:49:36 -0700 | |
commit | 755a0a10e14c4fe4c2ff3b71af9f99d5d1a924cf (patch) | |
tree | 6175f03d4c94d82fcfa226f9df38ea316f7be8d5 /src/main/java/com/google/devtools/build/lib/skyframe/CachedSkylarkImportLookupValueAndDeps.java | |
parent | 56d1b1c3122a3d1ec111baab339631b8c42c2c31 (diff) |
Automated rollback of commit 72d28f3efc2842510a34cacd930c0204143f7412.
Fix skylark caching to properly include transitive dependencies when there is a diamond-like dependency in the loaded bzl files.
Also add guards to make sure we're not attempting to cache skylark files that transitively request a dependency that is in error.
*** Reason for rollback ***
Looking for source of non-determinism
*** Original change description ***
Automated rollback of commit 7ba939dfd5df48903929e9c14ebd0449656403e4.
*** Reason for rollback ***
Likely cause for non-determinism in skyframe
*** Original change description ***
Cache SkylarkLookupImportValues in memory so that we don't recompute them multiple times.
PiperOrigin-RevId: 189686604
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/CachedSkylarkImportLookupValueAndDeps.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/CachedSkylarkImportLookupValueAndDeps.java | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CachedSkylarkImportLookupValueAndDeps.java b/src/main/java/com/google/devtools/build/lib/skyframe/CachedSkylarkImportLookupValueAndDeps.java new file mode 100644 index 0000000000..eccb75644a --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CachedSkylarkImportLookupValueAndDeps.java @@ -0,0 +1,142 @@ +// Copyright 2018 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.skyframe; + +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.errorprone.annotations.CanIgnoreReturnValue; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.concurrent.atomic.AtomicReference; + +class CachedSkylarkImportLookupValueAndDeps { + private final SkylarkImportLookupValue value; + // We store the deps separately so that we can let go of the value when the cache drops it. + final CachedSkylarkImportLookupFunctionDeps deps; + + private CachedSkylarkImportLookupValueAndDeps( + SkylarkImportLookupValue value, CachedSkylarkImportLookupFunctionDeps deps) { + this.value = value; + this.deps = deps; + } + + SkylarkImportLookupValue getValue() { + return value; + } + + static CachedSkylarkImportLookupValueAndDeps.Builder newBuilder() { + return new CachedSkylarkImportLookupValueAndDeps.Builder(); + } + + static class Builder { + private final CachedSkylarkImportLookupFunctionDeps.Builder depsBuilder = + CachedSkylarkImportLookupFunctionDeps.newBuilder(); + private SkylarkImportLookupValue value; + + @CanIgnoreReturnValue + Builder addDep(SkyKey key) { + depsBuilder.addDep(key); + return this; + } + + @CanIgnoreReturnValue + Builder addDeps(Iterable<SkyKey> keys) { + depsBuilder.addDeps(keys); + return this; + } + + @CanIgnoreReturnValue + Builder noteException(Exception e) { + depsBuilder.noteException(e); + return this; + } + + @CanIgnoreReturnValue + Builder addTransitiveDeps(CachedSkylarkImportLookupValueAndDeps transitiveDeps) { + depsBuilder.addTransitiveDeps(transitiveDeps.deps); + return this; + } + + @CanIgnoreReturnValue + Builder setValue(SkylarkImportLookupValue value) { + this.value = value; + return this; + } + + CachedSkylarkImportLookupValueAndDeps build() { + return new CachedSkylarkImportLookupValueAndDeps(value, depsBuilder.build()); + } + } + + static class CachedSkylarkImportLookupFunctionDeps implements Iterable<Iterable<SkyKey>> { + private final ImmutableList<Iterable<SkyKey>> deps; + + private CachedSkylarkImportLookupFunctionDeps(ImmutableList<Iterable<SkyKey>> deps) { + this.deps = deps; + } + + static CachedSkylarkImportLookupFunctionDeps.Builder newBuilder() { + return new CachedSkylarkImportLookupFunctionDeps.Builder(); + } + + @Override + public Iterator<Iterable<SkyKey>> iterator() { + return deps.iterator(); + } + + static class Builder { + private final List<Iterable<SkyKey>> deps = new ArrayList<>(); + private final AtomicReference<Exception> exceptionSeen = new AtomicReference<>(null); + + // We only add the ASTFileLookupFunction through this so we don't need to worry about memory + // optimizations by adding it raw. + @CanIgnoreReturnValue + Builder addDep(SkyKey key) { + deps.add(ImmutableList.of(key)); + return this; + } + + @CanIgnoreReturnValue + Builder addDeps(Iterable<SkyKey> keys) { + deps.add(keys); + return this; + } + + @CanIgnoreReturnValue + Builder noteException(Exception e) { + exceptionSeen.set(e); + return this; + } + + @CanIgnoreReturnValue + Builder addTransitiveDeps(CachedSkylarkImportLookupFunctionDeps transitiveDeps) { + Iterables.addAll(deps, transitiveDeps); + return this; + } + + CachedSkylarkImportLookupFunctionDeps build() { + // We expect that we don't handle any exceptions in SkylarkLookupImportFunction directly. + Preconditions.checkState( + exceptionSeen.get() == null, + "Caching a value in error?: %s %s", + deps, + exceptionSeen.get()); + return new CachedSkylarkImportLookupFunctionDeps(ImmutableList.copyOf(deps)); + } + } + } +} |