From 40df57d8179907dd8d6d137160afc6ed5623135f Mon Sep 17 00:00:00 2001 From: Maksym Tymoshyk Date: Tue, 1 Sep 2026 14:09:44 +0300 Subject: [PATCH] [Java] Remove MS_EXPOSE_REP from the global SpotBugs filter The global filter turns off MS_EXPOSE_REP for every module. That hides 34 findings today, and hides any new one automatically. Remove that line and mark the existing sites one by one with @SuppressFBWarnings, each carrying the reason it is exempt. Nothing changes at runtime. What changes is that the next accessor someone writes that returns a mutable static will fail spotbugsMain instead of passing quietly. The three Guava sites cannot be configured away. SpotBugs checks its list of known immutable types by fully qualified name, so it does not recognise Guava relocated into org.apache.beam.vendor.guava, and the fallback scan finds setter-named methods on ImmutableCollection. See https://github.com/spotbugs/spotbugs/issues/1601. Addresses #35312. --- .../beam/runners/spark/metrics/MetricsAccumulator.java | 5 +++++ .../structuredstreaming/metrics/MetricsAccumulator.java | 5 +++++ .../src/main/resources/beam/spotbugs-filter.xml | 1 - .../main/java/org/apache/beam/sdk/metrics/Lineage.java | 9 +++++++++ .../java/org/apache/beam/sdk/metrics/SourceMetrics.java | 9 +++++++++ .../apache/beam/sdk/util/construction/ModelCoders.java | 7 +++++++ .../sdk/util/construction/PTransformTranslation.java | 7 +++++++ .../java/org/apache/beam/sdk/io/thrift/ThriftSchema.java | 5 +++++ .../org/apache/beam/sdk/testutils/NamedTestResult.java | 7 +++++++ .../java/org/apache/beam/sdk/tpcds/TpcdsSchemas.java | 6 ++++++ 10 files changed, 60 insertions(+), 1 deletion(-) diff --git a/runners/spark/src/main/java/org/apache/beam/runners/spark/metrics/MetricsAccumulator.java b/runners/spark/src/main/java/org/apache/beam/runners/spark/metrics/MetricsAccumulator.java index dbdfe11a585c..612d71b1aea1 100644 --- a/runners/spark/src/main/java/org/apache/beam/runners/spark/metrics/MetricsAccumulator.java +++ b/runners/spark/src/main/java/org/apache/beam/runners/spark/metrics/MetricsAccumulator.java @@ -17,6 +17,7 @@ */ package org.apache.beam.runners.spark.metrics; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.IOException; import org.apache.beam.runners.core.metrics.MetricsContainerStepMap; import org.apache.beam.runners.spark.SparkPipelineOptions; @@ -82,6 +83,10 @@ public static void init(SparkPipelineOptions opts, JavaSparkContext jsc) { } } + @SuppressFBWarnings( + value = "MS_EXPOSE_REP", + justification = + "Spark merges only the accumulator instance the driver registered. A copy would collect metrics that nothing reports.") public static MetricsContainerStepMapAccumulator getInstance() { if (instance == null) { throw new IllegalStateException("Metrics accumulator has not been instantiated"); diff --git a/runners/spark/src/main/java/org/apache/beam/runners/spark/structuredstreaming/metrics/MetricsAccumulator.java b/runners/spark/src/main/java/org/apache/beam/runners/spark/structuredstreaming/metrics/MetricsAccumulator.java index 63407b9f14d8..e8cbd895082a 100644 --- a/runners/spark/src/main/java/org/apache/beam/runners/spark/structuredstreaming/metrics/MetricsAccumulator.java +++ b/runners/spark/src/main/java/org/apache/beam/runners/spark/structuredstreaming/metrics/MetricsAccumulator.java @@ -17,6 +17,7 @@ */ package org.apache.beam.runners.spark.structuredstreaming.metrics; +import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import org.apache.beam.runners.core.metrics.MetricsContainerStepMap; import org.apache.beam.vendor.guava.v32_1_2_jre.com.google.common.annotations.VisibleForTesting; import org.apache.spark.sql.SparkSession; @@ -85,6 +86,10 @@ public MetricsContainerStepMap value() { * Get the {@link MetricsAccumulator} on this driver. If there's no such accumulator yet, it will * be created and registered using the provided {@link SparkSession}. */ + @SuppressFBWarnings( + value = "MS_EXPOSE_REP", + justification = + "Spark merges only the accumulator instance the driver registered. A copy would collect metrics that nothing reports.") public static MetricsAccumulator getInstance(SparkSession session) { MetricsAccumulator current = instance; if (current != null) { diff --git a/sdks/java/build-tools/src/main/resources/beam/spotbugs-filter.xml b/sdks/java/build-tools/src/main/resources/beam/spotbugs-filter.xml index 4393ec6a624e..5f6f368228e5 100644 --- a/sdks/java/build-tools/src/main/resources/beam/spotbugs-filter.xml +++ b/sdks/java/build-tools/src/main/resources/beam/spotbugs-filter.xml @@ -57,7 +57,6 @@ -