aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/InMemoryNodeEntry.java10
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/ReverseDepsUtil.java18
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);