You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@beam.apache.org by vt...@apache.org on 2025/06/17 12:36:23 UTC

(beam) branch release-2.66 updated: Update spotbugs version, fix runner ubuntu version, fix found spotbugs issues (#35303)

This is an automated email from the ASF dual-hosted git repository.

vterentev pushed a commit to branch release-2.66
in repository https://gitbox.apache.org/repos/asf/beam.git


The following commit(s) were added to refs/heads/release-2.66 by this push:
     new 42fa28d4eaf Update spotbugs version, fix runner ubuntu version, fix found spotbugs issues (#35303)
42fa28d4eaf is described below

commit 42fa28d4eaf03ab7779c92a621cb422c72729191
Author: Vitaly Terentyev <vi...@gmail.com>
AuthorDate: Mon Jun 16 19:00:46 2025 +0400

    Update spotbugs version, fix runner ubuntu version, fix found spotbugs issues (#35303)
    
    (cherry picked from commit 2a499b6b24180adb022d810cd9bccf2f271fe514)
---
 .github/workflows/beam_PreCommit_Java_Solace_IO_Direct.yml          | 2 +-
 .../src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy  | 2 +-
 .../org/apache/beam/sdk/io/aws2/auth/GoogleADCIdTokenProvider.java  | 2 ++
 .../apache/beam/sdk/io/aws2/kinesis/GetKinesisRecordsResult.java    | 2 ++
 .../main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisIO.java    | 2 ++
 .../org/apache/beam/sdk/io/aws2/kinesis/KinesisPartitioner.java     | 4 ++--
 .../org/apache/beam/sdk/io/aws2/kinesis/ShardRecordsIterator.java   | 2 ++
 .../apache/beam/sdk/io/aws2/s3/S3ReadableSeekableByteChannel.java   | 2 ++
 .../java/org/apache/beam/sdk/io/aws2/s3/S3WritableByteChannel.java  | 2 ++
 .../src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsIO.java        | 2 ++
 .../java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java    | 4 +++-
 .../org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java    | 6 ++----
 .../java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java   | 2 ++
 .../main/java/org/apache/beam/sdk/io/pulsar/ReadFromPulsarDoFn.java | 2 ++
 14 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/.github/workflows/beam_PreCommit_Java_Solace_IO_Direct.yml b/.github/workflows/beam_PreCommit_Java_Solace_IO_Direct.yml
index 57d2af9492a..67c10560587 100644
--- a/.github/workflows/beam_PreCommit_Java_Solace_IO_Direct.yml
+++ b/.github/workflows/beam_PreCommit_Java_Solace_IO_Direct.yml
@@ -74,7 +74,7 @@ jobs:
       (github.event_name == 'schedule' && github.repository == 'apache/beam') ||
       github.event_name == 'workflow_dispatch' ||
       github.event.comment.body == 'Run Java_Solace_IO_Direct PreCommit'
-    runs-on: ubuntu-20.04
+    runs-on: ubuntu-latest
     steps:
     - uses: actions/checkout@v4
     - name: Setup repository
diff --git a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
index 7867c4895c4..bc6f4d2513c 100644
--- a/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
+++ b/buildSrc/src/main/groovy/org/apache/beam/gradle/BeamModulePlugin.groovy
@@ -647,7 +647,7 @@ class BeamModulePlugin implements Plugin<Project> {
     def solace_version = "10.21.0"
     def spark2_version = "2.4.8"
     def spark3_version = "3.5.0"
-    def spotbugs_version = "4.0.6"
+    def spotbugs_version = "4.8.3"
     def testcontainers_version = "1.19.7"
     // [bomupgrader] determined by: org.apache.arrow:arrow-memory-core, consistent with: google_cloud_platform_libraries_bom
     def arrow_version = "15.0.2"
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/auth/GoogleADCIdTokenProvider.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/auth/GoogleADCIdTokenProvider.java
index 5987523518e..32d1b4be1c4 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/auth/GoogleADCIdTokenProvider.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/auth/GoogleADCIdTokenProvider.java
@@ -17,6 +17,7 @@
  */
 package org.apache.beam.sdk.io.aws2.auth;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.util.Arrays;
 import org.apache.beam.vendor.grpc.v1p69p0.com.google.auth.oauth2.GoogleCredentials;
@@ -40,6 +41,7 @@ import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.annotations.Vi
  *   "durationSeconds": 3600
  * }}</pre>
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 public class GoogleADCIdTokenProvider implements WebIdTokenProvider {
   private final IdTokenProvider idTokenProvider;
 
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/GetKinesisRecordsResult.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/GetKinesisRecordsResult.java
index 8cf47ba2bdc..bbf68f02230 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/GetKinesisRecordsResult.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/GetKinesisRecordsResult.java
@@ -17,11 +17,13 @@
  */
 package org.apache.beam.sdk.io.aws2.kinesis;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.List;
 import java.util.stream.Collectors;
 import software.amazon.kinesis.retrieval.KinesisClientRecord;
 
 /** Represents the output of 'get' operation on Kinesis stream. */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 class GetKinesisRecordsResult {
 
   private final List<KinesisRecord> records;
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisIO.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisIO.java
index 6f06f4f7316..7302a5a4760 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisIO.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisIO.java
@@ -25,6 +25,7 @@ import static org.apache.commons.lang3.StringUtils.isEmpty;
 import static software.amazon.awssdk.services.kinesis.model.ShardFilterType.AT_LATEST;
 
 import com.google.auto.value.AutoValue;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.math.BigInteger;
 import java.security.MessageDigest;
@@ -326,6 +327,7 @@ import software.amazon.kinesis.common.InitialPositionInStream;
  * then opt to retry the current partition in entirety or abort if the max number of retries of the
  * runner is reached.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 public final class KinesisIO {
 
   /** Returns a new {@link Read} transform for reading from Kinesis. */
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisPartitioner.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisPartitioner.java
index eaf9b0b7607..a9b0dc4ecb3 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisPartitioner.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/KinesisPartitioner.java
@@ -19,7 +19,7 @@ package org.apache.beam.sdk.io.aws2.kinesis;
 
 import java.io.Serializable;
 import java.math.BigInteger;
-import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import org.apache.commons.lang3.StringUtils;
@@ -94,7 +94,7 @@ public interface KinesisPartitioner<T> extends Serializable {
       @Nonnull
       @Override
       public String getExplicitHashKey(T record) {
-        return hashKeys[new Random().nextInt(shards)];
+        return hashKeys[ThreadLocalRandom.current().nextInt(shards)];
       }
     };
   }
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/ShardRecordsIterator.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/ShardRecordsIterator.java
index 0a2964424a3..33b5c81b4af 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/ShardRecordsIterator.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/kinesis/ShardRecordsIterator.java
@@ -19,6 +19,7 @@ package org.apache.beam.sdk.io.aws2.kinesis;
 
 import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions.checkNotNull;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicReference;
@@ -34,6 +35,7 @@ import software.amazon.kinesis.common.InitialPositionInStream;
  * ShardRecordsIterator#readNextBatch()}. Client has to confirm processed records by calling {@link
  * ShardRecordsIterator#ackRecord(KinesisRecord)} method.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 class ShardRecordsIterator {
 
   private static final Logger LOG = LoggerFactory.getLogger(ShardRecordsIterator.class);
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3ReadableSeekableByteChannel.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3ReadableSeekableByteChannel.java
index bbfd9eb8755..3a798188568 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3ReadableSeekableByteChannel.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3ReadableSeekableByteChannel.java
@@ -21,6 +21,7 @@ import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Pr
 import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions.checkNotNull;
 import static software.amazon.awssdk.utils.IoUtils.drainInputStream;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -42,6 +43,7 @@ import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
 @SuppressWarnings({
   "nullness" // TODO(https://github.com/apache/beam/issues/20497)
 })
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 class S3ReadableSeekableByteChannel implements SeekableByteChannel {
   private static final long ABORT_THRESHOLD = 1024 * 8; // corresponds to default TCP buffer size
   private final S3Client s3Client;
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3WritableByteChannel.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3WritableByteChannel.java
index d0b331366aa..e93bdc6401e 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3WritableByteChannel.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/s3/S3WritableByteChannel.java
@@ -20,6 +20,7 @@ package org.apache.beam.sdk.io.aws2.s3;
 import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions.checkArgument;
 import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions.checkNotNull;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
@@ -47,6 +48,7 @@ import software.amazon.awssdk.services.s3.model.UploadPartResponse;
 @SuppressWarnings({
   "nullness" // TODO(https://github.com/apache/beam/issues/20497)
 })
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 class S3WritableByteChannel implements WritableByteChannel {
 
   private final S3Client s3Client;
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsIO.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsIO.java
index d8f797e0148..e1d4160e43e 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsIO.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsIO.java
@@ -25,6 +25,7 @@ import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Pr
 import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions.checkState;
 
 import com.google.auto.value.AutoValue;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -140,6 +141,7 @@ import software.amazon.awssdk.services.sqs.model.SendMessageRequest;
  * then opt to retry the current partition in entirety or abort if the max number of retries of the
  * runner is reached.
  */
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization safe.")
 public class SqsIO {
 
   public static Read read() {
diff --git a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java
index 595d71c074d..dd905088688 100644
--- a/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java
+++ b/sdks/java/io/amazon-web-services2/src/main/java/org/apache/beam/sdk/io/aws2/sqs/SqsUnboundedReader.java
@@ -32,6 +32,7 @@ import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.collect
 import static software.amazon.awssdk.services.sqs.model.MessageSystemAttributeName.SENT_TIMESTAMP;
 import static software.amazon.awssdk.services.sqs.model.QueueAttributeName.VISIBILITY_TIMEOUT;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.time.Clock;
 import java.util.ArrayDeque;
@@ -81,8 +82,9 @@ import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
 import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse;
 
 @SuppressWarnings({
-  "nullness" // TODO(https://github.com/apache/beam/issues/20497)
+  "nullness" // TODO(https://github.com/apache/beam/issues/20497),
 })
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 class SqsUnboundedReader extends UnboundedSource.UnboundedReader<SqsMessage> {
   private static final String RECEIPT_HANDLE_IS_INVALID = "ReceiptHandleIsInvalid";
 
diff --git a/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java b/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java
index d7dd4bca60b..b503db8b7d2 100644
--- a/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java
+++ b/sdks/java/io/hadoop-common/src/main/java/org/apache/beam/sdk/io/hadoop/SerializableConfiguration.java
@@ -25,6 +25,7 @@ import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Map;
+import java.util.Objects;
 import javax.annotation.concurrent.NotThreadSafe;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.mapreduce.Job;
@@ -56,10 +57,7 @@ public class SerializableConfiguration implements Externalizable {
   public SerializableConfiguration() {}
 
   public SerializableConfiguration(Configuration conf) {
-    if (conf == null) {
-      throw new NullPointerException("Configuration must not be null.");
-    }
-    this.conf = conf;
+    this.conf = Objects.requireNonNull(conf, "Configuration must not be null.");
   }
 
   public Configuration get() {
diff --git a/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java b/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java
index 0de5c754c70..e7ad13c97c0 100644
--- a/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java
+++ b/sdks/java/io/hadoop-format/src/main/java/org/apache/beam/sdk/io/hadoop/format/HadoopFormatIO.java
@@ -22,6 +22,7 @@ import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Pr
 import static org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.base.Preconditions.checkNotNull;
 
 import com.google.auto.value.AutoValue;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
@@ -313,6 +314,7 @@ import org.slf4j.LoggerFactory;
   "rawtypes", // TODO(https://github.com/apache/beam/issues/20447)
   "nullness" // TODO(https://github.com/apache/beam/issues/20497)
 })
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 public class HadoopFormatIO {
   private static final Logger LOG = LoggerFactory.getLogger(HadoopFormatIO.class);
 
diff --git a/sdks/java/io/pulsar/src/main/java/org/apache/beam/sdk/io/pulsar/ReadFromPulsarDoFn.java b/sdks/java/io/pulsar/src/main/java/org/apache/beam/sdk/io/pulsar/ReadFromPulsarDoFn.java
index a4e0a78e634..3d255ac9bae 100644
--- a/sdks/java/io/pulsar/src/main/java/org/apache/beam/sdk/io/pulsar/ReadFromPulsarDoFn.java
+++ b/sdks/java/io/pulsar/src/main/java/org/apache/beam/sdk/io/pulsar/ReadFromPulsarDoFn.java
@@ -17,6 +17,7 @@
  */
 package org.apache.beam.sdk.io.pulsar;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 import org.apache.beam.sdk.coders.Coder;
@@ -50,6 +51,7 @@ import org.slf4j.LoggerFactory;
  */
 @DoFn.UnboundedPerElement
 @SuppressWarnings({"rawtypes", "nullness"})
+@SuppressFBWarnings(value = "CT_CONSTRUCTOR_THROW", justification = "Initialization is safe.")
 public class ReadFromPulsarDoFn extends DoFn<PulsarSourceDescriptor, PulsarMessage> {
 
   private static final Logger LOG = LoggerFactory.getLogger(ReadFromPulsarDoFn.class);