Add end-of-command Skycache token leak check with BugReport alerting.

In resetCommandState(), awaits termination of readExecutorOwner and
commandExecutor with a timeout; if fully drained and in-flight
tokens remain non-zero, triggers BugReport.sendBugReport().

PiperOrigin-RevId: 972115697
Change-Id: I469cbc3bc5d88b75c36f5b85ce15147286f6095d
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
index 6138776..8c3b298 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/BUILD
@@ -432,10 +432,7 @@
 java_library(
     name = "skycache_channel_state_advisor",
     srcs = ["SkycacheChannelStateAdvisor.java"],
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib/skybridge:skybridge_interface",
-        "//third_party/java/guava:annotations",
-    ],
+    deps = ["//src/main/java/com/google/devtools/build/lib/skybridge:skybridge_interface"],
 )
 
 java_library(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisor.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisor.java
index 3724632..ddd635d 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisor.java
@@ -13,7 +13,6 @@
 // limitations under the License.
 package com.google.devtools.build.lib.skyframe.serialization.analysis;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.devtools.build.lib.skybridge.SkybridgeInterface;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -49,9 +48,7 @@
     inFlightRequests.addAndGet(-delta);
   }
 
-  @VisibleForTesting
-  // While this could be package private, that's forbidden for SkybridgeInterface classes.
-  public long getInFlightRequestsForTesting() {
+  public long getInFlightRequests() {
     return inFlightRequests.get();
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisorTest.java
index 2f55ac0..3c6fc05 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/serialization/analysis/SkycacheChannelStateAdvisorTest.java
@@ -36,12 +36,12 @@
     for (int i = 0; i < 100_000; i++) {
       advisor.incrementInFlightRequests();
     }
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(100_000);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(100_000);
     assertThat(advisor.isSaturated()).isFalse();
 
     // Restore counter to zero
     advisor.decrementInFlightRequests(100_000);
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(0);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(0);
   }
 
   @Test
@@ -60,36 +60,36 @@
     SkycacheChannelStateAdvisor advisor = new SkycacheChannelStateAdvisor(100);
 
     assertThat(advisor.isSaturated()).isFalse();
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(0);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(0);
 
     // Below limit
     for (int i = 0; i < 99; i++) {
       advisor.incrementInFlightRequests();
     }
     assertThat(advisor.isSaturated()).isFalse();
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(99);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(99);
 
     // Increment to 100 (at limit)
     advisor.incrementInFlightRequests();
     assertThat(advisor.isSaturated()).isTrue();
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(100);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(100);
 
     // Above limit
     for (int i = 0; i < 50; i++) {
       advisor.incrementInFlightRequests();
     }
     assertThat(advisor.isSaturated()).isTrue();
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(150);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(150);
 
     // Decrement by delta back below limit
     advisor.decrementInFlightRequests(51);
     assertThat(advisor.isSaturated()).isFalse();
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(99);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(99);
 
     // Decrement to zero
     advisor.decrementInFlightRequests(99);
     assertThat(advisor.isSaturated()).isFalse();
-    assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(0);
+    assertThat(advisor.getInFlightRequests()).isEqualTo(0);
   }
 
   @Test
@@ -116,8 +116,7 @@
         future.get();
       }
 
-      assertThat(advisor.getInFlightRequestsForTesting())
-          .isEqualTo((long) threadCount * iterationsPerThread);
+      assertThat(advisor.getInFlightRequests()).isEqualTo((long) threadCount * iterationsPerThread);
       assertThat(advisor.isSaturated()).isTrue();
 
       // Decrement back concurrently using batch decrements
@@ -135,7 +134,7 @@
         future.get();
       }
 
-      assertThat(advisor.getInFlightRequestsForTesting()).isEqualTo(0);
+      assertThat(advisor.getInFlightRequests()).isEqualTo(0);
       assertThat(advisor.isSaturated()).isFalse();
     } finally {
       executor.shutdown();