Augment the QueryableGraph#get[BatchWithFieldHints] method to take in parameters conveying the requesting node (if any), the requested node(s), as well as a reason for the skyframe graph lookup. Alternate graph implementations may be interested in this information.
--
MOS_MIGRATED_REVID=128496089
diff --git a/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java b/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java
index 2703802..75ce05c 100644
--- a/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java
+++ b/src/main/java/com/google/devtools/build/skyframe/QueryableGraph.java
@@ -23,9 +23,15 @@
/** A graph that exposes its entries and structure, for use by classes that must traverse it. */
@ThreadSafe
public interface QueryableGraph {
- /** Returns the node with the given name, or {@code null} if the node does not exist. */
+ /**
+ * Returns the node with the given {@code key}, or {@code null} if the node does not exist.
+ *
+ * @param requestor if non-{@code null}, the node on behalf of which {@code key} is being
+ * requested.
+ * @param reason the reason the node is being requested.
+ */
@Nullable
- NodeEntry get(SkyKey key);
+ NodeEntry get(@Nullable SkyKey requestor, Reason reason, SkyKey key);
/**
* Fetches all the given nodes. Returns a map {@code m} such that, for all {@code k} in {@code
@@ -34,7 +40,65 @@
* QueryableGraph implementation that allows it to possibly construct certain fields of the
* returned node entries more lazily. Hints may only be applied to nodes in a certain state, like
* done nodes.
+ *
+ * @param requestor if non-{@code null}, the node on behalf of which the given {@code keys} are
+ * being requested.
+ * @param reason the reason the nodes are being requested.
*/
Map<SkyKey, NodeEntry> getBatchWithFieldHints(
- Iterable<SkyKey> keys, EnumSet<NodeEntryField> fields);
+ @Nullable SkyKey requestor,
+ Reason reason,
+ Iterable<SkyKey> keys,
+ EnumSet<NodeEntryField> fields);
+
+ /**
+ * The reason that a node is being looked up in the Skyframe graph.
+ *
+ * <p>Alternate graph implementations may wish to make use of this information.
+ */
+ enum Reason {
+ /**
+ * The node is being looked up as part of the prefetch step before evaluation of a SkyFunction.
+ */
+ PREFETCH,
+
+ /**
+ * The node is being fetched because it is about to be evaluated or it has already been
+ * evaluated, but *not* because it was just requested during evaluation of a SkyFunction (see
+ * DEP_REQUESTED).
+ */
+ EVALUATION,
+
+ /** The node is being looked up because it was requested during evaluation of a SkyFunction. */
+ DEP_REQUESTED,
+
+ /** The node is being looked up during the invalidation phase of Skyframe evaluation. */
+ INVALIDATION,
+
+ /** The node is being looked up during the cycle checking phase of Skyframe evaluation. */
+ CYCLE_CHECKING,
+
+ /** The node is being looked up so that an rdep can be added to it. */
+ RDEP_ADDITION,
+
+ /** The node is being looked up so that an rdep can be removed from it. */
+ RDEP_REMOVAL,
+
+ /** The node is being looked up so it can be enqueued for evaluation or change pruning. */
+ ENQUEUING_CHILD,
+
+ /**
+ * The node is being looked up so that it can be signaled that a dependency is now complete.
+ */
+ SIGNAL_DEP,
+
+ /**
+ * The node is being looking up as part of the error bubbling phase of fail-fast Skyframe
+ * evaluation.
+ */
+ ERROR_BUBBLING,
+
+ /** Some other reason than one of the above. */
+ OTHER,
+ }
}