From 2a4323e9a3a8ad66cf0dcd62360b990d81dfbc9d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 3 Jun 2026 18:18:59 +0000 Subject: [PATCH 01/14] ci: add JDK 26 testing support Add JDK 26 to build matrices in GitHub Actions workflows. Update Bazel integration tests in sdk-platform-java to run on JDK 25 and 26 with Security Manager override. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- .github/workflows/ci.yaml | 4 ++-- .github/workflows/google-auth-library-java-ci.yaml | 2 +- .github/workflows/java-bigquery-jdbc-ci.yaml | 2 +- .github/workflows/java-bigtable-ci.yaml | 2 +- .github/workflows/java-firestore-ci.yaml | 2 +- .github/workflows/java-pubsub-ci.yaml | 2 +- .github/workflows/java-spanner-jdbc-ci.yaml | 2 +- .github/workflows/java-storage-nio-ci.yaml | 2 +- .github/workflows/sdk-platform-java-ci.yaml | 13 +++++++++---- .github/workflows/showcase.yaml | 2 +- 10 files changed, 19 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0427c3e876a5..e50686c059fa 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -59,7 +59,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - name: Get current week within the year id: date @@ -226,7 +226,7 @@ jobs: fail-fast: false matrix: package: ${{ fromJSON(needs.changes.outputs.packages) }} - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - name: Get current week within the year id: date diff --git a/.github/workflows/google-auth-library-java-ci.yaml b/.github/workflows/google-auth-library-java-ci.yaml index 21373cd62925..e12979f75787 100644 --- a/.github/workflows/google-auth-library-java-ci.yaml +++ b/.github/workflows/google-auth-library-java-ci.yaml @@ -42,7 +42,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-bigquery-jdbc-ci.yaml b/.github/workflows/java-bigquery-jdbc-ci.yaml index 2883253a7529..a2d49580d537 100644 --- a/.github/workflows/java-bigquery-jdbc-ci.yaml +++ b/.github/workflows/java-bigquery-jdbc-ci.yaml @@ -49,7 +49,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-bigtable-ci.yaml b/.github/workflows/java-bigtable-ci.yaml index c0328b1435ce..b935cf9eed1b 100644 --- a/.github/workflows/java-bigtable-ci.yaml +++ b/.github/workflows/java-bigtable-ci.yaml @@ -41,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-firestore-ci.yaml b/.github/workflows/java-firestore-ci.yaml index 3118df474f58..f4fac240ee4e 100644 --- a/.github/workflows/java-firestore-ci.yaml +++ b/.github/workflows/java-firestore-ci.yaml @@ -41,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-pubsub-ci.yaml b/.github/workflows/java-pubsub-ci.yaml index c4723c36b6f0..f0e9d4f05b80 100644 --- a/.github/workflows/java-pubsub-ci.yaml +++ b/.github/workflows/java-pubsub-ci.yaml @@ -41,7 +41,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-spanner-jdbc-ci.yaml b/.github/workflows/java-spanner-jdbc-ci.yaml index 4cbb5184193a..f3da655c477b 100644 --- a/.github/workflows/java-spanner-jdbc-ci.yaml +++ b/.github/workflows/java-spanner-jdbc-ci.yaml @@ -47,7 +47,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/java-storage-nio-ci.yaml b/.github/workflows/java-storage-nio-ci.yaml index efddd8ac27fd..c7be8db2a222 100644 --- a/.github/workflows/java-storage-nio-ci.yaml +++ b/.github/workflows/java-storage-nio-ci.yaml @@ -47,7 +47,7 @@ jobs: strategy: fail-fast: false matrix: - java: [11, 17, 21, 25] + java: [11, 17, 21, 25, 26] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 diff --git a/.github/workflows/sdk-platform-java-ci.yaml b/.github/workflows/sdk-platform-java-ci.yaml index 2ec5c3b86c9c..8d4e0f306f2d 100644 --- a/.github/workflows/sdk-platform-java-ci.yaml +++ b/.github/workflows/sdk-platform-java-ci.yaml @@ -26,7 +26,7 @@ jobs: name: sdk-platform-java units strategy: matrix: - java: [ 11, 17, 21, 25 ] + java: [ 11, 17, 21, 25, 26 ] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 @@ -164,16 +164,21 @@ jobs: run: | bazelisk --batch test //sdk-platform-java/test/integration/... --test_output=errors - bazel-25: + # JDK 24+ permanently disables Security Manager. Bazel's default test runner tries to install it. + # We must explicitly disable this behavior using shouldInstallTestSecurityManager=false. + bazel-no-security-manager-jdk24-plus: needs: filter if: ${{ needs.filter.outputs.library == 'true' }} runs-on: ubuntu-22.04 - name: sdk-platform-java integration (25) + name: sdk-platform-java integration (JDK 24+) + strategy: + matrix: + java: [ 25, 26 ] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 with: - java-version: 25 + java-version: ${{ matrix.java }} distribution: temurin cache: maven - run: bazelisk version diff --git a/.github/workflows/showcase.yaml b/.github/workflows/showcase.yaml index 6548576f0ca3..bb9901619966 100644 --- a/.github/workflows/showcase.yaml +++ b/.github/workflows/showcase.yaml @@ -101,7 +101,7 @@ jobs: runs-on: ubuntu-22.04 strategy: matrix: - java: [ 11, 17, 21, 25 ] + java: [ 11, 17, 21, 25, 26 ] steps: - uses: actions/checkout@v4 - uses: actions/setup-java@v4 From a3db716a7f8a72b40ad73ccd38b688c2ccd2fae8 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Wed, 3 Jun 2026 23:00:53 +0000 Subject: [PATCH 02/14] build: bump Error Prone to 2.45.0 for Bigtable and Datastore Bump Error Prone version to 2.45.0 to support compilation on JDK 26. This resolves compilation failures due to internal javac API changes in JDK 26. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- java-bigtable/pom.xml | 2 +- java-datastore/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java-bigtable/pom.xml b/java-bigtable/pom.xml index ae0380184c5b..8035a975b086 100644 --- a/java-bigtable/pom.xml +++ b/java-bigtable/pom.xml @@ -146,7 +146,7 @@ https://googleapis.dev/java/google-api-grpc/latest - 2.38.0 + 2.45.0 diff --git a/java-datastore/pom.xml b/java-datastore/pom.xml index d04f36287dd3..dee3e3cfc13b 100644 --- a/java-datastore/pom.xml +++ b/java-datastore/pom.xml @@ -147,7 +147,7 @@ - 2.42.0 + 2.45.0 From 64d77ee775d6509f4d06bb864b42b6416407bafb Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Jun 2026 01:12:37 +0000 Subject: [PATCH 03/14] build: inherit Error Prone version from pom-parent Define error-prone.version as 2.48.0 in google-cloud-pom-parent, matching the version in gapic-generator-java-pom-parent. Remove local overrides from java-bigtable and java-datastore so they inherit the version from the parent. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- google-cloud-pom-parent/pom.xml | 1 + java-bigtable/pom.xml | 2 -- java-datastore/pom.xml | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/google-cloud-pom-parent/pom.xml b/google-cloud-pom-parent/pom.xml index cb457f59b031..b08c1d0252c1 100644 --- a/google-cloud-pom-parent/pom.xml +++ b/google-cloud-pom-parent/pom.xml @@ -22,6 +22,7 @@ false java.header + 2.48.0 diff --git a/java-bigtable/pom.xml b/java-bigtable/pom.xml index 8035a975b086..cb30d98a3c3c 100644 --- a/java-bigtable/pom.xml +++ b/java-bigtable/pom.xml @@ -145,8 +145,6 @@ google-cloud-bigtable-parent https://googleapis.dev/java/google-api-grpc/latest - - 2.45.0 diff --git a/java-datastore/pom.xml b/java-datastore/pom.xml index dee3e3cfc13b..8457c232daaa 100644 --- a/java-datastore/pom.xml +++ b/java-datastore/pom.xml @@ -146,8 +146,6 @@ https://googleapis.dev/java/google-api-grpc/latest - - 2.45.0 From 5f3238c8bd834a585a96168a17a4b9d667f3d2ed Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Jun 2026 01:40:38 +0000 Subject: [PATCH 04/14] build(config): update Error Prone references in Bigtable and Datastore Update Error Prone references in java-bigtable and java-datastore to use the version and arguments defined in google-cloud-pom-parent. This resolves compilation issues on JDK 26 while maintaining compatibility with older JDK versions via profiles in the parent POM. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- google-cloud-pom-parent/pom.xml | 23 ++++++++++++++++++- java-bigtable/google-cloud-bigtable/pom.xml | 3 ++- .../datastore-v1-proto-client/pom.xml | 3 ++- .../google-cloud-datastore-utils/pom.xml | 3 ++- java-datastore/google-cloud-datastore/pom.xml | 3 ++- 5 files changed, 30 insertions(+), 5 deletions(-) diff --git a/google-cloud-pom-parent/pom.xml b/google-cloud-pom-parent/pom.xml index b08c1d0252c1..1e36c5fa66fa 100644 --- a/google-cloud-pom-parent/pom.xml +++ b/google-cloud-pom-parent/pom.xml @@ -22,7 +22,8 @@ false java.header - 2.48.0 + 2.48.0 + -XDaddTypeAnnotationsToSymbol=true @@ -130,6 +131,26 @@ + + jdk-old + + [1.8,17) + + + 2.38.0 + -g + + + + jdk-mid + + [17,21) + + + 2.42.0 + -g + + diff --git a/java-bigtable/google-cloud-bigtable/pom.xml b/java-bigtable/google-cloud-bigtable/pom.xml index 2cb4374110cc..d427c7753249 100644 --- a/java-bigtable/google-cloud-bigtable/pom.xml +++ b/java-bigtable/google-cloud-bigtable/pom.xml @@ -440,6 +440,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepDisableWarningsInGeneratedCode -Xep:MissingSummary:OFF -Xep:InlineMeSuggester:OFF -Xep:AutoValueImmutableFields:OFF -Xep:ObjectEqualsForPrimitives:OFF -Xep:JavaDurationGetSecondsToToSeconds:OFF + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -456,7 +457,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} diff --git a/java-datastore/datastore-v1-proto-client/pom.xml b/java-datastore/datastore-v1-proto-client/pom.xml index 6b3920527075..627790393985 100644 --- a/java-datastore/datastore-v1-proto-client/pom.xml +++ b/java-datastore/datastore-v1-proto-client/pom.xml @@ -146,6 +146,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -163,7 +164,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} diff --git a/java-datastore/google-cloud-datastore-utils/pom.xml b/java-datastore/google-cloud-datastore-utils/pom.xml index 3b9c94c5c1ba..90d8f0a84a3b 100644 --- a/java-datastore/google-cloud-datastore-utils/pom.xml +++ b/java-datastore/google-cloud-datastore-utils/pom.xml @@ -123,6 +123,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -140,7 +141,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} diff --git a/java-datastore/google-cloud-datastore/pom.xml b/java-datastore/google-cloud-datastore/pom.xml index df87d2aa749c..a3715b6f1948 100644 --- a/java-datastore/google-cloud-datastore/pom.xml +++ b/java-datastore/google-cloud-datastore/pom.xml @@ -291,6 +291,7 @@ -XDcompilePolicy=simple --should-stop=ifError=FLOW -Xplugin:ErrorProne -XepExcludedPaths:.*/generated-sources/.* + ${errorprone.javac.args} -J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED -J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED @@ -308,7 +309,7 @@ com.google.errorprone error_prone_core - ${error-prone.version} + ${errorprone.version} From e5e8cd5778c0c63cf5876fdf08f987348c6dadd6 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Jun 2026 02:10:43 +0000 Subject: [PATCH 05/14] fix: resolve NullArgumentForNonNullParameter Error Prone errors Fix compilation errors triggered by the new Error Prone version. - Update DatastoreHelper to avoid Iterators.getNext(..., null). - Update Bigtable tests to use isNull() instead of isEqualTo(null). - Update Bigtable tests to use lambda instead of Suppliers.ofInstance(null). - Suppress NullArgumentForNonNullParameter for SettableFuture set(null) calls. - Rewrite VRpcResultSubject to avoid passing null to Truth's that() directly. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- .../bigtable/admin/v2/models/ClusterTest.java | 2 +- .../v2/internal/csm/attributes/EnvInfoTest.java | 2 +- .../internal/csm/opencensus/MetricsTracerTest.java | 2 +- .../internal/test_helpers/VRpcResultSubject.java | 14 +++++++------- .../v2/stub/EnhancedBigtableStubCloseTest.java | 2 ++ .../data/v2/stub/EnhancedBigtableStubTest.java | 4 ++-- .../reframing/ReframingResponseObserverTest.java | 2 +- .../google/cloud/datastore/DatastoreHelper.java | 7 ++++--- 8 files changed, 19 insertions(+), 16 deletions(-) diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java index f2f217ab56b5..f7c7bb43cb46 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/admin/v2/models/ClusterTest.java @@ -47,7 +47,7 @@ public void testFromProto() { assertThat(result.getState()).isEqualTo(Cluster.State.READY); assertThat(result.getServeNodes()).isEqualTo(30); assertThat(result.getStorageType()).isEqualTo(StorageType.SSD); - assertThat(result.getKmsKeyName()).isEqualTo(null); + assertThat(result.getKmsKeyName()).isNull(); } @Test diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java index 55df4aee7f82..b31570e60839 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java @@ -33,7 +33,7 @@ @ExtendWith(MockitoExtension.class) class EnvInfoTest { - private static final Supplier NULL_HOST = Suppliers.ofInstance(null); + private static final Supplier NULL_HOST = () -> null; @SuppressWarnings("UnnecessaryLambda") private static final Function NULL_ENV = (ignored) -> null; diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java index 4472c433f713..e31e58d66423 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/opencensus/MetricsTracerTest.java @@ -218,7 +218,7 @@ public void testReadRowsOpCount() throws InterruptedException { } @Test - @SuppressWarnings("FutureReturnValueIgnored") + @SuppressWarnings({"FutureReturnValueIgnored", "NullArgumentForNonNullParameter"}) public void testReadRowsFirstRow() throws InterruptedException { final long beforeSleep = 50; final long afterSleep = 50; diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java index 28b741e09548..c84b6d5b4f67 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java @@ -23,7 +23,6 @@ import com.google.common.truth.Subject; import com.google.rpc.RetryInfo; import java.time.Duration; -import java.util.Optional; import javax.annotation.Nullable; public final class VRpcResultSubject extends Subject { @@ -47,12 +46,13 @@ public void hasRetryInfo() { } public ComparableSubject retryInfoDelay() { - return check("retryInfo.delay") - .that( - Optional.ofNullable(actual.getRetryInfo()) - .map(RetryInfo::getRetryDelay) - .map(d -> Duration.ofSeconds(d.getSeconds()).plus(Duration.ofNanos(d.getNanos()))) - .orElse(null)); + RetryInfo retryInfo = actual.getRetryInfo(); + Duration delay = null; + if (retryInfo != null) { + com.google.protobuf.Duration d = retryInfo.getRetryDelay(); + delay = Duration.ofSeconds(d.getSeconds()).plus(Duration.ofNanos(d.getNanos())); + } + return check("retryInfo.delay").that(delay); } public ComparableSubject backendLatency() { diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java index 74d05e37fea2..5ab809f31b41 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubCloseTest.java @@ -81,6 +81,7 @@ public void tearDown() throws Exception { } @Test + @SuppressWarnings("NullArgumentForNonNullParameter") public void outstandingRequestsFinishAfterClose() throws Exception { ApiFuture> resultFuture = stub.readRowsCallable().all().futureCall(Query.create(TableId.of("table1"))); @@ -99,6 +100,7 @@ public void outstandingRequestsFinishAfterClose() throws Exception { class FakeBigtable extends BigtableGrpc.BigtableImplBase { @Override + @SuppressWarnings("NullArgumentForNonNullParameter") public void readRows( ReadRowsRequest request, StreamObserver responseObserver) { diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java index a21eb3d707be..c594ce86091c 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java @@ -385,7 +385,7 @@ public void testMutateRowRequestResponseConversion() MutateRowRequest protoReq = fakeDataService.mutateRowRequests.poll(1, TimeUnit.SECONDS); assertThat(protoReq) .isEqualTo(req.toProto(RequestContext.create(PROJECT_ID, INSTANCE_ID, APP_PROFILE_ID))); - assertThat(f.get()).isEqualTo(null); + assertThat(f.get()).isNull(); } @Test @@ -407,7 +407,7 @@ public void testMutateRowRequestParams() throws ExecutionException, InterruptedE // StatsHeadersUnaryCallable assertThat(reqMetadata.keys()).contains("bigtable-client-attempt-epoch-usec"); - assertThat(f.get()).isEqualTo(null); + assertThat(f.get()).isNull(); } @Test diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java index 6adc71cae0c0..576dd919448b 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/gaxx/reframing/ReframingResponseObserverTest.java @@ -185,7 +185,7 @@ public void testManyToOne() throws InterruptedException { // First downstream request makes the upstream over produce outerObserver.getController().request(1); Truth.assertThat(outerObserver.popNextResponse()).isEqualTo("a"); - Truth.assertThat(outerObserver.popNextResponse()).isEqualTo(null); + Truth.assertThat(outerObserver.popNextResponse()).isNull(); Truth.assertThat(outerObserver.isDone()).isFalse(); // Next downstream request should fetch from buffer diff --git a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java index 33e90a66e802..7c0d73f0f8df 100644 --- a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java +++ b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java @@ -16,7 +16,6 @@ package com.google.cloud.datastore; -import com.google.common.collect.Iterators; import com.google.common.collect.Maps; import java.util.ArrayList; import java.util.Arrays; @@ -38,11 +37,13 @@ static Key allocateId(Datastore service, IncompleteKey key) { } static Entity get(Transaction reader, Key key) { - return Iterators.getNext(reader.get(new Key[] {key}), null); + Iterator limit = reader.get(new Key[] {key}); + return limit.hasNext() ? limit.next() : null; } static Entity get(Datastore reader, Key key, ReadOption... options) { - return Iterators.getNext(reader.get(Collections.singletonList(key), options), null); + Iterator limit = reader.get(Collections.singletonList(key), options); + return limit.hasNext() ? limit.next() : null; } static Entity add(DatastoreWriter writer, FullEntity entity) { From 7f33b68e0fcb20bbc8706ba8b928d35ab04ade31 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Jun 2026 02:20:43 +0000 Subject: [PATCH 06/14] refactor(config): clarify POM profiles and fix test formatting - Rename profiles in google-cloud-pom-parent for clarity: - jdk-old -> errorprone-jdk11 - jdk-mid -> errorprone-jdk17 - Add comments explaining Error Prone downgrades and compiler flags. - Reformat EnvInfoTest.java to comply with style guide. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- google-cloud-pom-parent/pom.xml | 14 ++++++++++++-- .../v2/internal/csm/attributes/EnvInfoTest.java | 1 - 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/google-cloud-pom-parent/pom.xml b/google-cloud-pom-parent/pom.xml index 1e36c5fa66fa..9724cd0ac839 100644 --- a/google-cloud-pom-parent/pom.xml +++ b/google-cloud-pom-parent/pom.xml @@ -23,6 +23,8 @@ false java.header 2.48.0 + -XDaddTypeAnnotationsToSymbol=true @@ -132,7 +134,11 @@ - jdk-old + + errorprone-jdk11 [1.8,17) @@ -142,7 +148,11 @@ - jdk-mid + + errorprone-jdk17 [17,21) diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java index b31570e60839..4c81aeb09396 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/csm/attributes/EnvInfoTest.java @@ -23,7 +23,6 @@ import com.google.cloud.opentelemetry.detection.GCPPlatformDetector.SupportedPlatform; import com.google.common.base.Function; import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; import com.google.common.collect.ImmutableMap; import java.util.Map; import org.junit.jupiter.api.Test; From b611b537304e40daa3654e358669d68af21aab6b Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Jun 2026 14:52:52 +0000 Subject: [PATCH 07/14] test(bigtable): remove redundant null assertions on Void futures Remove tautological assertThat(f.get()).isNull() assertions on ApiFuture instances where f.get() normal completion is already evaluated lines earlier. This cleanly resolves Error Prone NullArgumentForNonNullParameter warnings without adding @SuppressWarnings annotations. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- .../cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java index c594ce86091c..513a7e725e9c 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java @@ -385,7 +385,6 @@ public void testMutateRowRequestResponseConversion() MutateRowRequest protoReq = fakeDataService.mutateRowRequests.poll(1, TimeUnit.SECONDS); assertThat(protoReq) .isEqualTo(req.toProto(RequestContext.create(PROJECT_ID, INSTANCE_ID, APP_PROFILE_ID))); - assertThat(f.get()).isNull(); } @Test @@ -406,8 +405,6 @@ public void testMutateRowRequestParams() throws ExecutionException, InterruptedE // StatsHeadersUnaryCallable assertThat(reqMetadata.keys()).contains("bigtable-client-attempt-epoch-usec"); - - assertThat(f.get()).isNull(); } @Test From e30aaf9de1247e89822bd901ac698d25992c5d5e Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Jun 2026 21:30:39 +0000 Subject: [PATCH 08/14] refactor(datastore): rename limit iterator to results for clarity Rename Iterator temporary variable in DatastoreHelper.get() from misleading "limit" to "results" based on PR review feedback. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- .../java/com/google/cloud/datastore/DatastoreHelper.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java index 7c0d73f0f8df..fd99328b7c89 100644 --- a/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java +++ b/java-datastore/google-cloud-datastore/src/main/java/com/google/cloud/datastore/DatastoreHelper.java @@ -37,13 +37,13 @@ static Key allocateId(Datastore service, IncompleteKey key) { } static Entity get(Transaction reader, Key key) { - Iterator limit = reader.get(new Key[] {key}); - return limit.hasNext() ? limit.next() : null; + Iterator results = reader.get(new Key[] {key}); + return results.hasNext() ? results.next() : null; } static Entity get(Datastore reader, Key key, ReadOption... options) { - Iterator limit = reader.get(Collections.singletonList(key), options); - return limit.hasNext() ? limit.next() : null; + Iterator results = reader.get(Collections.singletonList(key), options); + return results.hasNext() ? results.next() : null; } static Entity add(DatastoreWriter writer, FullEntity entity) { From 3612c3d17a24c1ae589f30f958f28eacf83779b4 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Thu, 4 Jun 2026 21:39:43 +0000 Subject: [PATCH 09/14] test(bigtable): restore f.get() verification and suppress warnings Restore assertThat(f.get()).isNull() assertions in EnhancedBigtableStubTest based on PR review feedback to explicitly document asynchronous future completion. Add @SuppressWarnings("NullArgumentForNonNullParameter") annotations to resolve Error Prone warnings triggered by Truth.assertThat() receiving an ApiFuture result. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- .../bigtable/data/v2/stub/EnhancedBigtableStubTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java index 513a7e725e9c..f20ad1a3e5fd 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/stub/EnhancedBigtableStubTest.java @@ -371,6 +371,7 @@ public void testRMWRequestResponseConversion() throws ExecutionException, Interr } @Test + @SuppressWarnings("NullArgumentForNonNullParameter") public void testMutateRowRequestResponseConversion() throws ExecutionException, InterruptedException { RowMutation req = RowMutation.create(TableId.of("my-table"), "my-key").deleteRow(); @@ -385,9 +386,11 @@ public void testMutateRowRequestResponseConversion() MutateRowRequest protoReq = fakeDataService.mutateRowRequests.poll(1, TimeUnit.SECONDS); assertThat(protoReq) .isEqualTo(req.toProto(RequestContext.create(PROJECT_ID, INSTANCE_ID, APP_PROFILE_ID))); + assertThat(f.get()).isNull(); } @Test + @SuppressWarnings("NullArgumentForNonNullParameter") public void testMutateRowRequestParams() throws ExecutionException, InterruptedException { RowMutation req = RowMutation.create(TABLE_ID, "my-key").deleteRow(); @@ -405,6 +408,8 @@ public void testMutateRowRequestParams() throws ExecutionException, InterruptedE // StatsHeadersUnaryCallable assertThat(reqMetadata.keys()).contains("bigtable-client-attempt-epoch-usec"); + + assertThat(f.get()).isNull(); } @Test From 67ee83c5cee51c5d627a4eba35f9f0cf686fb38d Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 5 Jun 2026 15:56:50 +0000 Subject: [PATCH 10/14] refactor(config): modernize Error Prone POM profiles and compiler flags - Drop legacy Error Prone downgrade profiles (errorprone-jdk11, errorprone-jdk17) as Error Prone 2.43.0+ requires JDK 21+ execution. - Scope `-XDaddTypeAnnotationsToSymbol=true` strictly to JDK 21 execution via dedicated `errorprone-jdk21` profile, setting default javac arg to benign `-g`. On JDK 22+ (including 25 and 26), the Javac fix is enabled by default. Ref: https://github.com/google/error-prone/issues/5426 BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- google-cloud-pom-parent/pom.xml | 34 +++++++++------------------------ 1 file changed, 9 insertions(+), 25 deletions(-) diff --git a/google-cloud-pom-parent/pom.xml b/google-cloud-pom-parent/pom.xml index c1e2011e202e..210357dc782e 100644 --- a/google-cloud-pom-parent/pom.xml +++ b/google-cloud-pom-parent/pom.xml @@ -23,9 +23,9 @@ false java.header 2.48.0 - - -XDaddTypeAnnotationsToSymbol=true + + -g @@ -134,31 +134,15 @@ - - errorprone-jdk11 + + errorprone-jdk21 - [1.8,17) + 21 - 2.38.0 - -g - - - - - errorprone-jdk17 - - [17,21) - - - 2.42.0 - -g + -XDaddTypeAnnotationsToSymbol=true From e76d5bf936923e5e629bd271fa2b4257a666bc22 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 5 Jun 2026 15:58:37 +0000 Subject: [PATCH 11/14] refactor(config): restore legacy Error Prone versions for JDK 8+ support Restore downgrade profiles (`errorprone-jdk11`, `errorprone-jdk17`) in parent POM to ensure builds executed on older Javac compilers (JDK 8, 11, 17) use compatible Error Prone versions (`2.38.0`, `2.42.0`). BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- google-cloud-pom-parent/pom.xml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/google-cloud-pom-parent/pom.xml b/google-cloud-pom-parent/pom.xml index 210357dc782e..83da86c0ebd4 100644 --- a/google-cloud-pom-parent/pom.xml +++ b/google-cloud-pom-parent/pom.xml @@ -133,6 +133,28 @@ + + + errorprone-jdk11 + + [1.8,17) + + + 2.38.0 + -g + + + + + errorprone-jdk17 + + [17,21) + + + 2.42.0 + -g + + + errorprone-jdk11 [1.8,17) @@ -145,7 +147,8 @@ - + errorprone-jdk17 [17,21) @@ -156,9 +159,13 @@ - + errorprone-jdk21 21 From b0a0fce41cea3d499ae6c10f224fd075b9e88fdd Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 5 Jun 2026 16:10:44 +0000 Subject: [PATCH 13/14] chore(datastore): remove obsolete Error Prone management comment Remove outdated comment referencing unmanaged Error Prone Core synchronization in `java-datastore/pom.xml`, as the version is now centrally managed by the top-level parent POM. Ref: https://github.com/googleapis/java-datastore/issues/1889 BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- java-datastore/pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/java-datastore/pom.xml b/java-datastore/pom.xml index 1e0dcf099145..2ceaf50a1ca7 100644 --- a/java-datastore/pom.xml +++ b/java-datastore/pom.xml @@ -144,8 +144,6 @@ github google-cloud-datastore-parent https://googleapis.dev/java/google-api-grpc/latest - - From 1304132874efbfa3e71d9eb86493d42adaaeffd0 Mon Sep 17 00:00:00 2001 From: Lawrence Qiu Date: Fri, 5 Jun 2026 16:25:43 +0000 Subject: [PATCH 14/14] refactor(bigtable): eliminate fully qualified class name in VRpcResultSubject Inline `retryInfo.getRetryDelay()` calls within `retryInfoDelay()` subject assertion to avoid fully qualified `com.google.protobuf.Duration` class reference per PR review. BUG=b/481669998 TAG=agy CONV=7b193e4d-38f8-450c-8475-0b9ae0d04507 --- .../data/v2/internal/test_helpers/VRpcResultSubject.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java index c84b6d5b4f67..ba78793c5a6b 100644 --- a/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java +++ b/java-bigtable/google-cloud-bigtable/src/test/java/com/google/cloud/bigtable/data/v2/internal/test_helpers/VRpcResultSubject.java @@ -49,8 +49,9 @@ public ComparableSubject retryInfoDelay() { RetryInfo retryInfo = actual.getRetryInfo(); Duration delay = null; if (retryInfo != null) { - com.google.protobuf.Duration d = retryInfo.getRetryDelay(); - delay = Duration.ofSeconds(d.getSeconds()).plus(Duration.ofNanos(d.getNanos())); + delay = + Duration.ofSeconds(retryInfo.getRetryDelay().getSeconds()) + .plus(Duration.ofNanos(retryInfo.getRetryDelay().getNanos())); } return check("retryInfo.delay").that(delay); }