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

adoroszlai pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new a9c9caff033 HDDS-16084. Add ErrorProne to CI (#11056)
a9c9caff033 is described below

commit a9c9caff0330814f6009ecc40b47bed2f445568f
Author: Ivan Andika <[email protected]>
AuthorDate: Sat Sep 19 14:47:05 2026 +0800

    HDDS-16084. Add ErrorProne to CI (#11056)
---
 .github/ci.md                                      |   1 +
 dev-support/ci/errorprone.bats                     | 101 +++++++++++++++++++++
 dev-support/ci/selective_ci_checks.bats            |  36 ++++----
 dev-support/ci/selective_ci_checks.sh              |  20 ++++
 .../scm/storage/TestBlockDataStreamOutput.java     |   2 +-
 .../ozone/client/io/TestECBlockInputStream.java    |   2 +-
 .../hadoop/hdds/conf/DelegatingProperties.java     |   2 +-
 .../balancer/ContainerBalancerConfiguration.java   |   1 +
 .../apache/hadoop/hdds/tracing/TracingUtil.java    |   4 +
 .../container/common/utils/ContainerCache.java     |   4 +-
 .../container/common/utils/ReferenceCountedDB.java |   2 +-
 .../SCMSecurityProtocolClientSideTranslatorPB.java |   5 +-
 .../SecretKeyProtocolClientSideTranslatorPB.java   |   2 +-
 .../apache/hadoop/hdds/scm/net/InnerNodeImpl.java  |   2 -
 ...lockLocationProtocolClientSideTranslatorPB.java |   2 +-
 .../certificate/client/SCMCertificateClient.java   |   2 +-
 .../exceptions/TestSCMExceptionResultCodes.java    |   3 +-
 .../TestSCMSecurityExceptionErrorCodes.java}       |  34 +++----
 .../org/apache/ozone/rocksdiff/CompactionDag.java  |   2 +-
 .../apache/ozone/rocksdiff/TestCompactionDag.java  |  19 ++++
 .../rocksdiff/TestRocksDBCheckpointDiffer.java     |  62 +++++--------
 .../apache/ozone/rocksdiff/TestRocksDiffUtils.java |  18 ++--
 .../replication/ReplicationManagerMetrics.java     |  37 ++++----
 .../hdds/scm/server/TestSCMContainerMetrics.java   |  21 ++---
 .../ozone/admin/om/GetServiceRolesSubcommand.java  |   8 +-
 .../java/org/apache/ozone/TestPrintableGraph.java  |  11 +--
 .../hadoop/ozone/client/io/ECKeyOutputStream.java  |   2 +-
 .../hadoop/ozone/om/helpers/OmRangerSyncArgs.java  |   3 -
 ...OzoneManagerProtocolClientSideTranslatorPB.java |   2 +-
 .../ozone/om/exceptions/TestResultCodes.java       |   2 +-
 ...doopRpcOMFollowerReadFailoverProxyProvider.java |   5 +-
 .../grpc/TestClientAddressClientInterceptor.java   |   1 +
 .../grpc/TestClientAddressServerInterceptor.java   |  14 ++-
 hadoop-ozone/dev-support/checks/bats.sh            |   1 +
 hadoop-ozone/dev-support/checks/errorprone.sh      |  53 +++++++++++
 .../fs/contract/AbstractContractSafeModeTest.java  |   2 +-
 .../java/org/apache/hadoop/fs/ozone/TestHSync.java |  22 +++--
 .../hadoop/hdds/scm/TestXceiverClientManager.java  |   4 +-
 .../ozone/client/rpc/TestECKeyOutputStream.java    |   2 +-
 .../commandhandler/TestBlockDeletion.java          |   4 +-
 .../hadoop/ozone/om/TestAddRemoveOzoneManager.java |   2 +-
 .../hadoop/ozone/om/TestObjectStoreWithFSO.java    |   2 +-
 .../TestSnapshotDirectoryCleaningService.java      |  15 +--
 .../tools/contract/AbstractContractDistCpTest.java |   2 +-
 .../hadoop/ozone/om/request/OMClientRequest.java   |   2 +-
 .../ozone/om/request/key/OMKeysDeleteRequest.java  |   2 +-
 .../ozone/om/snapshot/SnapshotDiffManager.java     |   7 +-
 .../hadoop/ozone/om/TestOMMetadataReader.java      |   1 +
 .../request/TestOMClientRequestWithUserInfo.java   |   1 +
 .../om/request/key/TestOMKeyCreateRequest.java     |  27 +++---
 .../key/TestOMKeyPurgeRequestAndResponse.java      |   2 -
 .../snapshot/TestOmSnapshotLocalDataManager.java   |   3 +-
 .../hadoop/ozone/recon/api/BucketEndpoint.java     |   1 -
 .../hadoop/ozone/recon/api/VolumeEndpoint.java     |   1 -
 .../ozone/recon/scm/ReconContainerManager.java     |   8 +-
 .../impl/ReconContainerMetadataManagerImpl.java    |   7 --
 .../hadoop/ozone/recon/api/TestEndpoints.java      |   2 +-
 .../ozone/recon/scm/TestReconContainerManager.java |   2 +-
 .../recon/tasks/TestContainerKeyMapperTask.java    |  21 +----
 .../recon/tasks/TestContainerSizeCountTask.java    |   2 +-
 .../ozone/recon/tasks/TestOmTableInsightTask.java  |   2 +-
 .../s3/endpoint/TestMultipartUploadWithCopy.java   |   6 +-
 pom.xml                                            |  43 +++++++++
 63 files changed, 442 insertions(+), 239 deletions(-)

diff --git a/.github/ci.md b/.github/ci.md
index f354c7b80d0..f2bfb537cc5 100644
--- a/.github/ci.md
+++ b/.github/ci.md
@@ -43,6 +43,7 @@ Runs a subset of the following subjobs depending on what was 
selected by build-i
 - bats: [Checks](../hadoop-ozone/dev-support/checks/bats.sh) bash scripts, 
(using the [Bash Automated Testing 
System](https://github.com/bats-core/bats-core#bats-core-bash-automated-testing-system-2018))
 - checkstyle: [Runs](../hadoop-ozone/dev-support/checks/checkstyle.sh) 'mvn 
checkstyle' plugin to confirm Java source abides by Ozone coding conventions
 - docs: [Builds](../hadoop-ozone/dev-support/checks/docs.sh) website with 
[Hugo](https://gohugo.io/)
+- errorprone: [Runs](../hadoop-ozone/dev-support/checks/errorprone.sh) Error 
Prone static analysis during Java compilation. All diagnostics go to 
`diagnostics.txt`; `summary.txt` contains only errors or a fallback for a 
non-diagnostic Maven failure.
 - findbugs: [Runs](../hadoop-ozone/dev-support/checks/findbugs.sh) spotbugs 
static analysis on bytecode
 - pmd: [Runs](../hadoop-ozone/dev-support/checks/pmd.sh) PMD static analysis 
on project's source code
 - rat (release audit tool): 
[Confirms](../hadoop-ozone/dev-support/checks/rat.sh) source files include 
licenses
diff --git a/dev-support/ci/errorprone.bats b/dev-support/ci/errorprone.bats
new file mode 100644
index 00000000000..49f687b671e
--- /dev/null
+++ b/dev-support/ci/errorprone.bats
@@ -0,0 +1,101 @@
+#!/usr/bin/env bats
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+setup() {
+  TEST_TMPDIR=$(mktemp -d)
+  export TEST_TMPDIR
+  export OUTPUT_DIR="${TEST_TMPDIR}/report"
+  mkdir -p "${TEST_TMPDIR}/bin" "${OUTPUT_DIR}"
+  echo 9 > "${OUTPUT_DIR}/failures"
+  export MAVEN_EXIT_CODE=1
+cat > "${TEST_TMPDIR}/bin/mvn" <<'EOF'
+#!/usr/bin/env bash
+rm -rf "${OUTPUT_DIR}"
+printf '%s\n' "$*" > "${TEST_TMPDIR}/mvn-args"
+printf '%s\n' \
+  "[WARNING] The following options were not recognized by any processor: 
'[artifactId]'" \
+  "[WARNING] /src/Legacy.java:[1,1] [JdkObsolete] legacy finding" \
+  "[WARNING] /src/Custom.java:[3,1] [Custom-Rule_1] custom finding" \
+  "[ERROR] /src/Format.java:[2,1] [FormatString] error finding" \
+  "[ERROR] /src/Format.java:[2,1] [FormatString] error finding" \
+  "/src/Raw.java:4: warning: [RawWarning] raw warning" \
+  "[ERROR] Failed to execute goal example:example: failed"
+printf '%s\n' "/src/Raw.java:5: error: [RawError] raw error" >&2
+exit "${MAVEN_EXIT_CODE}"
+EOF
+  chmod +x "${TEST_TMPDIR}/bin/mvn"
+  export PATH="${TEST_TMPDIR}/bin:${PATH}"
+}
+
+teardown() {
+  rm -rf "${TEST_TMPDIR}"
+}
+
+@test "Error Prone reports Maven and javac findings and fails for errors" {
+  run hadoop-ozone/dev-support/checks/errorprone.sh
+
+  [ "$status" -eq 1 ]
+  grep -q -- '-DskipTests clean package' "${TEST_TMPDIR}/mvn-args"
+  ! grep -q -- '-DskipShade' "${TEST_TMPDIR}/mvn-args"
+  [ "$(wc -l < "${OUTPUT_DIR}/diagnostics.txt")" -eq 5 ]
+  grep -q '^\[WARNING\].*\[JdkObsolete\]' "${OUTPUT_DIR}/diagnostics.txt"
+  grep -q '^\[ERROR\].*\[FormatString\]' "${OUTPUT_DIR}/diagnostics.txt"
+  grep -q '^\[WARNING\].*\[Custom-Rule_1\]' "${OUTPUT_DIR}/diagnostics.txt"
+  grep -q '^/src/Raw.java:4: warning: \[RawWarning\]' 
"${OUTPUT_DIR}/diagnostics.txt"
+  grep -q '^/src/Raw.java:5: error: \[RawError\]' 
"${OUTPUT_DIR}/diagnostics.txt"
+  ! grep -q 'Failed to execute goal' "${OUTPUT_DIR}/diagnostics.txt"
+  [ "$(wc -l < "${OUTPUT_DIR}/summary.txt")" -eq 2 ]
+  grep -q '^\[ERROR\].*\[FormatString\]' "${OUTPUT_DIR}/summary.txt"
+  grep -q '^/src/Raw.java:5: error: \[RawError\]' "${OUTPUT_DIR}/summary.txt"
+  [ "$(< "${OUTPUT_DIR}/failures")" -eq 2 ]
+}
+
+@test "Error Prone warnings do not fail the check" {
+  export MAVEN_EXIT_CODE=0
+  cat > "${TEST_TMPDIR}/bin/mvn" <<'EOF'
+#!/usr/bin/env bash
+rm -rf "${OUTPUT_DIR}"
+printf '%s\n' \
+  "[WARNING] /src/Legacy.java:[1,1] [JdkObsolete] legacy finding" \
+  "/src/Raw.java:4: warning: [RawWarning] raw warning"
+exit "${MAVEN_EXIT_CODE}"
+EOF
+  chmod +x "${TEST_TMPDIR}/bin/mvn"
+
+  run hadoop-ozone/dev-support/checks/errorprone.sh
+
+  [ "$status" -eq 0 ]
+  [ "$(wc -l < "${OUTPUT_DIR}/diagnostics.txt")" -eq 2 ]
+  [ "$(< "${OUTPUT_DIR}/failures")" -eq 0 ]
+  [ ! -s "${OUTPUT_DIR}/summary.txt" ]
+}
+
+@test "Error Prone reports an unknown Maven failure" {
+  cat > "${TEST_TMPDIR}/bin/mvn" <<'EOF'
+#!/usr/bin/env bash
+rm -rf "${OUTPUT_DIR}"
+echo "[ERROR] Failed to execute goal example:example: failed"
+exit "${MAVEN_EXIT_CODE}"
+EOF
+  chmod +x "${TEST_TMPDIR}/bin/mvn"
+
+  run hadoop-ozone/dev-support/checks/errorprone.sh
+
+  [ "$status" -eq 1 ]
+  [ ! -s "${OUTPUT_DIR}/diagnostics.txt" ]
+  [ "$(< "${OUTPUT_DIR}/summary.txt")" = "Unknown failure, check output.log" ]
+  [ "$(< "${OUTPUT_DIR}/failures")" -eq 1 ]
+}
diff --git a/dev-support/ci/selective_ci_checks.bats 
b/dev-support/ci/selective_ci_checks.bats
index 891e0450608..a2579dec369 100644
--- a/dev-support/ci/selective_ci_checks.bats
+++ b/dev-support/ci/selective_ci_checks.bats
@@ -102,7 +102,7 @@ load bats-assert/load.bash
 @test "java test + pmd change" {
   run dev-support/ci/selective_ci_checks.sh 250bd5f317
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -113,7 +113,7 @@ load bats-assert/load.bash
 @test "integration and unit: java change" {
   run dev-support/ci/selective_ci_checks.sh 9aebf6e25
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -157,7 +157,7 @@ load bats-assert/load.bash
 @test "unit only" {
   run dev-support/ci/selective_ci_checks.sh 1dd1d0ba3
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -168,7 +168,7 @@ load bats-assert/load.bash
 @test "unit helper" {
   run dev-support/ci/selective_ci_checks.sh 88383d1d5
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -179,7 +179,7 @@ load bats-assert/load.bash
 @test "integration only" {
   run dev-support/ci/selective_ci_checks.sh 61396ba9f
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -190,7 +190,7 @@ load bats-assert/load.bash
 @test "mini-cluster" {
   run dev-support/ci/selective_ci_checks.sh 
f0388a195411e68aac360de8ab95735b2eb295de
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -201,7 +201,7 @@ load bats-assert/load.bash
 @test "test-utils" {
   run dev-support/ci/selective_ci_checks.sh 
60e4ab121853c182e1272b04fd1a93d55b12cfc7
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -212,7 +212,7 @@ load bats-assert/load.bash
 @test "native only" {
   run dev-support/ci/selective_ci_checks.sh 5b1319a8c2
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -223,7 +223,7 @@ load bats-assert/load.bash
 @test "native test in other module" {
   run dev-support/ci/selective_ci_checks.sh 822c0dee1a
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=false
@@ -256,7 +256,7 @@ load bats-assert/load.bash
 @test "main/java change" {
   run dev-support/ci/selective_ci_checks.sh 86a771dfe
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -267,7 +267,7 @@ load bats-assert/load.bash
 @test "..../java change" {
   run dev-support/ci/selective_ci_checks.sh 01c616536
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -278,7 +278,7 @@ load bats-assert/load.bash
 @test "java and compose change" {
   run dev-support/ci/selective_ci_checks.sh d0f0f806e
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -289,7 +289,7 @@ load bats-assert/load.bash
 @test "java and docs change" {
   run dev-support/ci/selective_ci_checks.sh 2c0adac26
 
-  assert_output -p 
'basic-checks=["rat","author","checkstyle","docs","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","author","checkstyle","docs","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -300,7 +300,7 @@ load bats-assert/load.bash
 @test "pom change" {
   run dev-support/ci/selective_ci_checks.sh 9129424a9
 
-  assert_output -p 'basic-checks=["rat","checkstyle","findbugs","pmd"]'
+  assert_output -p 
'basic-checks=["rat","checkstyle","errorprone","findbugs","pmd"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -311,7 +311,7 @@ load bats-assert/load.bash
 @test "CI lib change" {
   run dev-support/ci/selective_ci_checks.sh ceb79acaa
 
-  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","findbugs","pmd","rat"]'
+  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","errorprone","findbugs","pmd","rat"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -322,7 +322,7 @@ load bats-assert/load.bash
 @test "CI workflow change" {
   run dev-support/ci/selective_ci_checks.sh 90a8d7c01
 
-  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","findbugs","pmd","rat"]'
+  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","errorprone","findbugs","pmd","rat"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -345,7 +345,7 @@ load bats-assert/load.bash
 @test "CI workflow change (check.yml)" {
   run dev-support/ci/selective_ci_checks.sh 
1468af02067ec75b255f605816c32f8bf4dfaabf
 
-  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","findbugs","pmd","rat"]'
+  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","errorprone","findbugs","pmd","rat"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
@@ -356,7 +356,7 @@ load bats-assert/load.bash
 @test "CI workflow change (ci.yaml)" {
   run dev-support/ci/selective_ci_checks.sh 90fd5f2adc
 
-  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","findbugs","pmd","rat"]'
+  assert_output -p 
'basic-checks=["author","bats","checkstyle","docs","errorprone","findbugs","pmd","rat"]'
   assert_output -p needs-build=true
   assert_output -p needs-compile=true
   assert_output -p needs-compose-tests=true
diff --git a/dev-support/ci/selective_ci_checks.sh 
b/dev-support/ci/selective_ci_checks.sh
index 57e86347077..b45ef77179f 100755
--- a/dev-support/ci/selective_ci_checks.sh
+++ b/dev-support/ci/selective_ci_checks.sh
@@ -404,6 +404,25 @@ function check_needs_docs() {
     fi
 }
 
+function check_needs_errorprone() {
+    start_end::group_start "Check if Error Prone is needed"
+    local pattern_array=(
+        "^hadoop-ozone/dev-support/checks/errorprone.sh"
+        "pom.xml"
+        "src/..../java"
+    )
+    local ignore_array=(
+        "^hadoop-ozone/dist"
+    )
+    filter_changed_files
+
+    if [[ ${match_count} != "0" ]]; then
+        add_basic_check errorprone
+    fi
+
+    start_end::group_end
+}
+
 function check_needs_findbugs() {
     start_end::group_start "Check if findbugs is needed"
     local pattern_array=(
@@ -580,6 +599,7 @@ check_needs_author
 check_needs_bats
 check_needs_checkstyle
 check_needs_docs
+check_needs_errorprone
 check_needs_findbugs
 check_needs_pmd
 calculate_test_types_to_run
diff --git 
a/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestBlockDataStreamOutput.java
 
b/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestBlockDataStreamOutput.java
index a45032edcee..c66d7006c37 100644
--- 
a/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestBlockDataStreamOutput.java
+++ 
b/hadoop-hdds/client/src/test/java/org/apache/hadoop/hdds/scm/storage/TestBlockDataStreamOutput.java
@@ -219,7 +219,7 @@ void closeAfterWriteFailureThrows() throws Exception {
       }
       assertTrue(foundExpectedCause);
     } else {
-      assertThat(e.getMessage().contains("chunk write failed due to injected 
failure"));
+      assertThat(e.getMessage()).contains("chunk write failed due to injected 
failure");
     }
   }
 
diff --git 
a/hadoop-hdds/client/src/test/java/org/apache/hadoop/ozone/client/io/TestECBlockInputStream.java
 
b/hadoop-hdds/client/src/test/java/org/apache/hadoop/ozone/client/io/TestECBlockInputStream.java
index c0a2985b47d..97f9230b471 100644
--- 
a/hadoop-hdds/client/src/test/java/org/apache/hadoop/ozone/client/io/TestECBlockInputStream.java
+++ 
b/hadoop-hdds/client/src/test/java/org/apache/hadoop/ozone/client/io/TestECBlockInputStream.java
@@ -85,7 +85,7 @@ keyInfo, null, null, new TestBlockInputStreamFactory(),
     }
 
     // EC-3-2, very large block, so all 3 data locations are needed
-    keyInfo = ECStreamTestUtil.createKeyInfo(repConfig, 5, 5000 * ONEMB);
+    keyInfo = ECStreamTestUtil.createKeyInfo(repConfig, 5, 5000L * ONEMB);
     try (ECBlockInputStream ecb = new ECBlockInputStream(repConfig,
         keyInfo, null, null, new TestBlockInputStreamFactory(),
         clientConfig)) {
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/DelegatingProperties.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/DelegatingProperties.java
index 5a924c88738..a0ce09a3ea4 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/DelegatingProperties.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/conf/DelegatingProperties.java
@@ -121,7 +121,7 @@ public Set<Object> keySet() {
 
   @Override
   public boolean contains(Object value) {
-    return properties.contains(value);
+    return properties.containsValue(value);
   }
 
   @Override
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
index 65acb9da8e1..3e73eb5bccd 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/balancer/ContainerBalancerConfiguration.java
@@ -485,6 +485,7 @@ public String toString() {
             "%-50s %s%n" +
             "%-50s %s%n" +
             "%-50s %s%n" +
+            "%-50s %s%n" +
             "%-50s %s%n", "Key", "Value", "Threshold",
         threshold, "Max Datanodes to Involve per Iteration(percent)",
         maxDatanodesPercentageToInvolvePerIteration,
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/tracing/TracingUtil.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/tracing/TracingUtil.java
index 3684775d019..810555ca3e4 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/tracing/TracingUtil.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/tracing/TracingUtil.java
@@ -518,9 +518,11 @@ public static TraceCloseable createActivatedSpan(String 
spanName) {
     return createActivatedSpan(spanName, SpanKind.INTERNAL);
   }
 
+  @SuppressWarnings("MustBeClosedChecker")
   public static TraceCloseable createActivatedSpan(String spanName, SpanKind 
spanKind) {
     Span span = buildSpan(spanName, spanKind);
     Scope scope = span.makeCurrent();
+    // The returned TraceCloseable closes the Scope and ends the Span.
     return () -> {
       scope.close();
       span.end();
@@ -616,6 +618,7 @@ public String get(Function<String, String> carrier, String 
key) {
     }
   }
 
+  @SuppressWarnings("MustBeClosedChecker")
   public static TraceCloseable createActivatedSpanFromW3cHttpHeaders(
       String spanName, Function<String, String> getHeader, ConfigurationSource 
conf) {
     if (conf == null || !isTracingActive(conf)) {
@@ -639,6 +642,7 @@ public static TraceCloseable 
createActivatedSpanFromW3cHttpHeaders(
 
     Scope scope = span.makeCurrent();
 
+    // The returned TraceCloseable closes the Scope and ends the Span.
     return () -> {
       scope.close();
       span.end();
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
index 6fa6e1f10ec..ea0c9cc1e3a 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ContainerCache.java
@@ -91,7 +91,7 @@ public void shutdownCache() {
       while (iterator.hasNext()) {
         iterator.next();
         ReferenceCountedDB db = (ReferenceCountedDB) iterator.getValue();
-        Preconditions.checkArgument(cleanupDb(db), "refCount:",
+        Preconditions.checkArgument(cleanupDb(db), "refCount: %s",
             db.getReferenceCount());
       }
       // reset the cache
@@ -203,7 +203,7 @@ public void removeDB(String containerDBPath) {
       if (db != null) {
         boolean cleaned = cleanupDb(db);
         if (!db.isClosed()) {
-          Preconditions.checkArgument(cleaned, "refCount:",
+          Preconditions.checkArgument(cleaned, "refCount: %s",
               db.getReferenceCount());
         }
       }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ReferenceCountedDB.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ReferenceCountedDB.java
index f32184421c7..046648a0d14 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ReferenceCountedDB.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/utils/ReferenceCountedDB.java
@@ -56,7 +56,7 @@ public void incrementReference() {
 
   public void decrementReference() {
     int refCount = this.referenceCount.decrementAndGet();
-    Preconditions.checkArgument(refCount >= 0, "refCount:", refCount);
+    Preconditions.checkArgument(refCount >= 0, "refCount: %s", refCount);
     if (LOG.isTraceEnabled()) {
       LOG.trace("DecRef {} to refCnt {}, stackTrace: {}", getContainerDBPath(),
           referenceCount.get(), ExceptionUtils.getStackTrace(new Throwable()));
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SCMSecurityProtocolClientSideTranslatorPB.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SCMSecurityProtocolClientSideTranslatorPB.java
index 9b08f306701..2bf06e86d24 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SCMSecurityProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SCMSecurityProtocolClientSideTranslatorPB.java
@@ -110,7 +110,10 @@ private SCMSecurityResponse 
handleError(SCMSecurityResponse resp)
       throws SCMSecurityException {
     if (resp.getStatus() != SCMSecurityProtocolProtos.Status.OK) {
       throw new SCMSecurityException(resp.getMessage(),
-          SCMSecurityException.ErrorCode.values()[resp.getStatus().ordinal()]);
+          // The protocol status was introduced with a longer name than the 
existing error code.
+          resp.getStatus() == 
SCMSecurityProtocolProtos.Status.GET_ROOT_CA_CERTIFICATE_FAILED
+              ? SCMSecurityException.ErrorCode.GET_ROOT_CA_CERT_FAILED
+              : 
SCMSecurityException.ErrorCode.valueOf(resp.getStatus().name()));
     }
     return resp;
   }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SecretKeyProtocolClientSideTranslatorPB.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SecretKeyProtocolClientSideTranslatorPB.java
index add4da85317..317c8344617 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SecretKeyProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/protocolPB/SecretKeyProtocolClientSideTranslatorPB.java
@@ -98,7 +98,7 @@ private SCMSecretKeyResponse handleError(SCMSecretKeyResponse 
resp)
       throws SCMSecretKeyException {
     if (resp.getStatus() != SCMSecretKeyProtocolProtos.Status.OK) {
       throw new SCMSecretKeyException(resp.getMessage(),
-          
SCMSecretKeyException.ErrorCode.values()[resp.getStatus().ordinal()]);
+          SCMSecretKeyException.ErrorCode.valueOf(resp.getStatus().name()));
     }
     return resp;
   }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java
index c38a8800b5d..7b523a3115a 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNodeImpl.java
@@ -481,8 +481,6 @@ public HddsProtos.NetworkNode toProtobuf(
         }
       }
     }
-    innerNode.build();
-
     HddsProtos.NetworkNode networkNode =
         HddsProtos.NetworkNode.newBuilder()
             .setInnerNode(innerNode).build();
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/ScmBlockLocationProtocolClientSideTranslatorPB.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/ScmBlockLocationProtocolClientSideTranslatorPB.java
index 717b6db2c93..297b0062c19 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/ScmBlockLocationProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/ScmBlockLocationProtocolClientSideTranslatorPB.java
@@ -151,7 +151,7 @@ private SCMBlockLocationResponse 
handleError(SCMBlockLocationResponse resp)
       throws SCMException {
     if (resp.getStatus() != OK) {
       throw new SCMException(resp.getMessage(),
-          SCMException.ResultCodes.values()[resp.getStatus().ordinal()]);
+          SCMException.ResultCodes.valueOf(resp.getStatus().name()));
     }
     return resp;
   }
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
index 64c16ba2823..9df7443dd3e 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/security/x509/certificate/client/SCMCertificateClient.java
@@ -386,7 +386,7 @@ public CertificateServer initializeRootCertificateServer(
       SecurityConfig config, CertificateStore scmCertStore,
       BigInteger rootCertId, PKIProfile pkiProfile, String component)
       throws IOException {
-    String subject = String.format(SCM_ROOT_CA_PREFIX, rootCertId) +
+    String subject = SCM_ROOT_CA_PREFIX +
         InetAddress.getLocalHost().getHostName();
 
     DefaultCAServer rootCAServer = new DefaultCAServer(subject,
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/exceptions/TestSCMExceptionResultCodes.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/exceptions/TestSCMExceptionResultCodes.java
index 269ab295aa3..436036941e6 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/exceptions/TestSCMExceptionResultCodes.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/exceptions/TestSCMExceptionResultCodes.java
@@ -40,10 +40,9 @@ public void codeMapping() {
       assertEquals(codeValue.name(), protoBufValue.name(),
           String.format("Protobuf/Enum constant name mismatch %s %s",
               codeValue, protoBufValue));
-      ResultCodes converted = ResultCodes.values()[protoBufValue.ordinal()];
+      ResultCodes converted = ResultCodes.valueOf(protoBufValue.name());
       assertEquals(codeValue, converted);
     }
   }
 
 }
-
diff --git 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/exceptions/TestSCMExceptionResultCodes.java
 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/exception/TestSCMSecurityExceptionErrorCodes.java
similarity index 50%
copy from 
hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/exceptions/TestSCMExceptionResultCodes.java
copy to 
hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/exception/TestSCMSecurityExceptionErrorCodes.java
index 269ab295aa3..5fa4a89ba24 100644
--- 
a/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/scm/exceptions/TestSCMExceptionResultCodes.java
+++ 
b/hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/security/exception/TestSCMSecurityExceptionErrorCodes.java
@@ -15,35 +15,31 @@
  * limitations under the License.
  */
 
-package org.apache.hadoop.hdds.scm.exceptions;
+package org.apache.hadoop.hdds.security.exception;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import 
org.apache.hadoop.hdds.protocol.proto.ScmBlockLocationProtocolProtos.Status;
-import org.apache.hadoop.hdds.scm.exceptions.SCMException.ResultCodes;
+import org.apache.hadoop.hdds.protocol.proto.SCMSecurityProtocolProtos.Status;
+import 
org.apache.hadoop.hdds.security.exception.SCMSecurityException.ErrorCode;
 import org.junit.jupiter.api.Test;
 
 /**
- * Test Result code mappping between SCMException and the protobuf definitions.
+ * Test error code mapping between SCM security protocol and exception 
definitions.
  */
-public class TestSCMExceptionResultCodes {
+public class TestSCMSecurityExceptionErrorCodes {
 
   @Test
   public void codeMapping() {
-    // ResultCode = SCMException definition
-    // Status = protobuf definition
-    assertEquals(ResultCodes.values().length,
-        Status.values().length);
-    for (int i = 0; i < ResultCodes.values().length; i++) {
-      ResultCodes codeValue = ResultCodes.values()[i];
-      Status protoBufValue = Status.values()[i];
-      assertEquals(codeValue.name(), protoBufValue.name(),
-          String.format("Protobuf/Enum constant name mismatch %s %s",
-              codeValue, protoBufValue));
-      ResultCodes converted = ResultCodes.values()[protoBufValue.ordinal()];
-      assertEquals(codeValue, converted);
+    for (Status status : Status.values()) {
+      if (status != Status.GET_ROOT_CA_CERTIFICATE_FAILED
+          && status != Status.REVOKE_CERTIFICATE_FAILED) {
+        assertEquals(status.name(), ErrorCode.valueOf(status.name()).name());
+      }
     }
+    assertEquals(ErrorCode.GET_ROOT_CA_CERT_FAILED,
+        ErrorCode.valueOf("GET_ROOT_CA_CERT_FAILED"));
+    assertThrows(IllegalArgumentException.class,
+        () -> ErrorCode.valueOf(Status.REVOKE_CERTIFICATE_FAILED.name()));
   }
-
 }
-
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/CompactionDag.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/CompactionDag.java
index a7d78d16a86..3f5cbd42f50 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/CompactionDag.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/CompactionDag.java
@@ -83,7 +83,7 @@ public Set<String> pruneNodesFromDag(Set<CompactionNode> 
nodesToRemove) {
     Set<String> sstFilesPruned = pruneForwardDag(forwardCompactionDAG, 
nodesToRemove);
     // Remove SST file nodes from compactionNodeMap too,
     // since those nodes won't be needed after clean up.
-    nodesToRemove.forEach(compactionNodeMap::remove);
+    nodesToRemove.forEach(node -> 
compactionNodeMap.remove(node.getFileName()));
     return sstFilesPruned;
   }
 
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
index 2fde23bb376..023b3886487 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
@@ -68,11 +68,13 @@
 import org.apache.hadoop.hdds.utils.db.managed.ManagedDBOptions;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksIterator;
+import org.apache.ozone.compaction.log.CompactionFileInfo;
 import org.apache.ozone.compaction.log.CompactionLogEntry;
 import org.apache.ozone.test.GenericTestUtils;
 import org.apache.ratis.util.UncheckedAutoCloseable;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.Arguments;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -438,6 +440,23 @@ public void testPruneForwardDag(String description,
     assertEquals(actualFileNodesRemoved, expectedFileNodesRemoved);
   }
 
+  @Test
+  public void testPruneNodesRemovesNodesFromCompactionMap() {
+    CompactionDag compactionDag = new CompactionDag();
+    CompactionFileInfo inputFile =
+        new CompactionFileInfo("input", "a", "b", "keyTable");
+    CompactionFileInfo outputFile =
+        new CompactionFileInfo("output", "a", "b", "keyTable");
+    compactionDag.populateCompactionDAG(
+        Collections.singletonList(inputFile), 
Collections.singletonList(outputFile), 1L);
+
+    compactionDag.pruneNodesFromDag(
+        Collections.singleton(compactionDag.getCompactionNode("input")));
+
+    assertFalse(compactionDag.getCompactionMap().containsKey("input"));
+    assertTrue(compactionDag.getCompactionMap().containsKey("output"));
+  }
+
   @SuppressWarnings("methodlength")
   private static Stream<Arguments> compactionDagPruningScenarios() {
     long currentTimeMillis = System.currentTimeMillis();
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
index 5c98e190669..fff123043e9 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
@@ -251,34 +251,22 @@ public class TestRocksDBCheckpointDiffer {
   );
 
   private static TablePrefixInfo columnFamilyToPrefixMap1 =
-      new TablePrefixInfo(new HashMap<String, String>() {
-        {
-          put("keyTable", "/volume/bucket1/");
-          // Simply using bucketName instead of ID for the test.
-          put("directoryTable", "/volume/bucket1/");
-          put("fileTable", "/volume/bucket1/");
-        }
-      });
+      new TablePrefixInfo(ImmutableMap.of(
+          "keyTable", "/volume/bucket1/",
+          "directoryTable", "/volume/bucket1/",
+          "fileTable", "/volume/bucket1/"));
 
   private static TablePrefixInfo columnFamilyToPrefixMap2 =
-      new TablePrefixInfo(new HashMap<String, String>() {
-        {
-          put("keyTable", "/volume/bucket2/");
-          // Simply using bucketName instead of ID for the test.
-          put("directoryTable", "/volume/bucket2/");
-          put("fileTable", "/volume/bucket2/");
-        }
-      });
+      new TablePrefixInfo(ImmutableMap.of(
+          "keyTable", "/volume/bucket2/",
+          "directoryTable", "/volume/bucket2/",
+          "fileTable", "/volume/bucket2/"));
 
   private static TablePrefixInfo columnFamilyToPrefixMap3 =
-      new TablePrefixInfo(new HashMap<String, String>() {
-        {
-          put("keyTable", "/volume/bucket3/");
-          // Simply using bucketName instead of ID for the test.
-          put("directoryTable", "/volume/bucket3/");
-          put("fileTable", "/volume/bucket3/");
-        }
-      });
+      new TablePrefixInfo(ImmutableMap.of(
+          "keyTable", "/volume/bucket3/",
+          "directoryTable", "/volume/bucket3/",
+          "fileTable", "/volume/bucket3/"));
 
   private static final int NUM_ROW = 250000;
   private static final int SNAPSHOT_EVERY_SO_MANY_KEYS = 49999;
@@ -820,19 +808,19 @@ private static Stream<Arguments> 
casesGetSSTDiffListWithoutDB() {
         Arguments.of("Test 13: Compaction log to test filtering logic based on 
range and column family",
             null,
             getPrunedCompactionEntries(false,
-                new HashMap<String, SstFileInfo>() {{
-                  put("1", new SstFileInfo("1", "a", "c", "col1"));
-                  put("3", new SstFileInfo("3", "a", "d", "col2"));
-                  put("13", new SstFileInfo("13", "a", "c", "col13"));
-                  put("14", new SstFileInfo("14", "a", "c", "col1"));
-                  put("2", new SstFileInfo("2", "a", "c", "col1"));
-                  put("4", new SstFileInfo("4", "a", "b", "col1"));
-                  put("5", new SstFileInfo("5", "b", "b", "col1"));
-                  put("10", new SstFileInfo("10", "a", "b", "col1"));
-                  put("8", new SstFileInfo("8", "a", "b", "col1"));
-                  put("6", new SstFileInfo("6", "a", "z", "col13"));
-                  put("7", new SstFileInfo("7", "a", "z", "col13"));
-                }}),
+                ImmutableMap.<String, SstFileInfo>builder()
+                    .put("1", new SstFileInfo("1", "a", "c", "col1"))
+                    .put("3", new SstFileInfo("3", "a", "d", "col2"))
+                    .put("13", new SstFileInfo("13", "a", "c", "col13"))
+                    .put("14", new SstFileInfo("14", "a", "c", "col1"))
+                    .put("2", new SstFileInfo("2", "a", "c", "col1"))
+                    .put("4", new SstFileInfo("4", "a", "b", "col1"))
+                    .put("5", new SstFileInfo("5", "b", "b", "col1"))
+                    .put("10", new SstFileInfo("10", "a", "b", "col1"))
+                    .put("8", new SstFileInfo("8", "a", "b", "col1"))
+                    .put("6", new SstFileInfo("6", "a", "z", "col13"))
+                    .put("7", new SstFileInfo("7", "a", "z", "col13"))
+                    .build()),
             snapshotInfo6,
             snapshotInfo5,
             ImmutableSet.of("10", "11", "8", "9", "12", "15"),
diff --git 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDiffUtils.java
 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDiffUtils.java
index 08ff90ab6cc..e276c728fdd 100644
--- 
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDiffUtils.java
+++ 
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDiffUtils.java
@@ -17,7 +17,6 @@
 
 package org.apache.ozone.rocksdiff;
 
-import static 
org.apache.hadoop.hdds.StringUtils.getLexicographicallyHigherString;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.params.provider.Arguments.arguments;
@@ -74,10 +73,10 @@ public void testFilterFunction() {
 
   public static Stream<Arguments> values() {
     return Stream.of(
-        arguments("validColumnFamily", "validColumnFamily", "a", "d", "e", 
"g"),
-        arguments("validColumnFamily", "validColumnFamily", "e", "g", "a", 
"d"),
-        arguments("validColumnFamily", "validColumnFamily", "b", "b", "e", 
"g"),
-        arguments("validColumnFamily", "validColumnFamily", "a", "d", "e", "e")
+        arguments("validColumnFamily", "invalidColumnFamily", "a", "d", "e", 
"g"),
+        arguments("validColumnFamily", "invalidColumnFamily", "e", "g", "a", 
"d"),
+        arguments("validColumnFamily", "invalidColumnFamily", "b", "b", "e", 
"g"),
+        arguments("validColumnFamily", "invalidColumnFamily", "a", "d", "e", 
"e")
     );
   }
 
@@ -97,6 +96,9 @@ validSstFile, new SstFileInfo(validSstFile, 
validSSTFileStartRange, validSSTFile
             invalidSSTFileEndRange, invalidColumnFamilyName), untrackedSstFile,
         new SstFileInfo(untrackedSstFile, null, null, null));
     Map<String, SstFileInfo> inputSstFiles = new HashMap<>();
+    Map<String, String> prefixes = new HashMap<>();
+    prefixes.put(invalidColumnFamilyName, invalidSSTFileEndRange + "z");
+    prefixes.put(validSSTColumnFamilyName, expectedPrefix);
     List<Set<String>> tablesToLookupSet = 
Arrays.asList(ImmutableSet.of(validSSTColumnFamilyName),
         ImmutableSet.of(invalidColumnFamilyName), 
ImmutableSet.of(validSSTColumnFamilyName, invalidColumnFamilyName),
         Collections.emptySet());
@@ -105,11 +107,7 @@ validSstFile, new SstFileInfo(validSstFile, 
validSSTFileStartRange, validSSTFile
       inputSstFiles.putAll(sstFile);
       RocksDiffUtils.filterRelevantSstFiles(inputSstFiles,
           tablesToLookup,
-          new TablePrefixInfo(
-              new HashMap<String, String>() {{
-                put(invalidColumnFamilyName, 
getLexicographicallyHigherString(invalidSSTFileEndRange));
-                put(validSSTColumnFamilyName, expectedPrefix);
-              }}));
+          new TablePrefixInfo(prefixes));
       if (tablesToLookup.contains(validSSTColumnFamilyName)) {
         Assertions.assertEquals(Sets.newTreeSet(validSstFile, 
untrackedSstFile), inputSstFiles.keySet(),
             "Failed for " + tablesToLookup);
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManagerMetrics.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManagerMetrics.java
index 84c13231b19..ccfee933c25 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManagerMetrics.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/container/replication/ReplicationManagerMetrics.java
@@ -88,27 +88,28 @@ public final class ReplicationManagerMetrics implements 
MetricsSource {
       "Number of containers currently in the over replicated queue");
 
   // Setup metric names and descriptions for Container Lifecycle states
-  private static final Map<LifeCycleState, MetricsInfo> LIFECYCLE_STATE_METRICS
-      = Collections.unmodifiableMap(
-          new LinkedHashMap<LifeCycleState, MetricsInfo>() {{
-            for (LifeCycleState s : LifeCycleState.values()) {
-              String name = CaseFormat.UPPER_UNDERSCORE
-                  .to(CaseFormat.UPPER_CAMEL, s.toString());
-              String metric = name + "Containers";
-              String description = "Current count of Containers in " + name +
-                  " state";
-              put(s, Interns.info(metric, description));
-            }
-          }});
+  private static final Map<LifeCycleState, MetricsInfo> 
LIFECYCLE_STATE_METRICS;
 
   // Setup metric names and descriptions for
   private static final Map<ContainerHealthState, MetricsInfo>
-      CONTAINER_HEALTH_STATE_METRICS = Collections.unmodifiableMap(
-          new LinkedHashMap<ContainerHealthState, MetricsInfo>() {{
-            for (ContainerHealthState s :  ContainerHealthState.values()) {
-              put(s, Interns.info(s.getMetricName(), s.getDescription()));
-            }
-          }});
+      CONTAINER_HEALTH_STATE_METRICS;
+
+  static {
+    Map<LifeCycleState, MetricsInfo> lifecycleStateMetrics = new 
LinkedHashMap<>();
+    for (LifeCycleState state : LifeCycleState.values()) {
+      String name = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, 
state.toString());
+      String metric = name + "Containers";
+      String description = "Current count of Containers in " + name + " state";
+      lifecycleStateMetrics.put(state, Interns.info(metric, description));
+    }
+    LIFECYCLE_STATE_METRICS = 
Collections.unmodifiableMap(lifecycleStateMetrics);
+
+    Map<ContainerHealthState, MetricsInfo> containerHealthStateMetrics = new 
LinkedHashMap<>();
+    for (ContainerHealthState state : ContainerHealthState.values()) {
+      containerHealthStateMetrics.put(state, 
Interns.info(state.getMetricName(), state.getDescription()));
+    }
+    CONTAINER_HEALTH_STATE_METRICS = 
Collections.unmodifiableMap(containerHealthStateMetrics);
+  }
 
   @Metric("Number of replication commands sent.")
   private MutableCounterLong replicationCmdsSentTotal;
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMContainerMetrics.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMContainerMetrics.java
index dea3d514c9c..4ab807e251f 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMContainerMetrics.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMContainerMetrics.java
@@ -25,7 +25,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.HashMap;
+import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.metrics2.MetricsCollector;
@@ -42,16 +42,15 @@ public class TestSCMContainerMetrics {
   public void testSCMContainerMetrics() {
     SCMMXBean scmmxBean = mock(SCMMXBean.class);
 
-    Map<String, Integer> stateInfo = new HashMap<String, Integer>() {{
-        put(HddsProtos.LifeCycleState.OPEN.toString(), 2);
-        put(HddsProtos.LifeCycleState.CLOSING.toString(), 3);
-        put(HddsProtos.LifeCycleState.QUASI_CLOSED.toString(), 4);
-        put(HddsProtos.LifeCycleState.CLOSED.toString(), 5);
-        put(HddsProtos.LifeCycleState.DELETING.toString(), 6);
-        put(HddsProtos.LifeCycleState.DELETED.toString(), 7);
-        put(HddsProtos.LifeCycleState.RECOVERING.toString(), 8);
-      }};
-
+    Map<String, Integer> stateInfo = ImmutableMap.<String, Integer>builder()
+        .put(HddsProtos.LifeCycleState.OPEN.toString(), 2)
+        .put(HddsProtos.LifeCycleState.CLOSING.toString(), 3)
+        .put(HddsProtos.LifeCycleState.QUASI_CLOSED.toString(), 4)
+        .put(HddsProtos.LifeCycleState.CLOSED.toString(), 5)
+        .put(HddsProtos.LifeCycleState.DELETING.toString(), 6)
+        .put(HddsProtos.LifeCycleState.DELETED.toString(), 7)
+        .put(HddsProtos.LifeCycleState.RECOVERING.toString(), 8)
+        .build();
 
     when(scmmxBean.getContainerStateCount()).thenReturn(stateInfo);
 
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
index 9b4da46e880..eefb49402ba 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/GetServiceRolesSubcommand.java
@@ -17,6 +17,7 @@
 
 package org.apache.hadoop.ozone.admin.om;
 
+import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -108,10 +109,9 @@ private void printOmServerRolesAsJson(List<ServiceInfo> 
serviceList)
           serviceInfo.getNodeType() == HddsProtos.NodeType.OM) {
         Map<String, Map<String, String>> omService = new HashMap<>();
         omService.put(omRoleInfo.getNodeId(),
-            new HashMap<String, String>() {{
-              put("serverRole", omRoleInfo.getServerRole());
-              put("hostname", serviceInfo.getHostname());
-            }});
+            ImmutableMap.of(
+                "serverRole", omRoleInfo.getServerRole(),
+                "hostname", serviceInfo.getHostname()));
         omServiceList.add(omService);
       }
     }
diff --git 
a/hadoop-ozone/cli-debug/src/test/java/org/apache/ozone/TestPrintableGraph.java 
b/hadoop-ozone/cli-debug/src/test/java/org/apache/ozone/TestPrintableGraph.java
index fb7dbe31999..3e4c2d227f4 100644
--- 
a/hadoop-ozone/cli-debug/src/test/java/org/apache/ozone/TestPrintableGraph.java
+++ 
b/hadoop-ozone/cli-debug/src/test/java/org/apache/ozone/TestPrintableGraph.java
@@ -19,8 +19,8 @@
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.Mockito.when;
 
+import com.google.common.graph.GraphBuilder;
 import com.google.common.graph.MutableGraph;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -29,24 +29,19 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import org.apache.ozone.rocksdiff.CompactionNode;
-import org.junit.jupiter.api.extension.ExtendWith;
 import org.junit.jupiter.api.io.TempDir;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.EnumSource;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
 
 /**
  * This class is used for testing the PrintableGraph class.
  * It contains methods to test the generation and printing of graphs with 
different types.
  */
-@ExtendWith(MockitoExtension.class)
 public class TestPrintableGraph {
   @TempDir
   private Path dir;
 
-  @Mock
-  private MutableGraph<CompactionNode> mutableGraph;
+  private final MutableGraph<CompactionNode> mutableGraph = 
GraphBuilder.directed().build();
 
   @ParameterizedTest
   @EnumSource(PrintableGraph.GraphType.class)
@@ -68,7 +63,7 @@ void testPrintActualGraph(PrintableGraph.GraphType graphType) 
throws IOException
         new CompactionNode("fileName3", 300, null, "endKey3", "columnFamily3"),
         new CompactionNode("fileName4", 400, "startKey4", null, 
"columnFamily4")
     ).collect(Collectors.toSet());
-    when(mutableGraph.nodes()).thenReturn(nodes);
+    nodes.forEach(mutableGraph::addNode);
 
     PrintableGraph graph = new PrintableGraph(mutableGraph, graphType);
     graph.generateImage(dir.resolve(graphType.name()).toString());
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ECKeyOutputStream.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ECKeyOutputStream.java
index d757256aeef..91055a3962f 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ECKeyOutputStream.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/ECKeyOutputStream.java
@@ -283,7 +283,7 @@ private void generateParityCells() throws IOException {
     }
     for (int i = firstNonFullIndex + 1; i < dataBuffers.length; i++) {
       Preconditions.checkState(dataBuffers[i].position() == 0,
-          "Illegal stripe state: cell {} is not full while cell {} has data",
+          "Illegal stripe state: cell %s is not full while cell %s has data",
           firstNonFullIndex, i);
     }
 
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmRangerSyncArgs.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmRangerSyncArgs.java
index 8d91ec3c04b..7bfb8c8febc 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmRangerSyncArgs.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmRangerSyncArgs.java
@@ -17,8 +17,6 @@
 
 package org.apache.hadoop.ozone.om.helpers;
 
-import java.util.Objects;
-
 /**
  * This class is used for storing Ranger Sync request args.
  */
@@ -59,7 +57,6 @@ public Builder setNewSyncServiceVersion(long version) {
     }
 
     public OmRangerSyncArgs build() {
-      Objects.requireNonNull(newServiceVersion, "newServiceVersion == null");
       return new OmRangerSyncArgs(newServiceVersion);
     }
   }
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
index bce59dd6d10..79f2d3900c2 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OzoneManagerProtocolClientSideTranslatorPB.java
@@ -798,7 +798,7 @@ public OpenKeySession openKey(OmKeyArgs args) throws 
IOException {
   private OMResponse handleError(OMResponse resp) throws OMException {
     if (resp.getStatus() != OK) {
       throw new OMException(resp.getMessage(),
-          ResultCodes.values()[resp.getStatus().ordinal()]);
+          ResultCodes.valueOf(resp.getStatus().name()));
     }
     return resp;
   }
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/exceptions/TestResultCodes.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/exceptions/TestResultCodes.java
index 0af741a081e..e0807c165b0 100644
--- 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/exceptions/TestResultCodes.java
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/exceptions/TestResultCodes.java
@@ -39,7 +39,7 @@ public void codeMapping() {
       assertTrue(sameName(codeValue.name(), protoBufValue.name()),
           String.format("Protobuf/Enum constant name mismatch %s %s", 
codeValue,
               protoBufValue));
-      ResultCodes converted = ResultCodes.values()[protoBufValue.ordinal()];
+      ResultCodes converted = ResultCodes.valueOf(protoBufValue.name());
       assertEquals(codeValue, converted);
     }
   }
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestHadoopRpcOMFollowerReadFailoverProxyProvider.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestHadoopRpcOMFollowerReadFailoverProxyProvider.java
index d3275d22be6..403dfe8ef3c 100644
--- 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestHadoopRpcOMFollowerReadFailoverProxyProvider.java
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/ha/TestHadoopRpcOMFollowerReadFailoverProxyProvider.java
@@ -26,6 +26,7 @@
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertInstanceOf;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -306,8 +307,8 @@ void testObjectMethodsOnProxy() throws Exception {
     setupProxyProvider(2);
 
     assertNotNull(retryProxy.toString());
-    retryProxy.hashCode();
-    retryProxy.equals(retryProxy);
+    assertEquals(retryProxy.hashCode(), retryProxy.hashCode());
+    assertNotEquals((Object) retryProxy, new Object());
   }
 
   @Test
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressClientInterceptor.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressClientInterceptor.java
index 0a862c2eff0..eba5950c52e 100644
--- 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressClientInterceptor.java
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressClientInterceptor.java
@@ -39,6 +39,7 @@
 public class TestClientAddressClientInterceptor {
 
   @Test
+  @SuppressWarnings("CheckReturnValue")
   public void testClientAddressEntriesInRequestHeaders() {
     try (MockedStatic<Context> grpcContextStaticMock =
              mockStatic(Context.class)) {
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressServerInterceptor.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressServerInterceptor.java
index 240c1db6520..fba6ad21ea7 100644
--- 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressServerInterceptor.java
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/protocolPB/grpc/TestClientAddressServerInterceptor.java
@@ -66,11 +66,15 @@ public void testClientAddressEntriesInHeaders() {
           }
       );
       Context context = contextArgumentCaptor.getValue();
-      context.attach();
-      assertEquals("host.example.com",
-          GrpcClientConstants.CLIENT_HOSTNAME_CTX_KEY.get());
-      assertEquals("173.56.23.4",
-          GrpcClientConstants.CLIENT_IP_ADDRESS_CTX_KEY.get());
+      Context previous = context.attach();
+      try {
+        assertEquals("host.example.com",
+            GrpcClientConstants.CLIENT_HOSTNAME_CTX_KEY.get());
+        assertEquals("173.56.23.4",
+            GrpcClientConstants.CLIENT_IP_ADDRESS_CTX_KEY.get());
+      } finally {
+        context.detach(previous);
+      }
     }
   }
 
diff --git a/hadoop-ozone/dev-support/checks/bats.sh 
b/hadoop-ozone/dev-support/checks/bats.sh
index 41f41723ecd..caffc8f2e2a 100755
--- a/hadoop-ozone/dev-support/checks/bats.sh
+++ b/hadoop-ozone/dev-support/checks/bats.sh
@@ -32,6 +32,7 @@ rm -f "${REPORT_DIR}/output.log"
 
 find * \( \
     -path '*/src/test/shell/*' -name '*.bats' \
+    -or -path dev-support/ci/errorprone.bats \
     -or -path dev-support/ci/selective_ci_checks.bats \
     -or -path dev-support/ci/pr_title_check.bats \
     -or -path dev-support/ci/find_test_class_project.bats \
diff --git a/hadoop-ozone/dev-support/checks/errorprone.sh 
b/hadoop-ozone/dev-support/checks/errorprone.sh
new file mode 100755
index 00000000000..5d9fd362d54
--- /dev/null
+++ b/hadoop-ozone/dev-support/checks/errorprone.sh
@@ -0,0 +1,53 @@
+#!/usr/bin/env bash
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+#checks:basic
+
+set -u -o pipefail
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
+cd "$DIR/../../.." || exit 1
+
+REPORT_DIR=${OUTPUT_DIR:-"$DIR/../../../target/errorprone"}
+REPORT_FILE="$REPORT_DIR/summary.txt"
+DIAGNOSTIC_FILE="$REPORT_DIR/diagnostics.txt"
+OUTPUT_LOG=$(mktemp)
+
+MAVEN_OPTIONS='-B -fae --no-transfer-progress -Perrorprone -DskipDocs 
-DskipRecon -DskipTests'
+MAVEN_DIAGNOSTIC_PATTERN='^\[(ERROR|WARNING)\] .*:\[[0-9]+,[0-9]+\] \[[^]]+\]'
+JAVAC_DIAGNOSTIC_PATTERN='^.*:[0-9]+: (error|warning): \[[^]]+\]'
+MAVEN_ERROR_PATTERN='^\[ERROR\] .*:\[[0-9]+,[0-9]+\] \[[^]]+\]'
+JAVAC_ERROR_PATTERN='^.*:[0-9]+: error: \[[^]]+\]'
+ERROR_DIAGNOSTIC_PATTERN="${MAVEN_ERROR_PATTERN}|${JAVAC_ERROR_PATTERN}"
+
+declare -i rc
+
+trap 'rm -f "$OUTPUT_LOG"' EXIT
+
+#shellcheck disable=SC2086
+mvn $MAVEN_OPTIONS clean package "$@" 2>&1 | tee "$OUTPUT_LOG"
+rc=$?
+
+mkdir -p "$REPORT_DIR"
+mv "$OUTPUT_LOG" "${REPORT_DIR}/output.log"
+trap - EXIT
+
+grep -E "${MAVEN_DIAGNOSTIC_PATTERN}|${JAVAC_DIAGNOSTIC_PATTERN}" 
"${REPORT_DIR}/output.log" \
+  | awk '!seen[$0]++' > "$DIAGNOSTIC_FILE"
+
+grep -E "$ERROR_DIAGNOSTIC_PATTERN" "$DIAGNOSTIC_FILE" > "$REPORT_FILE" || true
+
+source "${DIR}/_post_process.sh"
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/contract/AbstractContractSafeModeTest.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/contract/AbstractContractSafeModeTest.java
index ae427eb519a..a971bfdb597 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/contract/AbstractContractSafeModeTest.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/contract/AbstractContractSafeModeTest.java
@@ -45,7 +45,7 @@ public void testSafeMode() throws Throwable {
 
   private SafeMode verifyAndGetSafeModeInstance(FileSystem fs) {
     Assertions.assertThat(fs)
-        .describedAs("File system %s must be an instance of %s", fs, 
SafeMode.class.getClass())
+        .describedAs("File system %s must be an instance of %s", fs, 
SafeMode.class)
         .isInstanceOf(SafeMode.class);
     return (SafeMode) fs;
   }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
index 02fa289c023..0abae8bfa51 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestHSync.java
@@ -493,9 +493,14 @@ public void testHSyncOpenKeyCommitAfterExpiry() throws 
Exception {
         try (FSDataOutputStream os1 = fs.create(key2, true)) {
           os1.write(1);
           // There should be 2 key in openFileTable
-          assertThat(2 == getOpenKeyInfo(BUCKET_LAYOUT).size());
-          // One key will be in fileTable as hsynced
-          assertThat(1 == getKeyInfo(BUCKET_LAYOUT).size());
+          assertThat(getOpenKeyInfo(BUCKET_LAYOUT))
+              .extracting(OmKeyInfo::getKeyName)
+              .contains(key1.getName(), key2.getName());
+          // key1 will be in fileTable as hsynced, but key2 will not.
+          assertThat(getKeyInfo(BUCKET_LAYOUT))
+              .extracting(OmKeyInfo::getKeyName)
+              .contains(key1.getName())
+              .doesNotContain(key2.getName());
 
           // Resume openKeyCleanupService
           openKeyCleanupService.resume();
@@ -503,8 +508,11 @@ public void testHSyncOpenKeyCommitAfterExpiry() throws 
Exception {
           // Key without hsync is deleted
           GenericTestUtils.waitFor(() ->
               getOpenKeyInfo(BUCKET_LAYOUT).isEmpty(), 1000, 12000);
-          // Verify only one key is still present in fileTable
-          assertThat(1 == getKeyInfo(BUCKET_LAYOUT).size());
+          // Verify key1 remains in fileTable and key2 is absent.
+          assertThat(getKeyInfo(BUCKET_LAYOUT))
+              .extracting(OmKeyInfo::getKeyName)
+              .contains(key1.getName())
+              .doesNotContain(key2.getName());
 
           // Clean up
           assertTrue(fs.delete(key1, false));
@@ -579,7 +587,9 @@ public void testHSyncOpenKeyDeletionWhileDeleteDirectory() 
throws Exception {
         os.write(1);
         os.hsync();
         // There should be 1 key in openFileTable
-        assertThat(1 == getOpenKeyInfo(BUCKET_LAYOUT).size());
+        assertThat(getOpenKeyInfo(BUCKET_LAYOUT))
+            .extracting(OmKeyInfo::getKeyName)
+            .contains("dir1/dir2/hsync-key");
         // Delete directory recursively
         fs.delete(new Path(OZONE_ROOT + bucket.getVolumeName() + 
OZONE_URI_DELIMITER +
             bucket.getName() + OZONE_URI_DELIMITER + "dir1/"), true);
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestXceiverClientManager.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestXceiverClientManager.java
index d92e896c8c4..391cfc96095 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestXceiverClientManager.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestXceiverClientManager.java
@@ -90,7 +90,7 @@ public void testCaching(boolean securityEnabled, @TempDir 
Path metaDir) throws I
       assertEquals(1, client1.getRefcount());
       // although allowShortCircuit true when calling acquireClientForReadData,
       // XceiverClientGrpc client will be allocated since short-circuit is by 
default disabled.
-      assertThat(client1 instanceof XceiverClientGrpc);
+      assertThat(client1).isInstanceOf(XceiverClientGrpc.class);
 
       ContainerWithPipeline container2 = storageContainerLocationClient
           .allocateContainer(
@@ -100,7 +100,7 @@ public void testCaching(boolean securityEnabled, @TempDir 
Path metaDir) throws I
       XceiverClientSpi client2 = clientManager
           .acquireClient(container2.getPipeline());
       assertEquals(1, client2.getRefcount());
-      assertThat(client2 instanceof XceiverClientGrpc);
+      assertThat(client2).isInstanceOf(XceiverClientGrpc.class);
 
       XceiverClientSpi client3 = clientManager
           .acquireClient(container1.getPipeline());
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestECKeyOutputStream.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestECKeyOutputStream.java
index 097a1cf84e9..d8ddc20931c 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestECKeyOutputStream.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestECKeyOutputStream.java
@@ -405,7 +405,7 @@ private void testMultipleChunksInSingleWriteOp(int offset,
     final OzoneBucket bucket = getOzoneBucket();
     String keyName =
         String.format("testMultipleChunksInSingleWriteOpOffset" +
-                "%dBufferChunks%dNumChunks", offset, bufferChunks,
+                "%dBufferChunks%dNumChunks%d", offset, bufferChunks,
             numChunks);
     try (OzoneOutputStream out = bucket.createKey(keyName, 4096,
         new ECReplicationConfig(3, 2, ECReplicationConfig.EcCodec.RS,
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestBlockDeletion.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestBlockDeletion.java
index 4b716a56500..00aef86e3bb 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestBlockDeletion.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/container/common/statemachine/commandhandler/TestBlockDeletion.java
@@ -676,9 +676,9 @@ public void testContainerDeleteWithInvalidKeyCount()
     containerStateManager.updateContainerReplica(replicaOne);
 
     // Check replica updated with wrong keyCount
-    scm.getContainerManager().getContainerReplicas(
+    assertTrue(scm.getContainerManager().getContainerReplicas(
             ContainerID.valueOf(containerInfos.get(0).getContainerID()))
-        .stream().anyMatch(replica -> replica.getKeyCount() == 10);
+        .stream().anyMatch(replica -> replica.getKeyCount() == 10));
 
     // Process delete container in SCM, ensure containers gets deleted,
     // even though keyCount is invalid in one of the replica
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestAddRemoveOzoneManager.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestAddRemoveOzoneManager.java
index 5f5dfea4fd5..113b9d30b41 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestAddRemoveOzoneManager.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestAddRemoveOzoneManager.java
@@ -489,7 +489,7 @@ private void decommissionOM(String decommNodeId) throws 
Exception {
     // Verify decomm node is removed from the HA ring
     GenericTestUtils.waitFor(() -> {
       for (OzoneManager om : activeOMs) {
-        if (om.getPeerNodes().contains(decommNodeId)) {
+        if (om.getPeerNodes().stream().anyMatch(node -> 
node.getNodeId().equals(decommNodeId))) {
           return false;
         }
       }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestObjectStoreWithFSO.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestObjectStoreWithFSO.java
index 025a472e9a6..3bf4f7b8aee 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestObjectStoreWithFSO.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestObjectStoreWithFSO.java
@@ -575,7 +575,7 @@ private void readKey(OzoneBucket ozoneBucket, String key, 
int length, byte[] inp
 
     // Read using filesystem.
     String rootPath = String.format("%s://%s.%s/", OZONE_URI_SCHEME,
-        bucketName, volumeName, StandardCharsets.UTF_8);
+        bucketName, volumeName);
     OzoneFileSystem o3fs = (OzoneFileSystem) FileSystem.get(new URI(rootPath),
         conf);
     try (InputStream fsDataInputStream = o3fs.open(new Path(key))) {
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java
index d68d6f990d1..373bf51ab7b 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotDirectoryCleaningService.java
@@ -25,9 +25,9 @@
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -235,15 +235,10 @@ public void testExclusiveSizeWithDirectoryDeepClean() 
throws Exception {
     long prevRunCount = directoryDeletingService.getRunCount().get();
     GenericTestUtils.waitFor(() -> directoryDeletingService.getRunCount().get()
         > prevRunCount + 1, 100, 10000);
-    Map<String, Long> expectedSize = new HashMap<String, Long>() {{
-      // /v/b/snapDir/appRoot0/parentDir0-2/childFile contribute
-      // exclusive size, /v/b/snapDir/appRoot0/parentDir0-2/childFile0-4
-      // are deep cleaned and hence don't contribute to size.
-        put("snap1", 3L);
-      // Only testKey5-9 contribute to the exclusive size
-        put("snap2", 5L);
-        put("snap3", 0L);
-      }};
+    // /v/b/snapDir/appRoot0/parentDir0-2/childFile contribute exclusive size,
+    // /v/b/snapDir/appRoot0/parentDir0-2/childFile0-4 are deep cleaned and 
hence don't contribute to size.
+    // Only testKey5-9 contribute to the exclusive size of snap2.
+    Map<String, Long> expectedSize = ImmutableMap.of("snap1", 3L, "snap2", 5L, 
"snap3", 0L);
 
     try (Table.KeyValueIterator<String, SnapshotInfo>
         iterator = snapshotInfoTable.iterator()) {
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/tools/contract/AbstractContractDistCpTest.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/tools/contract/AbstractContractDistCpTest.java
index 35360004c9d..4560b521fc5 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/tools/contract/AbstractContractDistCpTest.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/tools/contract/AbstractContractDistCpTest.java
@@ -283,7 +283,7 @@ void assertCounterInRange(Job job, Enum<?> counter, long 
min, long max)
     Counter c = job.getCounters().findCounter(counter);
     long value = c.getValue();
     String description =
-        String.format("%s value %s", c.getDisplayName(), value, false);
+        String.format("%s value %s", c.getDisplayName(), value);
 
     if (min >= 0) {
       assertThat(value)
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
index d63baf6d4d0..a3da6ab7e6e 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/OMClientRequest.java
@@ -268,7 +268,7 @@ public OzoneManagerProtocolProtos.UserInfo getUserInfo() 
throws IOException {
         GrpcClientConstants.CLIENT_HOSTNAME_CTX_KEY.get();
     if (remoteAddress != null) {
       userInfo.setHostName(remoteAddress.getHostName());
-      userInfo.setRemoteAddress(remoteAddress.getHostAddress()).build();
+      userInfo.setRemoteAddress(remoteAddress.getHostAddress());
     } else if (grpcContextClientHostname != null
         && grpcContextClientIpAddress != null) {
       userInfo.setHostName(grpcContextClientHostname);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
index 0d7ff10251d..b0d3d3c42fa 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeysDeleteRequest.java
@@ -290,7 +290,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
 
       omResponse.setDeleteKeysResponse(
           DeleteKeysResponse.newBuilder().setStatus(false)
-              .setUnDeletedKeys(unDeletedKeys).build()).build();
+              .setUnDeletedKeys(unDeletedKeys).build());
       omClientResponse =
           new OMKeysDeleteResponse(omResponse.build(), getBucketLayout());
       long endNanosDeleteKeyFailureLatencyNs = Time.monotonicNowNanos();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
index d120973eaef..1452999bb5c 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotDiffManager.java
@@ -715,9 +715,10 @@ SnapshotDiffReportOzone createPageResponse(
       final int pageSize
   ) throws IOException {
     if (!isBlank(index)) {
-      
DIFF_TYPE_STRING_MAP.values().stream().filter(index::startsWith).findFirst()
-          .orElseThrow(() -> new IOException("Token " + index + " has invalid 
prefix. Valid prefixes: "
-              + 
DIFF_TYPE_STRING_MAP.values().stream().map(String::valueOf).collect(Collectors.joining(","))));
+      if (DIFF_TYPE_STRING_MAP.values().stream().noneMatch(index::startsWith)) 
{
+        throw new IOException("Token " + index + " has invalid prefix. Valid 
prefixes: "
+            + 
DIFF_TYPE_STRING_MAP.values().stream().map(String::valueOf).collect(Collectors.joining(",")));
+      }
     }
 
     int idx;
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMMetadataReader.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMMetadataReader.java
index 547ce05e09b..99b4c861c19 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMMetadataReader.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOMMetadataReader.java
@@ -86,6 +86,7 @@ public void clearOmThreadLocals() {
   }
 
   @Test
+  @SuppressWarnings("CheckReturnValue")
   public void testGetClientAddress() throws Exception {
     try (MockedStatic<Server> ipcServerStaticMock = mockStatic(Server.class)) {
       // given
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java
index c2666804d57..3dd695ee8ff 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/TestOMClientRequestWithUserInfo.java
@@ -145,6 +145,7 @@ public void testUserInfoInCaseOfHadoopTransport() throws 
Exception {
   }
 
   @Test
+  @SuppressWarnings("CheckReturnValue")
   public void testUserInfoInCaseOfGrpcTransport() throws Exception {
     OMRequest s3SignedOMRequest = createRequestWithS3Credentials("AccessId",
         "Signature", "StringToSign");
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
index 353b04656e7..60a765a5510 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyCreateRequest.java
@@ -49,6 +49,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -1214,21 +1215,15 @@ public void testKeyCreateWithFileSystemPathsEnabled(
 
   @Test
   public void testPreExecuteWithInvalidKeyPrefix() throws Exception {
-    Map<String, String> invalidKeyScenarios = new HashMap<String, String>() {
-      {
-        put(OM_SNAPSHOT_INDICATOR + "/" + keyName,
-            "Cannot create key under path reserved for snapshot: "
-                + OM_SNAPSHOT_INDICATOR + OM_KEY_PREFIX);
-        put(OM_SNAPSHOT_INDICATOR + "/a/" + keyName,
-            "Cannot create key under path reserved for snapshot: "
-                + OM_SNAPSHOT_INDICATOR + OM_KEY_PREFIX);
-        put(OM_SNAPSHOT_INDICATOR + "/a/b" + keyName,
-            "Cannot create key under path reserved for snapshot: "
-                + OM_SNAPSHOT_INDICATOR + OM_KEY_PREFIX);
-        put(OM_SNAPSHOT_INDICATOR,
-            "Cannot create key with reserved name: " + OM_SNAPSHOT_INDICATOR);
-      }
-    };
+    Map<String, String> invalidKeyScenarios = ImmutableMap.of(
+        OM_SNAPSHOT_INDICATOR + "/" + keyName,
+        "Cannot create key under path reserved for snapshot: " + 
OM_SNAPSHOT_INDICATOR + OM_KEY_PREFIX,
+        OM_SNAPSHOT_INDICATOR + "/a/" + keyName,
+        "Cannot create key under path reserved for snapshot: " + 
OM_SNAPSHOT_INDICATOR + OM_KEY_PREFIX,
+        OM_SNAPSHOT_INDICATOR + "/a/b" + keyName,
+        "Cannot create key under path reserved for snapshot: " + 
OM_SNAPSHOT_INDICATOR + OM_KEY_PREFIX,
+        OM_SNAPSHOT_INDICATOR,
+        "Cannot create key with reserved name: " + OM_SNAPSHOT_INDICATOR);
 
     for (Map.Entry<String, String> entry : invalidKeyScenarios.entrySet()) {
       String invalidKeyName = entry.getKey();
@@ -1332,7 +1327,7 @@ public void testAtomicRewrite(
     // Retrieve the committed key info
     OmKeyInfo existingKeyInfo = 
omMetadataManager.getKeyTable(getBucketLayout()).get(getOzoneKey());
     List<OzoneAcl> existingAcls = existingKeyInfo.getAcls();
-    assertThat(existingAcls.containsAll(acls));
+    assertThat(existingAcls.containsAll(acls)).isTrue();
 
     // Create a request with a generation which doesn't match the current key
     omRequest = createKeyRequest(false, 0, 100,
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java
index 3d6a58dc1bd..ce60ee3ab6c 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMKeyPurgeRequestAndResponse.java
@@ -120,8 +120,6 @@ private OMRequest createPurgeKeysRequest(List<String> 
deletedKeys, List<String>
     if (snapshotDbKey != null) {
       purgeKeysRequest.setSnapshotTableKey(snapshotDbKey);
     }
-    purgeKeysRequest.build();
-
     return OMRequest.newBuilder()
         .setPurgeKeysRequest(purgeKeysRequest)
         .setCmdType(Type.PurgeKeys)
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOmSnapshotLocalDataManager.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOmSnapshotLocalDataManager.java
index 9aecb7b1f28..ef081c08873 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOmSnapshotLocalDataManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestOmSnapshotLocalDataManager.java
@@ -709,7 +709,8 @@ public void testNeedsDefrag(int previousVersion) throws 
IOException {
     }
     addVersionsToLocalData(localDataManager, snapshotIds.get(1), 
ImmutableMap.of(1, 3, 2, previousVersion));
     try (ReadableOmSnapshotLocalDataProvider snap = 
localDataManager.getOmSnapshotLocalData(snapshotIds.get(1))) {
-      assertEquals(previousVersion < 
snap.getPreviousSnapshotLocalData().orElse(null).getVersion(), 
snap.needsDefrag());
+      assertEquals(previousVersion < 
snap.getPreviousSnapshotLocalData().orElseThrow(AssertionError::new).getVersion(),
+          snap.needsDefrag());
     }
   }
 
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/BucketEndpoint.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/BucketEndpoint.java
index 0eb324e41bd..dc41298a4ca 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/BucketEndpoint.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/BucketEndpoint.java
@@ -46,7 +46,6 @@
 @Produces(MediaType.APPLICATION_JSON)
 public class BucketEndpoint {
 
-  @Inject
   private ReconOMMetadataManager omMetadataManager;
 
   @Inject
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/VolumeEndpoint.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/VolumeEndpoint.java
index 8df4b2b5a44..322db29a236 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/VolumeEndpoint.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/VolumeEndpoint.java
@@ -45,7 +45,6 @@
 @Produces(MediaType.APPLICATION_JSON)
 public class VolumeEndpoint {
 
-  @Inject
   private ReconOMMetadataManager omMetadataManager;
 
   @Inject
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java
index 25d8543ab27..230ed8a5f7d 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconContainerManager.java
@@ -328,11 +328,9 @@ public void updateContainerReplica(ContainerID containerID,
     // If replica doesn't exist in in-memory map, add to DB and add to map
     if (replicaLastSeenMap == null) {
       // putIfAbsent to avoid TOCTOU
-      replicaHistoryMap.putIfAbsent(cid,
-          new ConcurrentHashMap<DatanodeID, ContainerReplicaHistory>() {{
-            put(id, new ContainerReplicaHistory(id, currTime, currTime,
-                bcsId, state, checksums));
-          }});
+      Map<DatanodeID, ContainerReplicaHistory> newReplicaHistoryMap = new 
ConcurrentHashMap<>();
+      newReplicaHistoryMap.put(id, new ContainerReplicaHistory(id, currTime, 
currTime, bcsId, state, checksums));
+      replicaHistoryMap.putIfAbsent(cid, newReplicaHistoryMap);
       flushToDB = true;
     } else {
       // ContainerID exists, update timestamp in memory
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java
index e4a43a925ef..0e7510d5777 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/ReconContainerMetadataManagerImpl.java
@@ -513,13 +513,6 @@ private List<Pipeline> getPipelines(ContainerKeyPrefix 
containerKeyPrefix)
               .getSkipCache(containerKeyPrefix.getKeyPrefix());
     }
     List<Pipeline> pipelines = new ArrayList<>();
-    if (null != omKeyInfo) {
-      omKeyInfo.getKeyLocationVersions().stream().map(
-          omKeyLocationInfoGroup ->
-              omKeyLocationInfoGroup.createLocationList()
-                  .stream().map(omKeyLocationInfo -> pipelines.add(
-                      omKeyLocationInfo.getPipeline())));
-    }
     return pipelines;
   }
 
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
index db9301e4795..b7d2f4bf71a 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/api/TestEndpoints.java
@@ -580,7 +580,7 @@ public void setUp() throws Exception {
         9L, 8L, 7L, 21L);
 
     // Truncate global stats table before running each test
-    dslContext.truncate(GLOBAL_STATS);
+    dslContext.truncate(GLOBAL_STATS).execute();
   }
 
   private void testDatanodeResponse(DatanodeMetadata datanodeMetadata)
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconContainerManager.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconContainerManager.java
index 89ad99d77a3..a7faa2d64b2 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconContainerManager.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/scm/TestReconContainerManager.java
@@ -233,7 +233,7 @@ public void 
testOpenContainerNotUpdatedFromUnhealthyReplicaReports()
     for (State replicaState : new State[] {
         State.UNHEALTHY, State.INVALID, State.DELETED}) {
       ContainerWithPipeline containerWithPipeline =
-          getTestContainer(120L + replicaState.ordinal(), LifeCycleState.OPEN);
+          getTestContainer(120L + replicaState.getNumber(), 
LifeCycleState.OPEN);
       ContainerID containerID =
           containerWithPipeline.getContainerInfo().containerID();
       getContainerManager().addNewContainer(containerWithPipeline);
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java
index ce8ab5ce216..09a45ac9f3e 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerKeyMapperTask.java
@@ -30,6 +30,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
@@ -312,11 +313,8 @@ public void testKeyTableProcess() throws IOException {
         .setTable(omMetadataManager.getKeyTable(getBucketLayout()).getName())
         .build();
 
-    OMUpdateEventBatch omUpdateEventBatch = new OMUpdateEventBatch(new
-        ArrayList<OMDBUpdateEvent>() {{
-          add(keyEvent1);
-          add(keyEvent2);
-        }}, 0L);
+    OMUpdateEventBatch omUpdateEventBatch = new OMUpdateEventBatch(
+        new ArrayList<>(Arrays.asList(keyEvent1, keyEvent2)), 0L);
 
     ContainerKeyMapperTaskOBS containerKeyMapperTaskOBS =
         new ContainerKeyMapperTaskOBS(reconContainerMetadataManager,
@@ -423,12 +421,7 @@ public void testFileTableProcess() throws Exception {
         .build();
 
     OMUpdateEventBatch omUpdateEventBatch =
-        new OMUpdateEventBatch(new ArrayList<OMDBUpdateEvent>() {
-          {
-            add(keyEvent1);
-            add(keyEvent2);
-          }
-        }, 0L);
+        new OMUpdateEventBatch(new ArrayList<>(Arrays.asList(keyEvent1, 
keyEvent2)), 0L);
 
     // Process PUT event for both the keys
     containerKeyMapperTaskFSO.process(omUpdateEventBatch, 
Collections.emptyMap());
@@ -457,11 +450,7 @@ public void testFileTableProcess() throws Exception {
                 .getName())
         .build();
     OMUpdateEventBatch omUpdateEventBatch2 =
-        new OMUpdateEventBatch(new ArrayList<OMDBUpdateEvent>() {
-          {
-            add(keyEvent3);
-          }
-        }, 0L);
+        new OMUpdateEventBatch(new 
ArrayList<>(Collections.singletonList(keyEvent3)), 0L);
 
     // Process DELETE event for key2
     containerKeyMapperTaskFSO.process(omUpdateEventBatch2, 
Collections.emptyMap());
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerSizeCountTask.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerSizeCountTask.java
index de00a73af7c..e666f4f7c85 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerSizeCountTask.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestContainerSizeCountTask.java
@@ -77,7 +77,7 @@ public void setUp() {
         utilizationSchemaDefinition,
         reconTaskStatusUpdaterManager);
     // Truncate table before running each test
-    dslContext.truncate(CONTAINER_COUNT_BY_SIZE);
+    dslContext.truncate(CONTAINER_COUNT_BY_SIZE).execute();
   }
 
   @Test
diff --git 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmTableInsightTask.java
 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmTableInsightTask.java
index 9b5f3b0c1f9..cab1041efb4 100644
--- 
a/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmTableInsightTask.java
+++ 
b/hadoop-ozone/recon/src/test/java/org/apache/hadoop/ozone/recon/tasks/TestOmTableInsightTask.java
@@ -177,7 +177,7 @@ public void setUp() throws IOException {
     }
     MockitoAnnotations.openMocks(this);
     // Truncate table before running each test
-    dslContext.truncate(GLOBAL_STATS);
+    dslContext.truncate(GLOBAL_STATS).execute();
   }
 
   /**
diff --git 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
index 8bb2cf3fa62..2ae0f50df9a 100644
--- 
a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
+++ 
b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestMultipartUploadWithCopy.java
@@ -35,6 +35,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.google.common.collect.ImmutableMap;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -94,9 +95,8 @@ public static void setUp() throws Exception {
         .createKey(EXISTING_KEY, keyContent.length,
             ReplicationConfig.fromTypeAndFactor(ReplicationType.RATIS,
             ReplicationFactor.THREE),
-            new HashMap<String, String>() {{
-              put(OzoneConsts.ETAG, DigestUtils.md5Hex(EXISTING_KEY_CONTENT));
-            }}
+            ImmutableMap.of(OzoneConsts.ETAG,
+                DigestUtils.md5Hex(EXISTING_KEY_CONTENT))
         )) {
       stream.write(keyContent);
     }
diff --git a/pom.xml b/pom.xml
index c9a93ac3de2..1506a8c92b4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -78,6 +78,7 @@
     <dropwizard-metrics.version>3.2.6</dropwizard-metrics.version>
     <enforced.maven.version>[3.6.3,)</enforced.maven.version>
     <errorprone-annotations.version>2.29.2</errorprone-annotations.version>
+    <errorprone.version>2.42.0</errorprone.version>
     <!-- test groups excluded by default (without any manual profile 
activation) -->
     <excluded-test-groups>unhealthy | benchmark</excluded-test-groups>
     <exec-maven-plugin.version>3.6.3</exec-maven-plugin.version>
@@ -2576,6 +2577,48 @@
   </distributionManagement>
 
   <profiles>
+    <profile>
+      <id>errorprone</id>
+      <build>
+        <plugins>
+          <plugin>
+            <groupId>org.apache.maven.plugins</groupId>
+            <artifactId>maven-compiler-plugin</artifactId>
+            <configuration>
+              <fork>true</fork>
+              <annotationProcessorPaths combine.children="append">
+                <path>
+                  <groupId>com.google.errorprone</groupId>
+                  <artifactId>error_prone_core</artifactId>
+                  <version>${errorprone.version}</version>
+                </path>
+              </annotationProcessorPaths>
+              <compilerArgs combine.children="append">
+                <arg>-XDaddTypeAnnotationsToSymbol=true</arg>
+                <arg>-XDcompilePolicy=simple</arg>
+                <arg>--should-stop=ifError=FLOW</arg>
+                <arg>-Xplugin:ErrorProne -XepDisableWarningsInGeneratedCode 
-XepExcludedPaths:^(?!.*ozonefs-hadoop2/target/generated-sources/java/).*/target/generated(-test)?-sources/.*</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
+                
<arg>-J--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED</arg>
+                
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED</arg>
+                
<arg>-J--add-opens=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED</arg>
+                <!-- Forces the compiler process to output in English -->
+                <arg>-J-Duser.language=en</arg>
+                <arg>-J-Duser.country=US</arg>
+              </compilerArgs>
+            </configuration>
+          </plugin>
+        </plugins>
+      </build>
+    </profile>
     <profile>
       <id>dist</id>
       <build>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to