Add backoff sleep and interruption handling to deleteTreeWithRetries.

During temporary file deletion retries on IOException, sleeping with bounded backoff prevents burning 100% of a CPU core in a tight loop across thousands of filesystem syscalls, while properly re-throwing InterruptedException respects cancellation.

PiperOrigin-RevId: 981249475
Change-Id: I99e929c016525eb36f827493cf0846585e31babe
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java
index 95d839f..5a42093 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/starlark/StarlarkBaseExternalContext.java
@@ -1188,7 +1188,7 @@
    * https://github.com/bazelbuild/bazel/issues/20013 for further details.
    */
   private static void deleteTreeWithRetries(Path downloadDirectory)
-      throws RepositoryFunctionException {
+      throws RepositoryFunctionException, InterruptedException {
     Instant start = Instant.now();
     Instant deadline = start.plus(Duration.ofSeconds(5));
 
@@ -1217,6 +1217,12 @@
                   e),
               Transience.TRANSIENT);
         }
+        try {
+          Thread.sleep(Math.min(100, attempts * 10L));
+        } catch (InterruptedException ie) {
+          Thread.currentThread().interrupt();
+          throw ie;
+        }
       }
     }
   }