diff options
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java | 10 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java | 18 |
2 files changed, 17 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java index 66b84cbe46..fa8e3082a6 100644 --- a/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java +++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java @@ -271,12 +271,12 @@ public class InMemoryNodeEntry implements NodeEntry { if (!keepEdges()) { return; } - REVERSE_DEPS_UTIL.removeReverseDep(this, reverseDep); - if (!isDone()) { - // This is currently unnecessary -- the only time we remove a reverse dep that was added this - // build is during the clean following a build failure. In that case, this node that is not - // done will be deleted soon, so clearing the reverse dep is not required. + if (REVERSE_DEPS_UTIL.reverseDepsIsEmpty(this)) { + // If an entry has no existing reverse deps, all its reverse deps are to signal, and vice + // versa. buildingState.removeReverseDepToSignal(reverseDep); + } else { + REVERSE_DEPS_UTIL.removeReverseDep(this, reverseDep); } } diff --git a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java index 26f1136af9..807aa8c440 100644 --- a/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java +++ b/src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java @@ -106,23 +106,29 @@ public abstract class ReverseDepsUtil<T> { } } + boolean reverseDepsIsEmpty(T container) { + return !isSingleReverseDep(container) + && ((List<SkyKey>) getReverseDepsObject(container)).isEmpty(); + } + /** * See {@code addReverseDeps} method. */ void removeReverseDep(T container, SkyKey reverseDep) { if (isSingleReverseDep(container)) { // This removal is cheap so let's do it and not keep it in reverseDepsToRemove. - // !equals should only happen in case of catastrophe. - if (getReverseDepsObject(container).equals(reverseDep)) { + Preconditions.checkState( + getReverseDepsObject(container).equals(reverseDep), + "toRemove: %s container: %s", + reverseDep, + container); overwriteReverseDepsList(container, ImmutableList.<SkyKey>of()); - } return; } @SuppressWarnings("unchecked") List<SkyKey> reverseDepsAsList = (List<SkyKey>) getReverseDepsObject(container); - if (reverseDepsAsList.isEmpty()) { - return; - } + Preconditions.checkState( + !reverseDepsAsList.isEmpty(), "toRemove: %s container: %s", reverseDep, container); List<SkyKey> reverseDepsToRemove = getReverseDepsToRemove(container); if (reverseDepsToRemove == null) { reverseDepsToRemove = Lists.newArrayListWithExpectedSize(1); |