aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/skyframe
diff options
context:
space:
mode:
authorGravatar ulfjack <ulfjack@google.com>2018-07-25 05:43:01 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-25 05:44:36 -0700
commit8fd1afd9ce02b5c6b058064c11e92bc0e3cd3145 (patch)
tree6baab73a22e98b5a47369f55b753c1e0822e67f9 /src/main/java/com/google/devtools/build/skyframe
parentbca1912853086b8e9a28a85a1b144ec0dc9717cc (diff)
Skip invalidation entirely if the diff is empty
PiperOrigin-RevId: 205980620
Diffstat (limited to 'src/main/java/com/google/devtools/build/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/Differencer.java4
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java20
2 files changed, 15 insertions, 9 deletions
diff --git a/src/main/java/com/google/devtools/build/skyframe/Differencer.java b/src/main/java/com/google/devtools/build/skyframe/Differencer.java
index ddcb34fe0d..35b42a3358 100644
--- a/src/main/java/com/google/devtools/build/skyframe/Differencer.java
+++ b/src/main/java/com/google/devtools/build/skyframe/Differencer.java
@@ -30,6 +30,10 @@ public interface Differencer {
* Represents a set of changed values.
*/
interface Diff {
+ default boolean isEmpty() {
+ return changedKeysWithoutNewValues().isEmpty() && changedKeysWithNewValues().isEmpty();
+ }
+
/**
* Returns the value keys whose values have changed, but for which we don't have the new values.
*/
diff --git a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
index a1f6461e50..ba3812689c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InMemoryMemoizingEvaluator.java
@@ -166,15 +166,17 @@ public final class InMemoryMemoizingEvaluator implements MemoizingEvaluator {
// It clears the internal data structures after getDiff is called and will not return
// diffs for historical versions. This makes the following code sensitive to interrupts.
// Ideally we would simply not update lastGraphVersion if an interrupt occurs.
- Diff diff = differencer.getDiff(new DelegatingWalkableGraph(graph), lastGraphVersion,
- version);
- valuesToInject.putAll(diff.changedKeysWithNewValues());
- invalidate(diff.changedKeysWithoutNewValues());
- pruneInjectedValues(valuesToInject);
- invalidate(valuesToInject.keySet());
-
- performInvalidation();
- injectValues(intVersion);
+ Diff diff =
+ differencer.getDiff(new DelegatingWalkableGraph(graph), lastGraphVersion, version);
+ if (!diff.isEmpty() || !valuesToInject.isEmpty() || !valuesToDelete.isEmpty()) {
+ valuesToInject.putAll(diff.changedKeysWithNewValues());
+ invalidate(diff.changedKeysWithoutNewValues());
+ pruneInjectedValues(valuesToInject);
+ invalidate(valuesToInject.keySet());
+
+ performInvalidation();
+ injectValues(intVersion);
+ }
ParallelEvaluator evaluator =
new ParallelEvaluator(