Shutdown ByteStream BES artifact uploader threadpool after build.

When bazel is configured to upload BES artifacts (eg.
command.profile.gz) using a grpc endpoint, we create a thread pool
dedicated to uploading files for that build. With this change we now
remember to shutdown the threadpool after the build completes.

Fixes #10603.

PiperOrigin-RevId: 305895285
diff --git a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploader.java b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploader.java
index 107023c..3a03343 100644
--- a/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploader.java
+++ b/src/main/java/com/google/devtools/build/lib/remote/ByteStreamBuildEventArtifactUploader.java
@@ -24,6 +24,7 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import com.google.devtools.build.lib.buildeventstream.BuildEvent.LocalFile;
 import com.google.devtools.build.lib.buildeventstream.BuildEventArtifactUploader;
 import com.google.devtools.build.lib.buildeventstream.PathConverter;
@@ -73,7 +74,9 @@
     // Limit the maximum threads number to 1000 (chosen arbitrarily)
     this.uploadExecutor =
         MoreExecutors.listeningDecorator(
-            Executors.newFixedThreadPool(Math.min(maxUploadThreads, 1000)));
+            Executors.newFixedThreadPool(
+                Math.min(maxUploadThreads, 1000),
+                new ThreadFactoryBuilder().setNameFormat("bes-artifact-uploader-%d").build()));
     this.missingDigestsFinder = missingDigestsFinder;
   }
 
@@ -250,6 +253,7 @@
       return;
     }
     uploader.release();
+    uploadExecutor.shutdown();
   }
 
   private static class PathConverterImpl implements PathConverter {