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

ChenSammi pushed a commit to branch HDDS-10685
in repository https://gitbox.apache.org/repos/asf/ozone.git

commit 1ea7e9e7985cf5d5938df4db253d6e78fada1a52
Merge: 277737474cd cca31ff7206
Author: Sammi Chen <[email protected]>
AuthorDate: Wed Jul 22 17:30:44 2026 +0800

    Merge remote-tracking branch 'origin/master' into HDDS-10685

 .github/workflows/build-ratis.yml                  |    2 +-
 .github/workflows/check.yml                        |    2 +-
 .github/workflows/ci.yml                           |    2 +-
 .github/workflows/close-stale-prs.yaml             |    2 +-
 .github/workflows/intermittent-test-check.yml      |    4 +-
 .github/workflows/populate-cache.yml               |    4 +-
 .github/workflows/repeat-acceptance.yml            |    4 +-
 .run/CsiServer.run.xml                             |   33 -
 .../apache/hadoop/hdds/scm/XceiverClientGrpc.java  |   40 +-
 .../hadoop/hdds/scm/storage/BlockOutputStream.java |   16 +-
 .../hdds/scm/storage/ECBlockOutputStream.java      |   25 +-
 .../hdds/scm/storage/StreamBlockInputStream.java   |    9 +-
 .../TestXceiverClientManagerCloseContention.java   |  161 +
 .../hdds/scm/client/TestHddsClientUtils.java       |   37 +
 .../storage/TestBlockOutputStreamCorrectness.java  |   52 +-
 .../scm/storage/TestStreamBlockInputStream.java    |  156 +
 hadoop-hdds/common/src/main/conf/ozone-env.sh      |   19 +-
 .../java/org/apache/hadoop/hdds/HddsUtils.java     |   21 +-
 .../hadoop/hdds/conf/OzoneConfiguration.java       |    1 -
 .../org/apache/hadoop/hdds/scm/ScmConfigKeys.java  |    3 +
 .../hdds/scm/storage/ContainerProtocolCalls.java   |   35 +-
 .../java/org/apache/hadoop/ozone/OzoneConsts.java  |    9 +
 .../common/src/main/resources/ozone-default.xml    |  117 +
 .../java/org/apache/hadoop/hdds/TestHddsUtils.java |   19 +
 .../container/common/helpers/ContainerUtils.java   |   26 +
 .../ozone/container/common/impl/ContainerSet.java  |   95 +-
 .../container/common/impl/HddsDispatcher.java      |   16 +-
 .../common/interfaces/ContainerDispatcher.java     |    6 +-
 .../ozone/container/common/interfaces/Handler.java |    4 +-
 .../server/ratis/ContainerStateMachine.java        |   20 +-
 .../diskbalancer/DiskBalancerService.java          |   17 +-
 .../ECReconstructionCoordinator.java               |    3 +-
 .../ozone/container/keyvalue/KeyValueHandler.java  |   15 +-
 .../keyvalue/impl/ChunkManagerDispatcher.java      |    8 +-
 .../keyvalue/impl/FilePerBlockStrategy.java        |    8 +-
 .../keyvalue/impl/KeyValueStreamDataChannel.java   |  104 +-
 .../keyvalue/impl/StreamDataChannelBase.java       |   16 +
 .../keyvalue/interfaces/ChunkManager.java          |    5 +-
 .../StaleRecoveringContainerScrubbingService.java  |   21 +-
 .../ContainerTableSchemaFinalizeAction.java        |    2 +-
 ...stStaleRecoveringContainerScrubbingService.java |   50 +
 .../container/common/impl/TestHddsDispatcher.java  |   75 +
 .../diskbalancer/TestDiskBalancerService.java      |   43 +
 .../impl/TestKeyValueStreamDataChannel.java        |  139 +-
 hadoop-hdds/docs/content/design/diskbalancer.md    |   12 +-
 .../docs/content/design/lifecycle-task-resume.md   |   80 +
 .../design/s3-object-lifecycle-management.md       |   29 +
 hadoop-hdds/docs/content/feature/DiskBalancer.md   |   37 +-
 .../docs/content/feature/DiskBalancer.zh.md        |   34 +-
 hadoop-hdds/docs/content/feature/Lifecycle.md      |  397 +
 hadoop-hdds/docs/content/feature/Lifecycle.zh.md   |  396 +
 hadoop-hdds/docs/content/interface/CSI.md          |   93 -
 hadoop-hdds/docs/content/interface/CSI.png         |  Bin 27210 -> 0 bytes
 hadoop-hdds/docs/content/interface/CSI.zh.md       |   92 -
 hadoop-hdds/docs/content/tools/Admin.md            |    4 +-
 hadoop-hdds/docs/content/tools/Repair.md           |    4 +-
 .../org/apache/hadoop/hdds/utils/Archiver.java     |   76 +
 .../hadoop/hdds/utils/DBCheckpointServlet.java     |   10 +-
 .../hadoop/hdds/utils/RDBSnapshotProvider.java     |    2 +-
 .../org/apache/hadoop/hdds/utils/TestArchiver.java |   40 +
 .../src/main/proto/ScmAdminProtocol.proto          |    3 +
 .../interface-admin/src/main/resources/proto.lock  |   18 +
 .../src/main/proto/DatanodeClientProtocol.proto    |    4 +
 .../utils/{TestUtils.java => RocksTestUtils.java}  |    4 +-
 .../utils/db/TestManagedRawSSTFileIterator.java    |    4 +-
 .../hadoop/hdds/utils/db/TestSstFileSetReader.java |    6 +-
 .../container/AbstractContainerReportHandler.java  |   26 +-
 .../hdds/scm/container/ContainerManager.java       |    4 +-
 .../hdds/scm/container/ContainerManagerImpl.java   |    5 +-
 .../hdds/scm/container/ContainerStateManager.java  |    5 +-
 .../scm/container/ContainerStateManagerImpl.java   |    5 +-
 .../scm/container/balancer/ContainerBalancer.java  |   19 +-
 .../balancer/ContainerBalancerStatusInfo.java      |   43 +-
 .../balancer/ContainerBalancerStopReason.java      |   63 +
 .../container/balancer/ContainerBalancerTask.java  |  143 +-
 .../SCMContainerPlacementRackScatter.java          |   49 +-
 .../scm/container/states/ContainerStateMap.java    |   49 +-
 .../apache/hadoop/hdds/scm/ha/SCMStateMachine.java |  135 +-
 .../ha/invoker/ContainerStateManagerInvoker.java   |   83 +-
 .../scm/pipeline/PipelineStateManagerImpl.java     |    2 +-
 .../hadoop/hdds/scm/pipeline/PipelineStateMap.java |  263 +-
 .../hdds/scm/server/SCMClientProtocolServer.java   |   15 +-
 .../hdds/scm/server/StorageContainerManager.java   |    9 +-
 .../scm/container/TestContainerStateManager.java   |    2 +-
 .../container/balancer/TestContainerBalancer.java  |   43 +
 .../balancer/TestContainerBalancerStatusInfo.java  |   66 +
 .../balancer/TestContainerBalancerTask.java        |   58 +
 .../TestSCMContainerPlacementRackScatter.java      |   34 +
 .../container/states/TestContainerStateMap.java    |  102 +-
 hadoop-ozone/cli-admin/pom.xml                     |    4 +
 .../scm/cli/ContainerBalancerStatusSubcommand.java |  133 +-
 .../datanode/AbstractDiskBalancerSubCommand.java   |  162 +-
 .../hdds/scm/cli/datanode/DatanodeParameters.java  |    3 +-
 .../scm/cli/datanode/DiskBalancerCommands.java     |   31 +-
 .../cli/datanode/DiskBalancerCommonOptions.java    |   12 +
 .../cli/datanode/DiskBalancerReportSubcommand.java |   35 +-
 .../cli/datanode/DiskBalancerStatusSubcommand.java |   46 +-
 .../cli/datanode/DiskBalancerSubCommandUtil.java   |  139 +-
 .../ozone/admin/om/LifecycleResumeSubCommand.java  |   73 +
 .../ozone/admin/om/LifecycleStatusSubCommand.java  |   89 +
 .../ozone/admin/om/LifecycleSubCommand.java}       |   37 +-
 .../ozone/admin/om/LifecycleSuspendSubCommand.java |   76 +
 .../org/apache/hadoop/ozone/admin/om/OMAdmin.java  |    3 +-
 .../ozone/admin/om/snapshot/DefragSubCommand.java  |   11 +-
 .../datanode/TestContainerBalancerSubCommand.java  |  242 +-
 .../datanode/TestDiskBalancerSubCommandUtil.java   |  135 +
 .../cli/datanode/TestDiskBalancerSubCommands.java  |  345 +-
 .../admin/om/snapshot/TestDefragSubCommand.java    |   22 +
 .../container/analyze/AnalyzeSubcommand.java       |  234 +-
 .../analyze/ScmContainerMetadataReader.java        |  155 +
 .../ozone/debug/om/ContainerToKeyMapping.java      |   19 +-
 .../apache/hadoop/ozone/fsck/ContainerMapper.java  |    3 +-
 .../analyze/ContainerAnalyzeTestHelper.java        |   37 +
 .../container/analyze/TestAnalyzeSubcommand.java   |  188 +-
 .../analyze/TestScmContainerMetadataReader.java    |  100 +
 .../schemaupgrade/UpgradeContainerSchema.java      |    3 +-
 .../ozone/repair/ldb/RocksDBManualCompaction.java  |   15 +-
 .../apache/hadoop/ozone/repair/om/CompactOMDB.java |   25 +-
 .../hadoop/ozone/repair/om/FSORepairTool.java      |   25 +-
 .../hadoop/ozone/repair/ldb/TestLdbRepair.java     |    2 +-
 .../hadoop/ozone/repair/om/TestCompactOMDB.java    |   12 +
 .../hadoop/ozone/shell/keys/DeleteKeyHandler.java  |    4 +-
 .../apache/hadoop/ozone/client/OzoneBucket.java    |   50 +
 .../ozone/client/OzoneLifecycleConfiguration.java  |  230 +
 .../ozone/client/protocol/ClientProtocol.java      |   67 +-
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  |   60 +-
 .../hadoop/ozone/client/TestOzoneBucket.java       |   72 +
 .../client/TestRpcClientGetFileStatusHeadOp.java   |   93 +
 hadoop-ozone/common/pom.xml                        |    4 +
 .../apache/hadoop/fs/ozone/OzoneTrashPolicy.java   |    2 +-
 .../main/java/org/apache/hadoop/ozone/OmUtils.java |   12 +
 .../org/apache/hadoop/ozone/om/OMConfigKeys.java   |   65 +
 .../hadoop/ozone/om/exceptions/OMException.java    |    3 +
 .../apache/hadoop/ozone/om/helpers/OmKeyInfo.java  |   71 +-
 .../OmLCAbortIncompleteMultipartUpload.java        |  139 +
 .../apache/hadoop/ozone/om/helpers/OmLCAction.java |   59 +
 .../hadoop/ozone/om/helpers/OmLCExpiration.java    |  215 +
 .../apache/hadoop/ozone/om/helpers/OmLCFilter.java |  235 +
 .../apache/hadoop/ozone/om/helpers/OmLCRule.java   |  411 +
 .../ozone/om/helpers/OmLifecycleConfiguration.java |  334 +
 .../om/helpers/OmLifecycleRuleAndOperator.java     |  214 +
 .../ozone/om/helpers/OmLifecycleScanState.java     |  255 +
 .../hadoop/ozone/om/helpers/OmLifecycleUtils.java  |  131 +
 .../hadoop/ozone/om/helpers/OzoneFSUtils.java      |   72 +
 .../hadoop/ozone/om/helpers/RepeatedOmKeyInfo.java |   44 +-
 .../ozone/om/protocol/OzoneManagerProtocol.java    |   65 +
 ...OzoneManagerProtocolClientSideTranslatorPB.java |  103 +
 .../apache/hadoop/ozone/om/helpers/OMLCUtils.java  |  131 +
 .../TestOmLCAbortIncompleteMultipartUpload.java    |  171 +
 .../ozone/om/helpers/TestOmLCExpiration.java       |  198 +
 .../hadoop/ozone/om/helpers/TestOmLCFilter.java    |  159 +
 .../hadoop/ozone/om/helpers/TestOmLCRule.java      |  459 +
 .../om/helpers/TestOmLifeCycleConfiguration.java   |  266 +
 .../om/helpers/TestOmLifecycleRuleAndOperator.java |  139 +
 .../ozone/om/helpers/TestOmLifecycleScanState.java |   79 +
 .../csi/dev-support/findbugsExcludeFile.xml        |   22 -
 hadoop-ozone/csi/pom.xml                           |  290 -
 .../apache/hadoop/ozone/csi/ControllerService.java |  116 -
 .../org/apache/hadoop/ozone/csi/CsiServer.java     |  177 -
 .../apache/hadoop/ozone/csi/IdentityService.java   |   72 -
 .../org/apache/hadoop/ozone/csi/NodeService.java   |  148 -
 hadoop-ozone/csi/src/main/proto/csi.proto          | 1323 ---
 hadoop-ozone/csi/src/main/resources/proto.lock     | 1479 ---
 .../dev-support/intellij/ozone-site-ha.xml         |   10 +-
 hadoop-ozone/dev-support/intellij/ozone-site.xml   |    8 -
 .../dist/dev-support/bin/dist-layout-stitching     |    4 +-
 hadoop-ozone/dist/pom.xml                          |    5 -
 .../Datanode Chunk Read_Write Dashboard.json       | 1601 ----
 .../dashboards/Ozone - DataNode Overview.json      | 9417 ++++++++++++++++++++
 hadoop-ozone/dist/src/main/compose/ozone-csi/.env  |   20 -
 .../src/main/compose/ozone-csi/docker-compose.yaml |   64 -
 .../dist/src/main/compose/ozone-csi/docker-config  |   44 -
 .../dist/src/main/compose/ozone-ha/docker-config   |   26 +
 .../dist/src/main/compose/ozone/docker-config      |   14 +-
 .../src/main/compose/ozonesecure-ha/docker-config  |    6 +
 .../test-om-lifecycle.sh}                          |   15 +-
 .../compose/ozonesecure-ha/test-repair-tools.sh    |    2 +-
 .../src/main/compose/ozonesecure/docker-config     |   26 +
 hadoop-ozone/dist/src/main/compose/upgrade/test.sh |    7 +-
 .../dist/src/main/compose/xcompat/clients.yaml     |    4 +
 hadoop-ozone/dist/src/main/compose/xcompat/lib.sh  |    2 +-
 .../k8s/definitions/ozone-csi/csi-controller.yaml  |   53 -
 .../main/k8s/definitions/ozone-csi/csi-crd.yaml    |   21 -
 .../main/k8s/definitions/ozone-csi/csi-node.yaml   |   95 -
 .../main/k8s/definitions/ozone-csi/csi-rbac.yaml   |   66 -
 .../definitions/ozone-csi/csi-storageclass.yaml    |   20 -
 .../k8s/definitions/ozone-csi/definitions/csi.yaml |   28 -
 .../k8s/definitions/test-webserver/flekszible.yaml |   16 -
 .../test-webserver/webserver-deployment.yaml       |   50 -
 .../test-webserver/webserver-service.yaml          |   29 -
 .../test-webserver/webserver-volume.yaml           |   29 -
 .../src/main/k8s/examples/ozone-dev/Flekszible     |    7 -
 .../k8s/examples/ozone-dev/config-configmap.yaml   |    6 +-
 .../examples/ozone-dev/csi/csi-node-daemonset.yaml |   97 -
 .../ozone-dev/csi/csi-ozone-clusterrole.yaml       |   98 -
 .../csi/csi-ozone-clusterrolebinding.yaml          |   28 -
 .../ozone-dev/csi/csi-ozone-serviceaccount.yaml    |   21 -
 .../ozone-dev/csi/csi-provisioner-deployment.yaml  |   54 -
 .../csi/org.apache.hadoop.ozone-csidriver.yaml     |   22 -
 .../examples/ozone-dev/csi/ozone-storageclass.yaml |   21 -
 .../ozone-csi-test-webserver-deployment.yaml       |   50 -
 ...e-csi-test-webserver-persistentvolumeclaim.yaml |   29 -
 .../pv-test/ozone-csi-test-webserver-service.yaml  |   29 -
 .../dist/src/main/k8s/examples/ozone/Flekszible    |    5 -
 .../main/k8s/examples/ozone/config-configmap.yaml  |    6 +-
 .../k8s/examples/ozone/csi/csi-node-daemonset.yaml |   97 -
 .../examples/ozone/csi/csi-ozone-clusterrole.yaml  |   98 -
 .../ozone/csi/csi-ozone-clusterrolebinding.yaml    |   28 -
 .../ozone/csi/csi-ozone-serviceaccount.yaml        |   21 -
 .../ozone/csi/csi-provisioner-deployment.yaml      |   54 -
 .../csi/org.apache.hadoop.ozone-csidriver.yaml     |   22 -
 .../k8s/examples/ozone/csi/ozone-storageclass.yaml |   21 -
 .../ozone-csi-test-webserver-deployment.yaml       |   50 -
 ...e-csi-test-webserver-persistentvolumeclaim.yaml |   29 -
 .../pv-test/ozone-csi-test-webserver-service.yaml  |   29 -
 hadoop-ozone/dist/src/main/license/jar-report.txt  |    2 -
 .../src/main/smoketest/balancer/testBalancer.robot |    2 +-
 .../main/smoketest/lifecycle/om-lifecycle.robot    |  119 +
 .../src/main/smoketest/s3/bucketlifecycle.robot    |   57 +
 .../dist/src/main/smoketest/s3/objectputget.robot  |   10 +-
 hadoop-ozone/dist/src/shell/ozone/ozone            |    9 +-
 .../dist/src/shell/ozone/ozone-functions.sh        |   25 +-
 .../csi.robot => test/shell/ozone_bootstrap.bats}  |   43 +-
 hadoop-ozone/iceberg/pom.xml                       |    2 +-
 .../AbstractTestStorageDistributionEndpoint.java   |   14 +-
 ...ndpointUtil.java => ReconEndpointTestUtil.java} |    6 +-
 .../ozone/recon/TestReconAndAdminContainerCLI.java |   36 +-
 .../ozone/recon/TestReconWithOzoneManagerHA.java   |    9 -
 hadoop-ozone/integration-test-s3/pom.xml           |   12 +-
 .../hadoop/ozone/s3/awssdk/OzoneS3SDKTests.java    |   11 +
 .../hadoop/ozone/s3/awssdk/S3SDKTestUtils.java     |   59 +
 .../ozone/s3/awssdk/v1/AbstractS3SDKV1Tests.java   |  508 +-
 .../ozone/s3/awssdk/v2/AbstractS3SDKV2Tests.java   |  475 +-
 hadoop-ozone/integration-test/pom.xml              |    5 -
 .../fs/ozone/AbstractOzoneFileSystemTest.java      |   44 +
 .../ozone/AbstractRootedOzoneFileSystemTest.java   |   89 +-
 .../AbstractRootedOzoneFileSystemTestWithFSO.java  |    3 +-
 .../java/org/apache/hadoop/fs/ozone/TestHSync.java |    4 +-
 .../fs/ozone/TestOFSIsDirectoryBenchmark.java      |  153 +
 .../apache/hadoop/fs/ozone/TestOzoneFsHAURLs.java  |    6 +-
 .../hdds/scm/TestContainerReportWithKeys.java      |    7 +-
 .../TestSCMFollowerCatchupWithContainerReport.java |  336 +
 .../hdds/scm/TestStorageContainerManager.java      |    4 +-
 .../TestReplicationManagerIntegration.java         |    8 +-
 .../node/{TestNodeUtil.java => NodeTestUtil.java}  |    4 +-
 .../scm/node/TestDecommissionAndMaintenance.java   |   16 +-
 .../hdds/scm/safemode/TestSafeModeSCMHA.java       |   18 +-
 ...UpgradeUtils.java => HddsUpgradeTestUtils.java} |    6 +-
 .../TestDNDataDistributionFinalization.java        |    4 +-
 .../hadoop/hdds/upgrade/TestHDDSUpgrade.java       |   24 +-
 .../TestScmDataDistributionFinalization.java       |   12 +-
 .../hadoop/hdds/upgrade/TestScmHAFinalization.java |   20 +-
 .../java/org/apache/hadoop/ozone/TestDataUtil.java |    9 +-
 .../ozone/client/rpc/OzoneRpcClientTests.java      |  224 +-
 .../client/rpc/TestFailureHandlingByClient.java    |   13 +-
 .../client/rpc/TestOzoneAtRestEncryption.java      |    2 +-
 .../rpc/TestOzoneClientMultipartUploadWithFSO.java |   67 +-
 .../rpc/TestOzoneRpcClientForAclAuditLog.java      |    6 +-
 .../client/rpc/read/TestChunkInputStream.java      |   10 +-
 .../ozone/client/rpc/read/TestKeyInputStream.java  |   28 +-
 .../client/rpc/read/TestLocalChunkInputStream.java |    6 +-
 .../rpc/read/TestStreamBlockInputStream.java       |   10 +-
 .../ozone/client/rpc/read/TestStreamRead.java      |    6 +-
 .../rpc/read/TestStreamReadDatanodeFailover.java   |    4 +-
 .../commandhandler/TestDeleteContainerHandler.java |    2 +-
 .../ozone/local/TestLocalOzoneClusterRuntime.java  |   32 +-
 .../ozone/om/AbstractOzoneManagerHATest.java       |   11 +-
 .../om/{TestBucket.java => BucketForTesting.java}  |   16 +-
 .../hadoop/ozone/om/TestAddRemoveOzoneManager.java |    6 +-
 .../apache/hadoop/ozone/om/TestKeyManagerImpl.java |   12 +-
 .../hadoop/ozone/om/TestListKeysWithFSO.java       |   12 +-
 .../apache/hadoop/ozone/om/TestOMBootstrap.java    |    5 +-
 .../hadoop/ozone/om/TestOMDbCheckpointServlet.java |   35 +-
 .../TestOMDbCheckpointServletInodeBasedXfer.java   |   80 +-
 .../ozone/om/TestOMRatisSnapshotTransfer.java      |    5 +-
 .../hadoop/ozone/om/TestOMRatisSnapshots.java      |    5 +-
 .../hadoop/ozone/om/TestObjectStoreWithFSO.java    |    8 +-
 .../hadoop/ozone/om/TestOmBlockVersioning.java     |   13 +-
 .../org/apache/hadoop/ozone/om/TestOmMetrics.java  |   14 +-
 ...stOzoneManagerHAFollowerReadWithAllRunning.java |    7 +-
 .../ozone/om/TestOzoneManagerHAWithAllRunning.java |   13 +-
 .../om/TestOzoneManagerHAWithStoppedNodes.java     |    9 +-
 .../hadoop/ozone/om/TestOzoneManagerRestart.java   |   20 +-
 .../hadoop/ozone/om/TestRecursiveAclWithFSO.java   |    6 +-
 .../apache/hadoop/ozone/om/TestScmSafeMode.java    |    8 +-
 .../ozone/om/service/TestBlockDeletionService.java |    4 +-
 .../ozone/om/service/TestRootedDDSWithFSO.java     |    9 +-
 ...TestSnapshotDeletingServiceIntegrationTest.java |    8 +-
 .../hadoop/ozone/om/snapshot/OmSnapshotTests.java  |   43 +-
 .../ozone/om/snapshot/TestOMDBCheckpointUtils.java |   17 +
 .../ozone/om/snapshot/TestOmSnapshotDisabled.java  |    8 +-
 .../om/snapshot/TestOmSnapshotDisabledRestart.java |    8 +-
 .../om/snapshot/TestOzoneManagerHASnapshot.java    |   25 +-
 .../snapshot/TestOzoneManagerSnapshotProvider.java |    5 +-
 .../hadoop/ozone/scm/node/TestDiskBalancer.java    |    4 +-
 ...skBalancerDuringDecommissionAndMaintenance.java |    4 +-
 .../hadoop/ozone/shell/TestOzoneShellHA.java       |   76 +
 .../src/main/proto/OmClientProtocol.proto          |  177 +-
 .../apache/hadoop/ozone/om/OMMetadataManager.java  |   30 +-
 .../ozone/om/helpers/TestOmKeyInfoCodec.java       |  132 +-
 .../om/helpers/TestRepeatedOmKeyInfoCodec.java     |  109 +-
 .../org/apache/hadoop/ozone/audit/OMAction.java    |    8 +-
 .../org/apache/hadoop/ozone/om/KeyManager.java     |   11 +-
 .../org/apache/hadoop/ozone/om/KeyManagerImpl.java |   74 +-
 .../org/apache/hadoop/ozone/om/ListIterator.java   |    3 +-
 .../hadoop/ozone/om/OMDBCheckpointServlet.java     |   67 +-
 .../om/OMDBCheckpointServletInodeBasedXfer.java    |   28 +-
 .../java/org/apache/hadoop/ozone/om/OMMetrics.java |   56 +
 .../hadoop/ozone/om/OMMultiTenantManagerImpl.java  |    4 +-
 .../hadoop/ozone/om/OmMetadataManagerImpl.java     |   99 +-
 .../apache/hadoop/ozone/om/OmSnapshotManager.java  |    4 +
 .../org/apache/hadoop/ozone/om/OzoneManager.java   |   92 +-
 .../hadoop/ozone/om/SnapshotChainManager.java      |    2 +-
 .../hadoop/ozone/om/SstFilteringService.java       |    3 +-
 .../hadoop/ozone/om/TrashOzoneFileSystem.java      |    1 +
 .../hadoop/ozone/om/codec/OMDBDefinition.java      |   70 +-
 .../hadoop/ozone/om/helpers/OMAuditLogger.java     |    1 +
 .../om/ratis/utils/OzoneManagerRatisUtils.java     |   12 +
 .../om/ratis_snapshot/OmRatisSnapshotProvider.java |  300 +-
 .../hadoop/ozone/om/request/OMClientRequest.java   |   39 +-
 .../ozone/om/request/OMClientRequestUtils.java     |    2 +-
 .../om/request/bucket/OMBucketDeleteRequest.java   |   18 +-
 .../file/OMDirectoryCreateRequestWithFSO.java      |    4 +-
 .../ozone/om/request/file/OMFileRequest.java       |    2 +-
 .../om/request/key/OMAllocateBlockRequest.java     |    4 +-
 .../key/OMDirectoriesPurgeRequestWithFSO.java      |    2 +
 .../ozone/om/request/key/OMKeyCommitRequest.java   |    3 -
 .../om/request/key/OMKeyCommitRequestWithFSO.java  |    4 +-
 .../ozone/om/request/key/OMKeyDeleteRequest.java   |    2 +-
 .../ozone/om/request/key/OMKeyRenameRequest.java   |    2 +-
 .../om/request/key/OMKeyRenameRequestWithFSO.java  |    8 +
 .../ozone/om/request/key/OMKeysDeleteRequest.java  |  109 +-
 .../om/request/key/OmKeysDeleteRequestWithFSO.java |    6 +-
 .../OMLifecycleConfigurationDeleteRequest.java     |  209 +
 .../OMLifecycleConfigurationSetRequest.java        |  238 +
 .../lifecycle/OMLifecycleSaveScanStateRequest.java |   74 +
 .../OMLifecycleSetServiceStatusRequest.java        |  125 +
 .../ozone/om/request/lifecycle}/package-info.java  |    4 +-
 .../om/request/util/OMMultipartUploadUtils.java    |    3 +-
 .../om/request/volume/OMQuotaRepairRequest.java    |    2 +-
 .../om/response/bucket/OMBucketDeleteResponse.java |   11 +-
 .../om/response/key/OMKeysDeleteResponse.java      |   17 +-
 .../response/key/OMKeysDeleteResponseWithFSO.java  |   15 +-
 .../OMLifecycleConfigurationDeleteResponse.java    |   64 +
 .../OMLifecycleConfigurationSetResponse.java       |   67 +
 .../OMLifecycleSaveScanStateResponse.java          |   51 +
 .../OMLifecycleSetServiceStatusResponse.java       |   46 +
 .../ozone/om/response/lifecycle}/package-info.java |    4 +-
 .../hadoop/ozone/om/service/CompactDBUtil.java     |   19 +
 .../hadoop/ozone/om/service/CompactionService.java |   12 +-
 .../ozone/om/service/DirectoryDeletingService.java |    5 +-
 .../ozone/om/service/KeyLifecycleService.java      | 2131 +++++
 .../om/service/KeyLifecycleServiceMetrics.java     |  196 +
 .../ozone/om/service/OMRangerBGSyncService.java    |    4 +-
 .../om/snapshot/FSODirectoryPathResolver.java      |    3 +-
 .../ozone/om/snapshot/OMDBCheckpointUtils.java     |   74 +-
 .../om/snapshot/defrag/SnapshotDefragService.java  |   35 +-
 .../hadoop/ozone/om/upgrade/OMLayoutFeature.java   |    3 +-
 .../protocolPB/OzoneManagerRequestHandler.java     |   47 +-
 .../apache/hadoop/ozone/om/FaultInjectorImpl.java  |   98 +
 .../hadoop/ozone/om/TestOmMetadataManager.java     |   39 +-
 .../TestOmRatisSnapshotProvider.java               |   59 +
 .../TestOMClientRequestUserInfoFallback.java       |  106 -
 .../om/request/key/TestOMKeyCommitRequest.java     |    6 +-
 .../om/request/key/TestOMKeysDeleteRequest.java    |  158 +-
 .../key/TestOMKeysDeleteRequestWithFSO.java        |   77 +-
 .../TestOMLifecycleConfigurationDeleteRequest.java |  300 +
 .../TestOMLifecycleConfigurationRequest.java       |  153 +
 .../TestOMLifecycleConfigurationSetRequest.java    |  390 +
 .../TestOMLifecycleSaveScanStateRequest.java       |  118 +
 .../TestS3MultipartUploadCompleteRequest.java      |    2 +-
 .../snapshot/TestOMSnapshotCreateRequest.java      |    6 +-
 .../ozone/om/response/TestCleanupTableInfo.java    |    2 +
 .../om/response/key/TestOMKeyCommitResponse.java   |    2 +-
 .../om/response/key/TestOMKeyDeleteResponse.java   |    2 +-
 .../om/response/key/TestOMKeysDeleteResponse.java  |    2 +-
 .../key/TestOMKeysDeleteResponseWithFSO.java       |    2 +-
 ...TestOMLifecycleConfigurationDeleteResponse.java |  117 +
 .../TestOMLifecycleConfigurationSetResponse.java   |  124 +
 .../TestOMLifecycleSaveScanStateResponse.java      |   61 +
 .../TestS3MultipartUploadCommitPartResponse.java   |    2 +-
 .../hadoop/ozone/om/service/TestCompactDBUtil.java |   92 +
 .../ozone/om/service/TestCompactionService.java    |   33 +
 .../ozone/om/service/TestKeyDeletingService.java   |    2 +-
 .../ozone/om/service/TestKeyLifecycleService.java  | 3343 +++++++
 .../om/snapshot/TestFSODirectoryPathResolver.java  |    2 +-
 .../ozone/om/snapshot/TestSnapshotDiffManager.java |    2 +
 .../om/snapshot/TestSnapshotDiffValueParser.java   |   22 +-
 .../snapshot/defrag/TestSnapshotDefragService.java |  216 +-
 .../protocolPB/TestOzoneManagerRequestHandler.java |   83 +
 .../fs/ozone/BasicOzoneClientAdapterImpl.java      |   29 +-
 .../hadoop/fs/ozone/BasicOzoneFileSystem.java      |  125 +-
 .../ozone/BasicRootedOzoneClientAdapterImpl.java   |   73 +-
 .../fs/ozone/BasicRootedOzoneFileSystem.java       |   67 +-
 .../apache/hadoop/fs/ozone/FileStatusAdapter.java  |   20 +
 .../apache/hadoop/fs/ozone/OzoneClientAdapter.java |   11 +
 .../ozone/TestBasicOzoneClientAdapterHeadOp.java   |  136 +
 .../TestBasicRootedOzoneClientAdapterHeadOp.java   |  176 +
 .../hadoop/fs/ozone/TestOzoneFileSystemHeadOp.java |  149 +
 .../fs/ozone/TestRootedOzoneFileSystemHeadOp.java  |  174 +
 .../apache/hadoop/fs/ozone/OzoneFileSystem.java    |    8 +
 .../hadoop/fs/ozone/RootedOzoneFileSystem.java     |    8 +
 .../apache/hadoop/fs/ozone/OzoneFileSystem.java    |    8 +
 .../hadoop/fs/ozone/RootedOzoneFileSystem.java     |    8 +
 hadoop-ozone/pom.xml                               |    1 -
 .../org/apache/hadoop/ozone/recon/ReconUtils.java  |    2 +-
 .../ozone/recon/api/OMDBInsightEndpoint.java       |    3 +-
 .../ozone/recon/api/ReconGlobalMetricsService.java |    4 +-
 .../ozone/recon/api/handlers/FSOBucketHandler.java |    3 +-
 .../recon/api/handlers/LegacyBucketHandler.java    |    5 +-
 .../ozone/recon/api/handlers/OBSBucketHandler.java |    8 +-
 .../ozone/recon/chatbot/ChatbotConfigKeys.java     |   20 +
 .../recon/chatbot/llm/LangChain4jDispatcher.java   |   27 +
 .../recon/recovery/ReconOmMetadataManagerImpl.java |    8 +-
 .../hadoop/ozone/recon/scm/ReconNodeManager.java   |    6 +-
 .../scm/ReconStorageContainerManagerFacade.java    |    3 +-
 .../spi/impl/OzoneManagerServiceProviderImpl.java  |  204 +-
 .../impl/ReconContainerMetadataManagerImpl.java    |    8 +-
 .../ozone/recon/spi/impl/ReconDBProvider.java      |    3 +-
 .../recon/spi/impl/ReconRDBSnapshotProvider.java   |  245 +
 .../recon/tasks/ContainerKeyMapperHelper.java      |    2 +-
 .../recon/tasks/DeletedKeysInsightHandler.java     |    2 +-
 .../recon/tasks/MultipartInfoInsightHandler.java   |    2 +-
 .../ozone/recon/tasks/NSSummaryTaskWithLegacy.java |    3 +-
 .../ozone/recon/tasks/OpenKeysInsightHandler.java  |    2 +-
 .../tasks/util/ParallelTableIteratorOperation.java |    4 +-
 .../ozone/recon/api/TestTriggerDBSyncEndpoint.java |    1 +
 .../chatbot/llm/TestLangChain4jDispatcher.java     |   57 +
 .../ozone/recon/chatbot/llm/TestLlmRouting.java    |    8 +
 .../impl/TestOzoneManagerServiceProviderImpl.java  |  281 +-
 .../spi/impl/TestReconRDBSnapshotProvider.java     |  223 +
 .../ozone/recon/tasks/TestFileSizeCountTask.java   |    2 +-
 .../org/apache/hadoop/ozone/audit/S3GAction.java   |    3 +
 .../ozone/s3/commontypes/ObjectKeyNameAdapter.java |    3 +-
 .../ozone/s3/commontypes/RequestParameters.java    |   11 +
 .../ozone/s3/endpoint/BucketCrudHandler.java       |  127 +
 .../hadoop/ozone/s3/endpoint/BucketEndpoint.java   |   12 +-
 .../ozone/s3/endpoint/ListBucketResponse.java      |   13 +-
 .../hadoop/ozone/s3/endpoint/ObjectEndpoint.java   |   35 +-
 ...utBucketLifecycleConfigurationUnmarshaller.java |   80 +
 .../hadoop/ozone/s3/endpoint/RootEndpoint.java     |   41 +-
 .../s3/endpoint/S3LifecycleConfiguration.java      |  557 ++
 .../hadoop/ozone/s3/exception/S3ErrorTable.java    |    3 +
 .../ozone/s3/signature/AWSSignatureProcessor.java  |    7 +-
 .../signature/AccessDeniedResourceException.java}  |   11 +-
 .../s3/signature/AuthorizationV4QueryParser.java   |    7 +-
 .../org/apache/hadoop/ozone/s3/util/S3Consts.java  |    4 +
 .../org/apache/hadoop/ozone/s3/util/S3Utils.java   |   11 +
 .../hadoop/ozone/client/ClientProtocolStub.java    |   32 +-
 .../hadoop/ozone/client/OzoneBucketStub.java       |   68 +
 .../hadoop/ozone/client/OzoneVolumeStub.java       |    1 +
 .../s3/commontypes/TestObjectKeyNameAdapter.java   |    2 +-
 .../hadoop/ozone/s3/endpoint/TestBucketList.java   |   38 +-
 .../hadoop/ozone/s3/endpoint/TestObjectGet.java    |   26 +
 .../hadoop/ozone/s3/endpoint/TestObjectHead.java   |   10 +
 .../hadoop/ozone/s3/endpoint/TestRootList.java     |   94 +
 .../TestS3LifecycleConfigurationDelete.java        |  100 +
 .../endpoint/TestS3LifecycleConfigurationGet.java  |  173 +
 .../endpoint/TestS3LifecycleConfigurationPut.java  |  605 ++
 .../s3/signature/TestAWSSignatureProcessor.java    |   37 +
 .../signature/TestAuthorizationV4QueryParser.java  |   16 +-
 hadoop-ozone/tools/pom.xml                         |    4 +
 .../hadoop/ozone/local/LocalOzoneCluster.java      |  228 +-
 .../hadoop/ozone/local/TestLocalOzoneCluster.java  |  109 +
 pom.xml                                            |   40 +-
 465 files changed, 36494 insertions(+), 9061 deletions(-)

