Pre-size the deletion visitor’s visited set (#32071)

DeletingNodeVisitor sizes its concurrent visited set from pendingVisitations at construction. This reduces ConcurrentHashMap resizing while preserving concurrent deletion and interruption behavior.

In the original 13.6-million-node deletion fixture, cumulative allocation fell by about 250 MiB; wall time was unchanged. Existing eager invalidation tests cover interrupted deletion, reverse dependencies, and processing all pending nodes. The complete patch matches the original and git diff --check passes upstream.

@fmeum

Closes #32071

COPYBARA_INTEGRATE_REVIEW=https://github.com/bazelbuild/bazel/pull/32071 from dzbarsky:dzbarsky/upstream-bazel-142 a46544fc9b7a858d29ba918e765584771e332f8e
PiperOrigin-RevId: 1008459838
Change-Id: Ib821d9869f66bebe39f9e599eb4fcfc434030c1f
diff --git a/src/main/java/com/google/devtools/build/skyframe/InvalidatingNodeVisitor.java b/src/main/java/com/google/devtools/build/skyframe/InvalidatingNodeVisitor.java
index be90d10..15af5d0 100644
--- a/src/main/java/com/google/devtools/build/skyframe/InvalidatingNodeVisitor.java
+++ b/src/main/java/com/google/devtools/build/skyframe/InvalidatingNodeVisitor.java
@@ -227,7 +227,7 @@
 
   /** A node-deleting implementation. */
   static final class DeletingNodeVisitor extends InvalidatingNodeVisitor<InMemoryGraph> {
-    private final Set<SkyKey> visited = Sets.newConcurrentHashSet();
+    private final Set<SkyKey> visited;
     private final boolean traverseGraph;
     private final DeletingInvalidationState state;
 
@@ -241,6 +241,7 @@
           progressReceiver,
           state,
           NamedForkJoinPool.newNamedPool("deleting node visitor", DEFAULT_THREAD_COUNT));
+      this.visited = ConcurrentHashMap.newKeySet(pendingVisitations.size());
       this.traverseGraph = traverseGraph;
       this.state = state;
     }