Repository: googleapis/java-storage
Pull request #2997 (2025-03-18 21:06:31)

chore(main): release 2.51.0
:robot: I have created a release *beep* *boop*
---


## [2.51.0](https://github.com/googleapis/java-storage/compare/v2.50.0...v2.51.0) (2025-04-23)


### Features

* Add @BetaApi Storage#blobAppendableUpload for gRPC Transport ([#3020](https://github.com/googleapis/java-storage/pull/3020)) ([62b6248](https://github.com/googleapis/java-storage/commit/62b62482c10d79c9f7d1b7c6cedd9e7d422a58ad))
* Add @BetaApi Storage#blobReadSession for gRPC Transport ([#3020](https://github.com/googleapis/java-storage/pull/3020)) ([62b6248](https://github.com/googleapis/java-storage/commit/62b62482c10d79c9f7d1b7c6cedd9e7d422a58ad))
* Implement improved retry context information ([#3020](https://github.com/googleapis/java-storage/pull/3020)) ([62b6248](https://github.com/googleapis/java-storage/commit/62b62482c10d79c9f7d1b7c6cedd9e7d422a58ad))


### Bug Fixes

* **deps:** Update the Java code generator (gapic-generator-java) to 2.56.0 ([8f9f5ec](https://github.com/googleapis/java-storage/commit/8f9f5ec4506bde58fbf2351c99f0d67cdcfcd88e))
* Ensure object generation is sent for Storage#update(BlobInfo) using HTTP Transport ([#3006](https://github.com/googleapis/java-storage/issues/3006)) ([2a3e0e7](https://github.com/googleapis/java-storage/commit/2a3e0e7453c5e3e45bc06eec1ba6d2bc193143e6)), closes [#2980](https://github.com/googleapis/java-storage/issues/2980)
* Update 416 handling for ReadChannel ([#3018](https://github.com/googleapis/java-storage/issues/3018)) ([4a9c3e4](https://github.com/googleapis/java-storage/commit/4a9c3e46e8d4fa64813869cadf247cf77f1844d5))
* Update gRPC Bidi resumable upload to have more robust error message generation ([#2998](https://github.com/googleapis/java-storage/issues/2998)) ([79b5d85](https://github.com/googleapis/java-storage/commit/79b5d8559b2e655178db2ba75116ddba5a581a7b))
* Update gRPC implementation for storage.buckets.get to translate NOT_FOUND to null ([#3005](https://github.com/googleapis/java-storage/issues/3005)) ([704af65](https://github.com/googleapis/java-storage/commit/704af65b25fe38d146b960775a69644cd80f2e78))


### Dependencies

* Remove explicit version declarations for packages that are in shared-dependencies  ([#3014](https://github.com/googleapis/java-storage/issues/3014)) ([61cdb30](https://github.com/googleapis/java-storage/commit/61cdb30f250d2fdaaf79e0d060eb573197c7a90e))
* Update dependency com.google.apis:google-api-services-storage to v1-rev20250312-2.0.0 ([#3000](https://github.com/googleapis/java-storage/issues/3000)) ([78fc076](https://github.com/googleapis/java-storage/commit/78fc0763c89fb0e603d75b20c9c67eabc2b9f729))
* Update dependency com.google.cloud.opentelemetry:exporter-trace to v0.34.0 ([#2938](https://github.com/googleapis/java-storage/issues/2938)) ([ff6f696](https://github.com/googleapis/java-storage/commit/ff6f696e8c4a539b5e6755fbd550096ee4688ecc))
* Update sdk-platform-java dependencies ([#3046](https://github.com/googleapis/java-storage/issues/3046)) ([861f958](https://github.com/googleapis/java-storage/commit/861f9586e041f65061fb3da7f88955c4214d450c))
* Update sdk-platform-java dependencies ([#3053](https://github.com/googleapis/java-storage/issues/3053)) ([921d1ba](https://github.com/googleapis/java-storage/commit/921d1ba0a547242c70cbb7dfb2cb190fa761398f))

---
This PR was generated with [Release Please](https://github.com/googleapis/release-please). See [documentation](https://github.com/googleapis/release-please#release-please).

dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun
dpebot: /gcbrun

Patch:
diff --git a/.kokoro/presubmit/graalvm-native-a.cfg b/.kokoro/presubmit/graalvm-native-a.cfg
index 35e57f55..3031653a 100644
--- a/.kokoro/presubmit/graalvm-native-a.cfg
+++ b/.kokoro/presubmit/graalvm-native-a.cfg
@@ -3,7 +3,7 @@
 # Configure the docker image for kokoro-trampoline.
 env_vars: {
   key: "TRAMPOLINE_IMAGE"
-  value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.45.1"
+  value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_a:3.46.1"
 }
 
 env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-b.cfg b/.kokoro/presubmit/graalvm-native-b.cfg
index 24accde4..388d3751 100644
--- a/.kokoro/presubmit/graalvm-native-b.cfg
+++ b/.kokoro/presubmit/graalvm-native-b.cfg
@@ -3,7 +3,7 @@
 # Configure the docker image for kokoro-trampoline.
 env_vars: {
   key: "TRAMPOLINE_IMAGE"
-  value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.45.1"
+  value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_b:3.46.1"
 }
 
 env_vars: {
diff --git a/.kokoro/presubmit/graalvm-native-c.cfg b/.kokoro/presubmit/graalvm-native-c.cfg
index 01407e17..92235f78 100644
--- a/.kokoro/presubmit/graalvm-native-c.cfg
+++ b/.kokoro/presubmit/graalvm-native-c.cfg
@@ -3,7 +3,7 @@
 # Configure the docker image for kokoro-trampoline.
 env_vars: {
   key: "TRAMPOLINE_IMAGE"
-  value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.45.1"
+  value: "gcr.io/cloud-devrel-public-resources/graalvm_sdk_platform_c:3.46.1"
 }
 
 env_vars: {
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 20fb2004..a6a9f653 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,32 @@
 # Changelog
 
+## [2.51.0](https://github.com/googleapis/java-storage/compare/v2.50.0...v2.51.0) (2025-04-23)
+
+
+### Features
+
+* Add @BetaApi Storage#blobAppendableUpload for gRPC Transport ([#3020](https://github.com/googleapis/java-storage/pull/3020)) ([62b6248](https://github.com/googleapis/java-storage/commit/62b62482c10d79c9f7d1b7c6cedd9e7d422a58ad))
+* Add @BetaApi Storage#blobReadSession for gRPC Transport ([#3020](https://github.com/googleapis/java-storage/pull/3020)) ([62b6248](https://github.com/googleapis/java-storage/commit/62b62482c10d79c9f7d1b7c6cedd9e7d422a58ad))
+* Implement improved retry context information ([#3020](https://github.com/googleapis/java-storage/pull/3020)) ([62b6248](https://github.com/googleapis/java-storage/commit/62b62482c10d79c9f7d1b7c6cedd9e7d422a58ad))
+
+
+### Bug Fixes
+
+* **deps:** Update the Java code generator (gapic-generator-java) to 2.56.0 ([8f9f5ec](https://github.com/googleapis/java-storage/commit/8f9f5ec4506bde58fbf2351c99f0d67cdcfcd88e))
+* Ensure object generation is sent for Storage#update(BlobInfo) using HTTP Transport ([#3006](https://github.com/googleapis/java-storage/issues/3006)) ([2a3e0e7](https://github.com/googleapis/java-storage/commit/2a3e0e7453c5e3e45bc06eec1ba6d2bc193143e6)), closes [#2980](https://github.com/googleapis/java-storage/issues/2980)
+* Update 416 handling for ReadChannel ([#3018](https://github.com/googleapis/java-storage/issues/3018)) ([4a9c3e4](https://github.com/googleapis/java-storage/commit/4a9c3e46e8d4fa64813869cadf247cf77f1844d5))
+* Update gRPC Bidi resumable upload to have more robust error message generation ([#2998](https://github.com/googleapis/java-storage/issues/2998)) ([79b5d85](https://github.com/googleapis/java-storage/commit/79b5d8559b2e655178db2ba75116ddba5a581a7b))
+* Update gRPC implementation for storage.buckets.get to translate NOT_FOUND to null ([#3005](https://github.com/googleapis/java-storage/issues/3005)) ([704af65](https://github.com/googleapis/java-storage/commit/704af65b25fe38d146b960775a69644cd80f2e78))
+
+
+### Dependencies
+
+* Remove explicit version declarations for packages that are in shared-dependencies  ([#3014](https://github.com/googleapis/java-storage/issues/3014)) ([61cdb30](https://github.com/googleapis/java-storage/commit/61cdb30f250d2fdaaf79e0d060eb573197c7a90e))
+* Update dependency com.google.apis:google-api-services-storage to v1-rev20250312-2.0.0 ([#3000](https://github.com/googleapis/java-storage/issues/3000)) ([78fc076](https://github.com/googleapis/java-storage/commit/78fc0763c89fb0e603d75b20c9c67eabc2b9f729))
+* Update dependency com.google.cloud.opentelemetry:exporter-trace to v0.34.0 ([#2938](https://github.com/googleapis/java-storage/issues/2938)) ([ff6f696](https://github.com/googleapis/java-storage/commit/ff6f696e8c4a539b5e6755fbd550096ee4688ecc))
+* Update sdk-platform-java dependencies ([#3046](https://github.com/googleapis/java-storage/issues/3046)) ([861f958](https://github.com/googleapis/java-storage/commit/861f9586e041f65061fb3da7f88955c4214d450c))
+* Update sdk-platform-java dependencies ([#3053](https://github.com/googleapis/java-storage/issues/3053)) ([921d1ba](https://github.com/googleapis/java-storage/commit/921d1ba0a547242c70cbb7dfb2cb190fa761398f))
+
 ## [2.50.0](https://github.com/googleapis/java-storage/compare/v2.49.0...v2.50.0) (2025-03-14)
 
 
diff --git a/README.md b/README.md
index 07a4ae7d..fe500ef9 100644
--- a/README.md
+++ b/README.md
@@ -66,13 +66,13 @@ implementation 'com.google.cloud:google-cloud-storage'
 If you are using Gradle without BOM, add this to your dependencies:
 
 ```Groovy
-implementation 'com.google.cloud:google-cloud-storage:2.50.0'
+implementation 'com.google.cloud:google-cloud-storage:2.51.0'
 ```
 
 If you are using SBT, add this to your dependencies:
 
 ```Scala
-libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.50.0"
+libraryDependencies += "com.google.cloud" % "google-cloud-storage" % "2.51.0"
 ```
 
 ## Authentication
@@ -515,7 +515,7 @@ Java is a registered trademark of Oracle and/or its affiliates.
 [kokoro-badge-link-5]: http://storage.googleapis.com/cloud-devrel-public/java/badges/java-storage/java11.html
 [stability-image]: https://img.shields.io/badge/stability-stable-green
 [maven-version-image]: https://img.shields.io/maven-central/v/com.google.cloud/google-cloud-storage.svg
-[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.50.0
+[maven-version-link]: https://central.sonatype.com/artifact/com.google.cloud/google-cloud-storage/2.51.0
 [authentication]: https://github.com/googleapis/google-cloud-java#authentication
 [auth-scopes]: https://developers.google.com/identity/protocols/oauth2/scopes
 [predefined-iam-roles]: https://cloud.google.com/iam/docs/understanding-roles#predefined_roles
diff --git a/gapic-google-cloud-storage-v2/pom.xml b/gapic-google-cloud-storage-v2/pom.xml
index 3b0bb674..7d03a1ed 100644
--- a/gapic-google-cloud-storage-v2/pom.xml
+++ b/gapic-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>gapic-google-cloud-storage-v2</artifactId>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
+  <version>2.51.0</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
   <name>gapic-google-cloud-storage-v2</name>
   <description>GRPC library for gapic-google-cloud-storage-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/google-cloud-storage-bom/pom.xml b/google-cloud-storage-bom/pom.xml
index 66cbf360..e24f841e 100644
--- a/google-cloud-storage-bom/pom.xml
+++ b/google-cloud-storage-bom/pom.xml
@@ -19,7 +19,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-bom</artifactId>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   <packaging>pom</packaging>
   <parent>
     <groupId>com.google.cloud</groupId>
@@ -69,37 +69,37 @@
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+        <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>gapic-google-cloud-storage-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:gapic-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage-control</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+        <version>2.51.0</version><!-- {x-version-update:google-cloud-storage-control:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-control-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-control-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
       </dependency>
     </dependencies>
   </dependencyManagement>
diff --git a/google-cloud-storage-control/pom.xml b/google-cloud-storage-control/pom.xml
index 9965c17b..f822b7c5 100644
--- a/google-cloud-storage-control/pom.xml
+++ b/google-cloud-storage-control/pom.xml
@@ -5,13 +5,13 @@
     <modelVersion>4.0.0</modelVersion>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-control</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage-control:current} -->
     <name>google-cloud-storage-control</name>
     <description>GRPC library for google-cloud-storage-control</description>
     <parent>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage-parent</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+        <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
     </parent>
 
     <dependencies>
diff --git a/google-cloud-storage/pom.xml b/google-cloud-storage/pom.xml
index 104bb18a..10899f0c 100644
--- a/google-cloud-storage/pom.xml
+++ b/google-cloud-storage/pom.xml
@@ -2,7 +2,7 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>google-cloud-storage</artifactId>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   <packaging>jar</packaging>
   <name>Google Cloud Storage</name>
   <url>https://github.com/googleapis/java-storage</url>
@@ -12,7 +12,7 @@
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <properties>
     <site.installationModule>google-cloud-storage</site.installationModule>
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java
index 606d0c6f..8a838604 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageImpl.java
@@ -203,7 +203,8 @@ final class GrpcStorageImpl extends BaseService<StorageOptions>
 
   @Override
   public void close() throws Exception {
-    try (StorageClient s = storageClient) {
+    try (StorageClient s = storageClient;
+        StorageDataClient ignore = storageDataClient) {
       s.shutdownNow();
       java.time.Duration terminationAwaitDuration = getOptions().getTerminationAwaitDuration();
       s.awaitTermination(terminationAwaitDuration.toMillis(), TimeUnit.MILLISECONDS);
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
index 93deda5e..7d116e16 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/GrpcStorageOptions.java
@@ -911,6 +911,7 @@ public final class GrpcStorageOptions extends StorageOptions
             StorageDataClient dataClient =
                 StorageDataClient.create(
                     executor,
+                    grpcStorageOptions.terminationAwaitDuration,
                     new ZeroCopyBidiStreamingCallable<>(
                         stub.bidiReadObjectCallable(), stub.bidiReadObjectResponseMarshaller),
                     retryContextProvider,
@@ -932,6 +933,7 @@ public final class GrpcStorageOptions extends StorageOptions
             StorageDataClient dataClient =
                 StorageDataClient.create(
                     executor,
+                    grpcStorageOptions.terminationAwaitDuration,
                     new ZeroCopyBidiStreamingCallable<>(
                         client.bidiReadObjectCallable(),
                         ResponseContentLifecycleManager.noopBidiReadObjectResponse()),
diff --git a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageDataClient.java b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageDataClient.java
index 2f84c048..19fa8b5c 100644
--- a/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageDataClient.java
+++ b/google-cloud-storage/src/main/java/com/google/cloud/storage/StorageDataClient.java
@@ -29,12 +29,15 @@ import com.google.cloud.storage.RetryContext.RetryContextProvider;
 import com.google.storage.v2.BidiReadObjectRequest;
 import com.google.storage.v2.BidiReadObjectResponse;
 import java.io.IOException;
+import java.time.Duration;
 import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 
 @InternalApi
-final class StorageDataClient implements IOAutoCloseable {
+final class StorageDataClient implements AutoCloseable {
 
   private final ScheduledExecutorService executor;
+  private final Duration terminationAwaitDuration;
   private final ZeroCopyBidiStreamingCallable<BidiReadObjectRequest, BidiReadObjectResponse>
       bidiReadObject;
   private final RetryContextProvider retryContextProvider;
@@ -42,10 +45,12 @@ final class StorageDataClient implements IOAutoCloseable {
 
   private StorageDataClient(
       ScheduledExecutorService executor,
+      Duration terminationAwaitDuration,
       ZeroCopyBidiStreamingCallable<BidiReadObjectRequest, BidiReadObjectResponse> bidiReadObject,
       RetryContextProvider retryContextProvider,
       IOAutoCloseable onClose) {
     this.executor = executor;
+    this.terminationAwaitDuration = terminationAwaitDuration;
     this.bidiReadObject = bidiReadObject;
     this.retryContextProvider = retryContextProvider;
     this.onClose = onClose;
@@ -112,11 +117,14 @@ final class StorageDataClient implements IOAutoCloseable {
     return objectReadSessionFuture;
   }
 
+  @SuppressWarnings("ResultOfMethodCallIgnored")
   @Override
-  public void close() throws IOException {
-    //noinspection EmptyTryBlock
+  public void close() throws Exception {
     try (IOAutoCloseable ignore = onClose) {
-      // intentional
+      // today, we own the executor service. If StorageDataClient is ever standalone, this code will
+      // need to be re-evaluated. Especially if a customer is able to provide the executor.
+      executor.shutdownNow();
+      executor.awaitTermination(terminationAwaitDuration.toNanos(), TimeUnit.NANOSECONDS);
     }
   }
 
@@ -127,10 +135,12 @@ final class StorageDataClient implements IOAutoCloseable {
 
   static StorageDataClient create(
       ScheduledExecutorService executor,
+      Duration terminationAwaitDuration,
       ZeroCopyBidiStreamingCallable<BidiReadObjectRequest, BidiReadObjectResponse> read,
       RetryContextProvider retryContextProvider,
       IOAutoCloseable onClose) {
-    return new StorageDataClient(executor, read, retryContextProvider, onClose);
+    return new StorageDataClient(
+        executor, terminationAwaitDuration, read, retryContextProvider, onClose);
   }
 
   @FunctionalInterface
diff --git a/grpc-google-cloud-storage-control-v2/pom.xml b/grpc-google-cloud-storage-control-v2/pom.xml
index ec19df68..1338cd5a 100644
--- a/grpc-google-cloud-storage-control-v2/pom.xml
+++ b/grpc-google-cloud-storage-control-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>grpc-google-cloud-storage-control-v2</artifactId>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
+  <version>2.51.0</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
   <name>grpc-google-cloud-storage-control-v2</name>
   <description>GRPC library for google-cloud-storage</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/grpc-google-cloud-storage-v2/pom.xml b/grpc-google-cloud-storage-v2/pom.xml
index a64745ae..05f8a6e1 100644
--- a/grpc-google-cloud-storage-v2/pom.xml
+++ b/grpc-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>grpc-google-cloud-storage-v2</artifactId>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+  <version>2.51.0</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
   <name>grpc-google-cloud-storage-v2</name>
   <description>GRPC library for grpc-google-cloud-storage-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/pom.xml b/pom.xml
index 198794fd..a6bb94ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <groupId>com.google.cloud</groupId>
   <artifactId>google-cloud-storage-parent</artifactId>
   <packaging>pom</packaging>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+  <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   <name>Storage Parent</name>
   <url>https://github.com/googleapis/java-storage</url>
   <description>
@@ -69,7 +69,7 @@
       <dependency>
         <groupId>org.junit</groupId>
         <artifactId>junit-bom</artifactId>
-        <version>5.12.1</version>
+        <version>5.12.2</version>
         <type>pom</type>
         <scope>import</scope>
       </dependency>
@@ -82,7 +82,7 @@
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+        <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.apis</groupId>
@@ -104,32 +104,32 @@
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>gapic-google-cloud-storage-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:grpc-google-cloud-storage-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>grpc-google-cloud-storage-control-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:grpc-google-cloud-storage-control-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.api.grpc</groupId>
         <artifactId>proto-google-cloud-storage-control-v2</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
+        <version>2.51.0</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.cloud</groupId>
         <artifactId>google-cloud-storage-control</artifactId>
-        <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+        <version>2.51.0</version><!-- {x-version-update:google-cloud-storage-control:current} -->
       </dependency>
       <dependency>
         <groupId>com.google.cloud</groupId>
diff --git a/proto-google-cloud-storage-control-v2/pom.xml b/proto-google-cloud-storage-control-v2/pom.xml
index b8ad86ee..e724124f 100644
--- a/proto-google-cloud-storage-control-v2/pom.xml
+++ b/proto-google-cloud-storage-control-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>proto-google-cloud-storage-control-v2</artifactId>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
+  <version>2.51.0</version><!-- {x-version-update:proto-google-cloud-storage-control-v2:current} -->
   <name>proto-google-cloud-storage-control-v2</name>
   <description>Proto library for  proto-google-cloud-storage-control-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/proto-google-cloud-storage-v2/pom.xml b/proto-google-cloud-storage-v2/pom.xml
index aafda7bb..80d4f0b1 100644
--- a/proto-google-cloud-storage-v2/pom.xml
+++ b/proto-google-cloud-storage-v2/pom.xml
@@ -4,13 +4,13 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.google.api.grpc</groupId>
   <artifactId>proto-google-cloud-storage-v2</artifactId>
-  <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
+  <version>2.51.0</version><!-- {x-version-update:proto-google-cloud-storage-v2:current} -->
   <name>proto-google-cloud-storage-v2</name>
   <description>PROTO library for proto-google-cloud-storage-v2</description>
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
   <dependencies>
     <dependency>
diff --git a/samples/snapshot/pom.xml b/samples/snapshot/pom.xml
index 63d9f535..d0821a5c 100644
--- a/samples/snapshot/pom.xml
+++ b/samples/snapshot/pom.xml
@@ -28,12 +28,12 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+      <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
     </dependency>
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage-control</artifactId>
-      <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage-control:current} -->
+      <version>2.51.0</version><!-- {x-version-update:google-cloud-storage-control:current} -->
       <scope>compile</scope>
     </dependency>
 
@@ -64,7 +64,7 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+      <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
       <classifier>tests</classifier>
       <scope>test</scope>
     </dependency>
diff --git a/storage-shared-benchmarking/pom.xml b/storage-shared-benchmarking/pom.xml
index f6b8684c..5d323904 100644
--- a/storage-shared-benchmarking/pom.xml
+++ b/storage-shared-benchmarking/pom.xml
@@ -10,7 +10,7 @@
   <parent>
     <groupId>com.google.cloud</groupId>
     <artifactId>google-cloud-storage-parent</artifactId>
-    <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+    <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
   </parent>
 
   <properties>
@@ -31,7 +31,7 @@
     <dependency>
       <groupId>com.google.cloud</groupId>
       <artifactId>google-cloud-storage</artifactId>
-      <version>2.50.1-SNAPSHOT</version><!-- {x-version-update:google-cloud-storage:current} -->
+      <version>2.51.0</version><!-- {x-version-update:google-cloud-storage:current} -->
       <classifier>tests</classifier>
     </dependency>
     <dependency>
diff --git a/versions.txt b/versions.txt
index ff2c7b7e..46e8e678 100644
--- a/versions.txt
+++ b/versions.txt
@@ -1,10 +1,10 @@
 # Format:
 # module:released-version:current-version
 
-google-cloud-storage:2.50.0:2.50.1-SNAPSHOT
-gapic-google-cloud-storage-v2:2.50.0:2.50.1-SNAPSHOT
-grpc-google-cloud-storage-v2:2.50.0:2.50.1-SNAPSHOT
-proto-google-cloud-storage-v2:2.50.0:2.50.1-SNAPSHOT
-google-cloud-storage-control:2.50.0:2.50.1-SNAPSHOT
-proto-google-cloud-storage-control-v2:2.50.0:2.50.1-SNAPSHOT
-grpc-google-cloud-storage-control-v2:2.50.0:2.50.1-SNAPSHOT
+google-cloud-storage:2.51.0:2.51.0
+gapic-google-cloud-storage-v2:2.51.0:2.51.0
+grpc-google-cloud-storage-v2:2.51.0:2.51.0
+proto-google-cloud-storage-v2:2.51.0:2.51.0
+google-cloud-storage-control:2.51.0:2.51.0
+proto-google-cloud-storage-control-v2:2.51.0:2.51.0
+grpc-google-cloud-storage-control-v2:2.51.0:2.51.0


Test patch:
diff --git a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageDataClientTest.java b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageDataClientTest.java
index c3011200..c3ec75fd 100644
--- a/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageDataClientTest.java
+++ b/google-cloud-storage/src/test/java/com/google/cloud/storage/StorageDataClientTest.java
@@ -16,20 +16,31 @@
 
 package com.google.cloud.storage;
 
+import static com.google.common.truth.Truth.assertThat;
 import static org.junit.Assert.assertThrows;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 import com.google.api.gax.grpc.GrpcCallContext;
 import com.google.storage.v2.BidiReadObjectRequest;
 import com.google.storage.v2.ReadRange;
-import java.io.IOException;
+import java.time.Duration;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
+@RunWith(MockitoJUnitRunner.class)
 public final class StorageDataClientTest {
 
+  @Mock public ScheduledExecutorService exec;
+
   @Test
-  public void readSession_requestWithRangeRead_noAllowed() throws IOException {
+  public void readSession_requestWithRangeRead_noAllowed() throws Exception {
     try (StorageDataClient dc =
-        StorageDataClient.create(null, null, null, IOAutoCloseable.noOp())) {
+        StorageDataClient.create(exec, Duration.ofSeconds(2), null, null, IOAutoCloseable.noOp())) {
       assertThrows(
           IllegalArgumentException.class,
           () -> {
@@ -41,4 +52,15 @@ public final class StorageDataClientTest {
           });
     }
   }
+
+  @Test
+  public void executorServiceProvidedShouldBeClosed() throws Exception {
+    assertThat(exec).isNotNull();
+    StorageDataClient sdc =
+        StorageDataClient.create(exec, Duration.ofSeconds(2), null, null, IOAutoCloseable.noOp());
+
+    sdc.close();
+    verify(exec, times(1)).shutdownNow();
+    verify(exec, times(1)).awaitTermination(TimeUnit.SECONDS.toNanos(2), TimeUnit.NANOSECONDS);
+  }
 }