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);