diff --cc 
hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java
index d49536f822c,6882595928d..bf8374f5e3a
--- 
a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java
+++ 
b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/XceiverClientGrpc.java
@@@ -91,8 -90,7 +90,7 @@@ import org.slf4j.LoggerFactory
   * how it works, and how it is integrated with the Ozone client.
   */
  public class XceiverClientGrpc extends XceiverClientSpi {
 -  private static final Logger LOG = 
LoggerFactory.getLogger(XceiverClientGrpc.class);
 +  public static final Logger LOG = 
LoggerFactory.getLogger(XceiverClientGrpc.class);
-   private static final int SHUTDOWN_WAIT_INTERVAL_MILLIS = 100;
    private static final int SHUTDOWN_WAIT_MAX_SECONDS = 5;
    private final Pipeline pipeline;
    private final ConfigurationSource config;
diff --cc 
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Handler.java
index 70185f7f0f8,6fe253ffbc7..d6828423a36
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Handler.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/interfaces/Handler.java
@@@ -45,9 -44,9 +45,10 @@@ import org.apache.hadoop.ozone.containe
  import org.apache.hadoop.ozone.container.common.volume.VolumeSet;
  import org.apache.hadoop.ozone.container.keyvalue.KeyValueHandler;
  import org.apache.hadoop.ozone.container.keyvalue.TarContainerPacker;
 +import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
  import org.apache.ratis.statemachine.StateMachine;
  import org.apache.ratis.thirdparty.io.grpc.stub.StreamObserver;
+ import org.apache.ratis.util.function.CheckedConsumer;
  
  /**
   * Dispatcher sends ContainerCommandRequests to Handler. Each Container Type
diff --cc 
hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/FilePerBlockStrategy.java
index 11806813aaf,01000883f17..ecaf42a2059
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/FilePerBlockStrategy.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/FilePerBlockStrategy.java
@@@ -58,8 -57,8 +58,9 @@@ import org.apache.hadoop.ozone.containe
  import org.apache.hadoop.ozone.container.keyvalue.helpers.ChunkUtils;
  import org.apache.hadoop.ozone.container.keyvalue.interfaces.BlockManager;
  import org.apache.hadoop.ozone.container.keyvalue.interfaces.ChunkManager;
 +import org.apache.hadoop.util.Shell;
  import org.apache.ratis.statemachine.StateMachine;
+ import org.apache.ratis.util.function.CheckedConsumer;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
diff --cc hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh
index 2edab9725b2,1609e46d4dd..3260f677807
--- a/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh
+++ b/hadoop-ozone/dist/src/shell/ozone/ozone-functions.sh
@@@ -1334,10 -1334,7 +1334,8 @@@ function ozone_add_to_classpath_userpat
  ## @return       may exit on failure conditions
  function ozone_os_tricks
  {
-   local bindv6only
- 
    OZONE_IS_CYGWIN=false
 +  ARCH_TYPE=$(uname -m)
    case ${OZONE_OS_TYPE} in
      Darwin)
        if [[ -z "${JAVA_HOME}" ]]; then
@@@ -1376,47 -1354,6 +1374,28 @@@
        # with the many threads that we use in Hadoop. Tune the variable
        # down to prevent vmem explosion.
        export MALLOC_ARENA_MAX=${MALLOC_ARENA_MAX:-4}
-       # we put this in QA test mode off so that non-Linux can test
-       if [[ "${QATESTMODE}" = true ]]; then
-         return
-       fi
- 
-       # NOTE! OZONE_ALLOW_IPV6 is a developer hook.  We leave it
-       # undocumented in ozone-env.sh because we don't want users to
-       # shoot themselves in the foot while devs make IPv6 work.
- 
-       bindv6only=$(/sbin/sysctl -n net.ipv6.bindv6only 2> /dev/null)
- 
-       if [[ -n "${bindv6only}" ]] &&
-          [[ "${bindv6only}" -eq "1" ]] &&
-          [[ "${OZONE_ALLOW_IPV6}" != "yes" ]]; then
-         ozone_error "ERROR: \"net.ipv6.bindv6only\" is set to 1 "
-         ozone_error "ERROR: Hadoop networking could be broken. Aborting."
-         ozone_error "ERROR: For more info: 
http://wiki.apache.org/hadoop/HadoopIPv6";
-         exit 1
-       fi
 +
 +      if [ "$ARCH_TYPE" = "aarch64" ]; then
 +        TARGET_FILE="libhadoop_linux_aarch_64.so"
 +      elif [ "$ARCH_TYPE" = "x86_64" ]; then
 +        TARGET_FILE="libhadoop_linux_x86_64.so"
 +      fi
 +
 +      pushd . > /dev/null && cd lib/native
 +      # If no matching file variant was found for the current environment
 +      if [ -z "$TARGET_FILE" ]; then
 +        echo "Error: libhadoop doesn't support platform combination ($OS_TYPE 
/ $ARCH_TYPE)." >&2
 +      else
 +        LINK_FILE="libhadoop.so"
 +
 +        # Check if it already exists but points to the wrong target
 +        if [ -L "$LINK_FILE" ] && [ "$(readlink "$LINK_FILE")" != 
"$TARGET_FILE" ]; then
 +          # Forcefully recreate it so it points to the correct target file
 +          ln -sf "$TARGET_FILE" "$LINK_FILE" > /dev/null 2>&1
 +        fi
 +        export LD_LIBRARY_PATH=$OZONE_HOME/lib/native:$LD_LIBRARY_PATH
 +      fi
 +      popd > /dev/null
      ;;
      CYGWIN*)
        # Flag that we're running on Cygwin to trigger path translation later.
diff --cc 
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestDNDataDistributionFinalization.java
index 09d0b1a6adf,8c7daace078..7caf91294d7
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestDNDataDistributionFinalization.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestDNDataDistributionFinalization.java
@@@ -178,8 -180,11 +178,8 @@@ public class TestDNDataDistributionFina
  
      // Wait for finalization to complete
      finalizationFuture.get();
-     TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
+     HddsUpgradeTestUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
 -
 -    // Verify finalization completed
 -    assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
 -        
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
 +    
assertTrue(VersionedDatanodeFeatures.isFinalized(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION));
  
      // Create more data and deletions to test post-finalization behavior
      String keyName3 = "testKey3";
@@@ -221,8 -226,10 +221,8 @@@
          });
      // Wait for finalization
      finalizationFuture.get();
-     TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
+     HddsUpgradeTestUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
 -
 -    assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
 -        
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
 +    
assertTrue(VersionedDatanodeFeatures.isFinalized(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION));
  
      // Verify the system can handle scenarios where pendingDeleteBlockCount
      // might be missing and needs recalculation
diff --cc 
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmDataDistributionFinalization.java
index 8ffad9279bf,3fb1bc121af..d0820197fb9
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmDataDistributionFinalization.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/upgrade/TestScmDataDistributionFinalization.java
@@@ -197,14 -195,15 +197,14 @@@ public class TestScmDataDistributionFin
      assertEquals(EMPTY_SUMMARY, 
cluster.getStorageContainerLocationClient().getDeletedBlockSummary());
  
      finalizationFuture.get();
-     TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
+     HddsUpgradeTestUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
      // Make sure old leader has caught up and all SCMs have finalized.
      waitForScmsToFinalize(cluster.getStorageContainerManagersList());
 -    assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
 -        
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
 +    
assertTrue(VersionedDatanodeFeatures.isFinalized(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION));
  
-     TestHddsUpgradeUtils.testPostUpgradeConditionsSCM(
+     HddsUpgradeTestUtils.testPostUpgradeConditionsSCM(
          cluster.getStorageContainerManagersList(), 0, NUM_DATANODES);
-     TestHddsUpgradeUtils.testPostUpgradeConditionsDataNodes(
+     HddsUpgradeTestUtils.testPostUpgradeConditionsDataNodes(
          cluster.getHddsDatanodes(), 0, CLOSED);
      
assertNotNull(cluster.getStorageContainerLocationClient().getDeletedBlockSummary());
  
@@@ -310,14 -309,15 +310,14 @@@
            }
          });
      finalizationFuture.get();
-     TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
+     HddsUpgradeTestUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
      // Make sure old leader has caught up and all SCMs have finalized.
      waitForScmsToFinalize(cluster.getStorageContainerManagersList());
 -    assertEquals(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION.layoutVersion(),
 -        
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
 +    
assertTrue(VersionedDatanodeFeatures.isFinalized(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION));
  
-     TestHddsUpgradeUtils.testPostUpgradeConditionsSCM(
+     HddsUpgradeTestUtils.testPostUpgradeConditionsSCM(
          cluster.getStorageContainerManagersList(), 0, NUM_DATANODES);
-     TestHddsUpgradeUtils.testPostUpgradeConditionsDataNodes(
+     HddsUpgradeTestUtils.testPostUpgradeConditionsDataNodes(
          cluster.getHddsDatanodes(), 0, CLOSED);
      
assertNotNull(cluster.getStorageContainerLocationClient().getDeletedBlockSummary());
  
diff --cc 
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/read/TestChunkInputStream.java
index b2753c0da60,4dce1e8b433..4db70817f7e
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/read/TestChunkInputStream.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/read/TestChunkInputStream.java
@@@ -61,10 -61,10 +61,10 @@@ class TestChunkInputStream extends Inpu
     * Test to verify that data read from chunks is stored in a list of buffers
     * with max capacity equal to the bytes per checksum.
     */
-   protected void testChunkReadBuffers(TestBucket bucket) throws Exception {
 -  private void testChunkReadBuffers(BucketForTesting bucket) throws Exception 
{
++  protected void testChunkReadBuffers(BucketForTesting bucket) throws 
Exception {
      String keyName = getNewKeyName();
      int dataLength = (2 * BLOCK_SIZE) + (CHUNK_SIZE);
 -    byte[] inputData = bucket.writeRandomBytes(keyName, dataLength);
 +    byte[] inputData = bucket.writeRandomBytes(keyName, getRepConfig(), 
dataLength);
  
      try (KeyInputStream keyInputStream = bucket.getKeyInputStream(keyName)) {
  
@@@ -123,9 -123,9 +123,9 @@@
      }
    }
  
-   protected void testCloseReleasesBuffers(TestBucket bucket) throws Exception 
{
 -  private void testCloseReleasesBuffers(BucketForTesting bucket) throws 
Exception {
++  protected void testCloseReleasesBuffers(BucketForTesting bucket) throws 
Exception {
      String keyName = getNewKeyName();
 -    bucket.writeRandomBytes(keyName, CHUNK_SIZE);
 +    bucket.writeRandomBytes(keyName, getRepConfig(), CHUNK_SIZE);
  
      try (KeyInputStream keyInputStream = bucket.getKeyInputStream(keyName)) {
        BlockInputStream block0Stream =
@@@ -146,9 -146,9 +146,9 @@@
     * Test that ChunkInputStream buffers are released as soon as the last byte
     * of the buffer is read.
     */
-   protected void testBufferRelease(TestBucket bucket) throws Exception {
 -  private void testBufferRelease(BucketForTesting bucket) throws Exception {
++  protected void testBufferRelease(BucketForTesting bucket) throws Exception {
      String keyName = getNewKeyName();
 -    byte[] inputData = bucket.writeRandomBytes(keyName, CHUNK_SIZE);
 +    byte[] inputData = bucket.writeRandomBytes(keyName, getRepConfig(), 
CHUNK_SIZE);
  
      try (KeyInputStream keyInputStream = bucket.getKeyInputStream(keyName)) {
  
diff --cc 
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/read/TestLocalChunkInputStream.java
index f72ddfcae2f,00000000000..ccf366beaaa
mode 100644,000000..100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/read/TestLocalChunkInputStream.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/read/TestLocalChunkInputStream.java
@@@ -1,163 -1,0 +1,163 @@@
 +/*
 + * 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.
 + */
 +
 +package org.apache.hadoop.ozone.client.rpc.read;
 +
 +import static 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.ReplicationFactor.ONE;
 +import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 +import static org.junit.jupiter.api.Assertions.assertEquals;
 +import static org.junit.jupiter.api.Assertions.assertFalse;
 +import static org.junit.jupiter.api.Assertions.assertNotNull;
 +import static org.junit.jupiter.api.Assertions.assertNull;
 +import static org.junit.jupiter.api.Assertions.assertTrue;
 +import static org.junit.jupiter.api.Assumptions.assumeTrue;
 +
 +import java.io.File;
 +import java.io.IOException;
 +import org.apache.hadoop.hdds.client.RatisReplicationConfig;
 +import org.apache.hadoop.hdds.client.ReplicationConfig;
 +import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 +import org.apache.hadoop.hdds.scm.OzoneClientConfig;
 +import org.apache.hadoop.hdds.scm.XceiverClientGrpc;
 +import org.apache.hadoop.hdds.scm.XceiverClientShortCircuit;
 +import org.apache.hadoop.hdds.scm.storage.BlockInputStream;
 +import org.apache.hadoop.hdds.scm.storage.DomainSocketFactory;
 +import org.apache.hadoop.hdds.scm.storage.LocalChunkInputStream;
 +import org.apache.hadoop.ozone.client.OzoneClient;
 +import org.apache.hadoop.ozone.client.io.KeyInputStream;
 +import org.apache.hadoop.ozone.container.common.impl.ContainerLayoutVersion;
 +import 
org.apache.hadoop.ozone.container.common.transport.server.XceiverServerSpi;
 +import org.apache.hadoop.ozone.container.keyvalue.ContainerLayoutTestInfo;
- import org.apache.hadoop.ozone.om.TestBucket;
++import org.apache.hadoop.ozone.om.BucketForTesting;
 +import org.apache.ozone.test.GenericTestUtils;
 +import org.junit.jupiter.api.Test;
 +import org.junit.jupiter.api.TestInstance;
 +import org.junit.jupiter.api.io.TempDir;
 +import org.slf4j.event.Level;
 +
 +/**
 + * Tests {@link LocalChunkInputStream}.
 + * For local intellij run, please follow the steps below:
 + *  Add Environment variables
 + *  LD_LIBRARY_PATH=$PROJECT_DIR$/target/native-lib
 + *  DYLD_LIBRARY_PATH=$PROJECT_DIR$/target/native-lib
 + *  to intellij run configuration.
 + */
 +@TestInstance(TestInstance.Lifecycle.PER_CLASS)
 +public class TestLocalChunkInputStream extends TestChunkInputStream {
 +
 +  @TempDir
 +  private File dir;
 +
 +  @Override
 +  int getDatanodeCount() {
 +    return 1;
 +  }
 +
 +  @Override
 +  void setCustomizedProperties(OzoneConfiguration configuration) {
 +    OzoneClientConfig clientConfig = 
configuration.getObject(OzoneClientConfig.class);
 +    clientConfig.setShortCircuit(true);
 +    configuration.setFromObject(clientConfig);
 +    configuration.set(OzoneClientConfig.OZONE_DOMAIN_SOCKET_PATH,
 +        new File(dir, "ozone-socket").getAbsolutePath());
 +    GenericTestUtils.setLogLevel(XceiverClientShortCircuit.LOG, Level.DEBUG);
 +    GenericTestUtils.setLogLevel(XceiverClientGrpc.LOG, Level.DEBUG);
 +    GenericTestUtils.setLogLevel(LocalChunkInputStream.LOG, Level.DEBUG);
 +    GenericTestUtils.setLogLevel(BlockInputStream.LOG, Level.DEBUG);
 +  }
 +
 +  @Override
 +  ReplicationConfig getRepConfig() {
 +    return RatisReplicationConfig.getInstance(ONE);
 +  }
 +
 +
 +  /**
 +   * Run the tests as a single test method to avoid needing a new mini-cluster
 +   * for each test.
 +   */
 +  @ContainerLayoutTestInfo.ContainerTest
 +  @Override
 +  void testAll(ContainerLayoutVersion layout) throws Exception {
 +    try (OzoneClient client = getCluster().newClient()) {
 +      updateConfig(layout);
 +      
assumeTrue(DomainSocketFactory.getInstance(getCluster().getConf()).isServiceReady());
 +
-       TestBucket bucket = TestBucket.newBuilder(client).build();
++      BucketForTesting bucket = BucketForTesting.newBuilder(client).build();
 +      GenericTestUtils.LogCapturer logCapturer1 =
 +          GenericTestUtils.LogCapturer.captureLogs(LocalChunkInputStream.LOG);
 +      GenericTestUtils.LogCapturer logCapturer2 =
 +          
GenericTestUtils.LogCapturer.captureLogs(XceiverClientShortCircuit.LOG);
 +      GenericTestUtils.LogCapturer logCapturer3 =
 +          GenericTestUtils.LogCapturer.captureLogs(BlockInputStream.LOG);
 +      GenericTestUtils.LogCapturer logCapturer4 =
 +          GenericTestUtils.LogCapturer.captureLogs(XceiverClientGrpc.LOG);
 +      testChunkReadBuffers(bucket);
 +      testBufferRelease(bucket);
 +      testCloseReleasesBuffers(bucket);
 +      assertTrue(logCapturer1.getOutput().contains("LocalChunkInputStream is 
created"));
 +      assertTrue(logCapturer2.getOutput().contains("XceiverClientShortCircuit 
is created"));
 +      assertTrue((logCapturer3.getOutput().contains("Get the FileInputStream 
of block")));
 +      assertFalse(logCapturer4.getOutput().contains("XceiverClientGrpc is 
created"));
 +    }
 +  }
 +
 +  @Test
 +  void testFallbackToGrpc() throws Exception {
 +    try (OzoneClient client = getCluster().newClient()) {
 +      
assumeTrue(DomainSocketFactory.getInstance(getCluster().getConf()).isServiceReady());
 +
-       TestBucket bucket = TestBucket.newBuilder(client).build();
++      BucketForTesting bucket = BucketForTesting.newBuilder(client).build();
 +      GenericTestUtils.LogCapturer logCapturer1 =
 +          
GenericTestUtils.LogCapturer.captureLogs(XceiverClientShortCircuit.LOG);
 +      GenericTestUtils.LogCapturer logCapturer2 =
 +          GenericTestUtils.LogCapturer.captureLogs(XceiverClientGrpc.LOG);
 +
 +      // create key
 +      String keyName = getNewKeyName();
 +      int dataLength = (2 * BLOCK_SIZE) + (CHUNK_SIZE);
 +      byte[] inputData = bucket.writeRandomBytes(keyName, getRepConfig(), 
dataLength);
 +      try (KeyInputStream keyInputStream = bucket.getKeyInputStream(keyName)) 
{
 +        BlockInputStream block0Stream =
 +            (BlockInputStream)keyInputStream.getPartStreams().get(0);
 +        block0Stream.initialize();
 +        assertNotNull(block0Stream.getBlockFileInputStream());
 +        
assertTrue(logCapturer1.getOutput().contains("XceiverClientShortCircuit is 
created"));
 +
 +        // stop XceiverServerDomainSocket server before client sends the 
second getBlockRequest to server
 +        XceiverServerSpi server = getCluster().getHddsDatanodes().get(0)
 +            
.getDatanodeStateMachine().getContainer().getReadDomainSocketChannel();
 +        server.stop();
 +        BlockInputStream block1Stream = 
(BlockInputStream)keyInputStream.getPartStreams().get(1);
 +        try {
 +          block1Stream.initialize();
 +        } catch (IOException e) {
 +          assertTrue(e.getMessage().contains("DomainSocket stream is not 
open"));
 +          assertTrue(logCapturer1.getOutput().contains("ReceiveResponseTask 
is closed due to java.io.EOFException"));
 +        }
 +        assertNull(block1Stream.getBlockFileInputStream());
 +        // read whole key through Grpc channel
 +        byte[] data = new byte[dataLength];
 +        int readLen = keyInputStream.read(data);
 +        assertEquals(dataLength, readLen);
 +        assertArrayEquals(inputData, data);
 +        assertTrue(logCapturer2.getOutput().contains("XceiverClientGrpc is 
created"));
 +      }
 +    }
 +  }
 +}
diff --cc 
hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestBlockDeletionService.java
index 7f747ee034f,3c1d3ed6faf..d3364c1f742
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestBlockDeletionService.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/service/TestBlockDeletionService.java
@@@ -49,8 -49,7 +49,8 @@@ import org.apache.hadoop.hdds.scm.serve
  import org.apache.hadoop.hdds.scm.server.SCMStorageConfig;
  import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
  import 
org.apache.hadoop.hdds.scm.server.upgrade.SCMUpgradeFinalizationContext;
 +import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
- import org.apache.hadoop.hdds.upgrade.TestHddsUpgradeUtils;
+ import org.apache.hadoop.hdds.upgrade.HddsUpgradeTestUtils;
  import org.apache.hadoop.ozone.MiniOzoneCluster;
  import org.apache.hadoop.ozone.UniformDatanodesFactory;
  import org.apache.hadoop.ozone.client.OzoneBucket;
@@@ -162,8 -160,9 +162,8 @@@ public class TestBlockDeletionService 
        }
      });
      finalizationFuture.get();
-     TestHddsUpgradeUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
+     HddsUpgradeTestUtils.waitForFinalizationFromClient(scmClient, CLIENT_ID);
 -    assertEquals(STORAGE_SPACE_DISTRIBUTION.ordinal(),
 -        
cluster.getStorageContainerManager().getLayoutVersionManager().getMetadataLayoutVersion());
 +    
assertTrue(VersionedDatanodeFeatures.isFinalized(HDDSLayoutFeature.STORAGE_SPACE_DISTRIBUTION));
  
      // POST-UPGRADE
      //Step 6: Repeat the same steps in pre-upgrade
diff --cc pom.xml
index 524e506a144,f06d57e84a8..65c8f23c2f8
--- a/pom.xml
+++ b/pom.xml
@@@ -2152,6 -2159,14 +2159,20 @@@
                        <bannedImport>io.netty.util.internal.**</bannedImport>
                      </bannedImports>
                    </restrictImports>
+                   <restrictImports>
+                     <includeTestCode>true</includeTestCode>
+                     <reason>Classes (e.g. FileInputStream, FileOutputStream) 
overriding the Object.finalize() method will cause gc to run a much longer 
time</reason>
+                     <bannedImports>
+                       <bannedImport>java.io.FileInputStream</bannedImport>
+                       <bannedImport>java.io.FileOutputStream</bannedImport>
+                     </bannedImports>
++                    <exclusions>
++                      
<exclusion>org.apache.hadoop.hdds.scm.storage.LocalChunkInputStream</exclusion>
++                      
<exclusion>org.apache.hadoop.hdds.scm.XceiverClientShortCircuit</exclusion>
++                      
<exclusion>org.apache.hadoop.hdds.scm.storage.BlockInputStream</exclusion>
++                      
<exclusion>org.apache.hadoop.hdds.TestXceiverServerDomainSocket</exclusion>
++                    </exclusions>
+                   </restrictImports>
                  </rules>
                </configuration>
              </execution>


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

Reply via email to