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

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


The following commit(s) were added to refs/heads/HDDS-14496-zdu by this push:
     new d782c841917 HDDS-14753. Do not prematurely serialize client version 
(#10936)
d782c841917 is described below

commit d782c8419173331b500bf8a432d3bf44d37063f6
Author: Ethan Rose <[email protected]>
AuthorDate: Thu Aug 13 10:35:41 2026 -0400

    HDDS-14753. Do not prematurely serialize client version (#10936)
---
 .../hadoop/hdds/protocol/DatanodeDetails.java      | 14 +++----
 .../common/helpers/ContainerWithPipeline.java      |  3 +-
 .../org/apache/hadoop/hdds/scm/net/InnerNode.java  |  3 +-
 .../java/org/apache/hadoop/hdds/scm/net/Node.java  |  3 +-
 .../apache/hadoop/hdds/scm/pipeline/Pipeline.java  |  9 +++--
 .../hadoop/hdds/protocol/TestDatanodeDetails.java  | 13 ++++---
 .../hadoop/hdds/scm/pipeline/TestPipeline.java     | 10 ++---
 .../diskbalancer/DiskBalancerProtocolServer.java   |  3 +-
 .../container/common/helpers/MoveDataNodePair.java |  4 +-
 .../apache/hadoop/hdds/scm/net/InnerNodeImpl.java  |  3 +-
 .../protocol/StorageContainerLocationProtocol.java |  9 +++--
 ...inerLocationProtocolClientSideTranslatorPB.java |  8 ++--
 .../hadoop/hdds/scm/node/DatanodeUsageInfo.java    |  5 ++-
 .../hdds/scm/pipeline/PipelineManagerImpl.java     |  2 +-
 ...lockLocationProtocolServerSideTranslatorPB.java | 14 ++++---
 ...inerLocationProtocolServerSideTranslatorPB.java | 44 +++++++++++-----------
 .../hdds/scm/server/SCMClientProtocolServer.java   | 11 +++---
 .../hdds/scm/node/TestDatanodeUsageInfo.java       |  4 +-
 .../hdds/scm/pipeline/MockPipelineManager.java     |  4 +-
 .../TestPipelineDatanodesIntersection.java         |  2 +-
 .../scm/pipeline/TestPipelinePlacementPolicy.java  |  6 +--
 .../scm/pipeline/TestPipelineStateManagerImpl.java | 40 ++++++++++----------
 .../scm/pipeline/TestRatisPipelineProvider.java    | 16 ++++----
 .../scm/pipeline/TestSimplePipelineProvider.java   |  4 +-
 ...lockLocationProtocolServerSideTranslatorPB.java |  2 +-
 .../scm/server/TestSCMBlockProtocolServer.java     |  4 +-
 .../hdds/scm/cli/ContainerOperationClient.java     |  8 ++--
 .../apache/hadoop/ozone/fsck/ContainerMapper.java  |  2 +-
 .../ozone/debug/om/TestContainerToKeyMapping.java  |  5 ++-
 .../ozone/om/helpers/KeyInfoWithVolumeContext.java |  3 +-
 .../apache/hadoop/ozone/om/helpers/OmKeyInfo.java  | 16 ++++----
 .../hadoop/ozone/om/helpers/OmKeyLocationInfo.java |  5 ++-
 .../ozone/om/helpers/OmKeyLocationInfoGroup.java   |  3 +-
 .../ozone/om/helpers/OmMultipartPartInfo.java      |  2 +-
 .../hadoop/ozone/om/helpers/OzoneFileStatus.java   |  3 +-
 .../hadoop/ozone/om/helpers/RepeatedOmKeyInfo.java |  6 +--
 ...OzoneManagerProtocolClientSideTranslatorPB.java |  6 +--
 .../hadoop/ozone/om/helpers/TestOmKeyInfo.java     |  6 +--
 .../AbstractTestStorageDistributionEndpoint.java   |  4 +-
 .../container/TestScmApplyTransactionFailure.java  |  2 +-
 .../org/apache/hadoop/ozone/debug/TestLDBCli.java  |  2 +-
 .../TestContainerCommandReconciliation.java        |  8 ++--
 .../hadoop/ozone/om/OmMetadataManagerImpl.java     |  2 +-
 .../ozone/om/request/file/OMFileCreateRequest.java |  7 +++-
 .../request/file/OMFileCreateRequestWithFSO.java   |  3 +-
 .../om/request/file/OMRecoverLeaseRequest.java     |  6 ++-
 .../om/request/key/OMAllocateBlockRequest.java     |  4 +-
 .../ozone/om/request/key/OMKeyCreateRequest.java   |  6 ++-
 .../om/request/key/OMKeyCreateRequestWithFSO.java  |  3 +-
 .../S3MultipartUploadCommitPartRequest.java        |  4 +-
 .../S3MultipartUploadCompleteRequest.java          |  4 +-
 .../ozone/om/service/DirectoryDeletingService.java |  4 +-
 .../ozone/om/service/KeyDeletingService.java       |  2 +-
 .../ozone/om/service/SnapshotDeletingService.java  |  4 +-
 .../protocolPB/OzoneManagerRequestHandler.java     | 36 +++++++++---------
 .../ozone/om/request/OMRequestTestUtils.java       |  4 +-
 .../om/request/file/TestOMRecoverLeaseRequest.java |  2 +-
 .../TestOMDirectoriesPurgeRequestAndResponse.java  |  4 +-
 .../TestOMSnapshotMoveTableKeysResponse.java       |  4 +-
 .../om/service/TestSnapshotDeletingService.java    |  4 +-
 .../protocolPB/TestOzoneManagerRequestHandler.java |  9 +++--
 .../hadoop/ozone/recon/api/NodeEndpoint.java       |  2 +-
 .../ozone/recon/scm/ReconPipelineManager.java      |  2 +-
 .../impl/StorageContainerServiceProviderImpl.java  |  2 +-
 .../hadoop/ozone/recon/api/TestEndpoints.java      |  5 ++-
 65 files changed, 239 insertions(+), 205 deletions(-)

diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java
index 98b51ef705a..e674931539c 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/protocol/DatanodeDetails.java
@@ -514,24 +514,24 @@ public static DatanodeDetails getFromProtoBuf(
    */
   @JsonIgnore
   public HddsProtos.DatanodeDetailsProto getProtoBufMessage() {
-    return toProto(ClientVersion.CURRENT.serialize());
+    return toProto(ClientVersion.CURRENT);
   }
 
-  public HddsProtos.DatanodeDetailsProto toProto(int clientVersion) {
+  public HddsProtos.DatanodeDetailsProto toProto(ClientVersion clientVersion) {
     return toProtoBuilder(clientVersion, Collections.emptySet()).build();
   }
 
-  public HddsProtos.DatanodeDetailsProto toProto(int clientVersion, 
Set<Port.Name> filterPorts) {
+  public HddsProtos.DatanodeDetailsProto toProto(ClientVersion clientVersion, 
Set<Port.Name> filterPorts) {
     return toProtoBuilder(clientVersion, filterPorts).build();
   }
 
-  public HddsProtos.DatanodeDetailsProto toProto(int clientVersion, 
Set<Port.Name> filterPorts,
+  public HddsProtos.DatanodeDetailsProto toProto(ClientVersion clientVersion, 
Set<Port.Name> filterPorts,
       ComponentVersion versionOverride) {
     return toProtoBuilder(clientVersion, filterPorts, versionOverride).build();
   }
 
   public HddsProtos.DatanodeDetailsProto.Builder toProtoBuilder(
-      int clientVersion, Set<Port.Name> filterPorts) {
+      ClientVersion clientVersion, Set<Port.Name> filterPorts) {
     return toProtoBuilder(clientVersion, filterPorts, null);
   }
 
@@ -546,7 +546,7 @@ public HddsProtos.DatanodeDetailsProto.Builder 
toProtoBuilder(
    * @return A {@link HddsProtos.DatanodeDetailsProto.Builder} Object.
    */
   public HddsProtos.DatanodeDetailsProto.Builder toProtoBuilder(
-      int clientVersion, Set<Port.Name> filterPorts, ComponentVersion 
versionOverride) {
+      ClientVersion clientVersion, Set<Port.Name> filterPorts, 
ComponentVersion versionOverride) {
 
     final HddsProtos.DatanodeIDProto idProto = id.toProto();
     final HddsProtos.DatanodeDetailsProto.Builder builder =
@@ -1185,7 +1185,7 @@ public void setRevision(String rev) {
 
   @Override
   public HddsProtos.NetworkNode toProtobuf(
-      int clientVersion) {
+      ClientVersion clientVersion) {
     return HddsProtos.NetworkNode.newBuilder()
         .setDatanodeDetails(toProtoBuilder(clientVersion, 
Collections.emptySet()).build())
         .build();
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ContainerWithPipeline.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ContainerWithPipeline.java
index 8db875c181e..fad799a25d5 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ContainerWithPipeline.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/ContainerWithPipeline.java
@@ -24,6 +24,7 @@
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.container.ContainerInfo;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
+import org.apache.hadoop.ozone.ClientVersion;
 
 /**
  * Class wraps ozone container info.
@@ -53,7 +54,7 @@ public static ContainerWithPipeline 
fromProtobuf(HddsProtos.ContainerWithPipelin
         Pipeline.getFromProtobuf(allocatedContainer.getPipeline()));
   }
 
-  public HddsProtos.ContainerWithPipeline getProtobuf(int clientVersion) {
+  public HddsProtos.ContainerWithPipeline getProtobuf(ClientVersion 
clientVersion) {
     return HddsProtos.ContainerWithPipeline.newBuilder()
         .setContainerInfo(getContainerInfo().getProtobuf())
         .setPipeline(getPipeline().getProtobufMessage(clientVersion, 
Name.IO_PORTS))
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNode.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNode.java
index ac9ec514a80..9f1cf8acdf5 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNode.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/InnerNode.java
@@ -20,6 +20,7 @@
 import java.util.Collection;
 import java.util.List;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.ClientVersion;
 
 /**
  * The interface defines an inner node in a network topology.
@@ -92,7 +93,7 @@ Node getLeaf(int leafIndex, List<String> excludedScopes,
       Collection<Node> excludedNodes, int ancestorGen);
 
   @Override
-  HddsProtos.NetworkNode toProtobuf(int clientVersion);
+  HddsProtos.NetworkNode toProtobuf(ClientVersion clientVersion);
 
   @Override
   boolean equals(Object o);
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/Node.java 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/Node.java
index 849111161bc..177f1a93c50 100644
--- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/Node.java
+++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/net/Node.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.hdds.scm.net;
 
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.ClientVersion;
 
 /**
  * The interface defines a node in a network topology.
@@ -130,7 +131,7 @@ public interface Node {
   boolean isDescendant(String nodePath);
 
   default HddsProtos.NetworkNode toProtobuf(
-      int clientVersion) {
+      ClientVersion clientVersion) {
     return null;
   }
 }
diff --git 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java
 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java
index 5675787c003..2dcf74f6a86 100644
--- 
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java
+++ 
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/scm/pipeline/Pipeline.java
@@ -68,7 +68,7 @@ public final class Pipeline {
   private static final Codec<Pipeline> CODEC = new DelegatedCodec<>(
       Proto2Codec.get(HddsProtos.Pipeline.getDefaultInstance()),
       Pipeline::getFromProtobufSetCreationTimestamp,
-      p -> p.getProtobufMessage(ClientVersion.CURRENT.serialize()),
+      p -> p.getProtobufMessage(ClientVersion.CURRENT),
       Pipeline.class,
       DelegatedCodec.CopyType.UNSUPPORTED);
 
@@ -364,15 +364,16 @@ public ReplicationConfig getReplicationConfig() {
     return replicationConfig;
   }
 
-  public HddsProtos.Pipeline getProtobufMessage(int clientVersion) {
+  public HddsProtos.Pipeline getProtobufMessage(ClientVersion clientVersion) {
     return getProtobufMessage(clientVersion, Collections.emptySet());
   }
 
-  public HddsProtos.Pipeline getProtobufMessage(int clientVersion, 
Set<DatanodeDetails.Port.Name> filterPorts) {
+  public HddsProtos.Pipeline getProtobufMessage(ClientVersion clientVersion,
+      Set<DatanodeDetails.Port.Name> filterPorts) {
     return getProtobufMessage(clientVersion, filterPorts, null);
   }
 
-  public HddsProtos.Pipeline getProtobufMessage(int clientVersion, 
Set<DatanodeDetails.Port.Name> filterPorts,
+  public HddsProtos.Pipeline getProtobufMessage(ClientVersion clientVersion, 
Set<DatanodeDetails.Port.Name> filterPorts,
       ComponentVersion versionOverride) {
     List<HddsProtos.DatanodeDetailsProto> members = new ArrayList<>();
     List<Integer> memberReplicaIndexes = new ArrayList<>();
diff --git 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/protocol/TestDatanodeDetails.java
 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/protocol/TestDatanodeDetails.java
index 0f592c71d63..6401067c85b 100644
--- 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/protocol/TestDatanodeDetails.java
+++ 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/protocol/TestDatanodeDetails.java
@@ -32,6 +32,7 @@
 import org.apache.hadoop.hdds.protocol.DatanodeDetails.Port;
 import org.apache.hadoop.hdds.protocol.DatanodeDetails.Port.Name;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.junit.jupiter.api.Test;
 
 /**
@@ -44,11 +45,11 @@ void protoIncludesNewPortsOnlyForV1() {
     DatanodeDetails subject = MockDatanodeDetails.randomDatanodeDetails();
 
     HddsProtos.DatanodeDetailsProto proto =
-        subject.toProto(DEFAULT_VERSION.serialize());
+        subject.toProto(DEFAULT_VERSION);
     assertPorts(proto, V0_PORTS);
 
     HddsProtos.DatanodeDetailsProto protoV1 =
-        subject.toProto(VERSION_HANDLES_UNKNOWN_DN_PORTS.serialize());
+        subject.toProto(VERSION_HANDLES_UNKNOWN_DN_PORTS);
     assertPorts(protoV1, ALL_PORTS);
   }
 
@@ -58,11 +59,11 @@ void testRequiredPortsProto() {
     Set<Port.Name> requiredPorts = Stream.of(Port.Name.STANDALONE, 
Port.Name.RATIS)
         .collect(Collectors.toSet());
     HddsProtos.DatanodeDetailsProto proto =
-        subject.toProto(subject.getCurrentVersion(), requiredPorts);
+        
subject.toProto(ClientVersion.deserialize(subject.getCurrentVersion()), 
requiredPorts);
     assertPorts(proto, ImmutableSet.copyOf(requiredPorts));
 
     HddsProtos.DatanodeDetailsProto ioPortProto =
-        subject.toProto(subject.getCurrentVersion(), Name.IO_PORTS);
+        
subject.toProto(ClientVersion.deserialize(subject.getCurrentVersion()), 
Name.IO_PORTS);
     assertPorts(ioPortProto, ImmutableSet.copyOf(Name.IO_PORTS));
   }
 
@@ -74,7 +75,7 @@ public void testNewBuilderCurrentVersion() {
     Set<Port.Name> requiredPorts = Stream.of(Port.Name.STANDALONE, 
Port.Name.RATIS)
         .collect(Collectors.toSet());
     HddsProtos.DatanodeDetailsProto.Builder protoBuilder =
-        dn.toProtoBuilder(DEFAULT_VERSION.serialize(), requiredPorts);
+        dn.toProtoBuilder(DEFAULT_VERSION, requiredPorts);
     protoBuilder.clearCurrentVersion();
     DatanodeDetails dn2 = 
DatanodeDetails.newBuilder(protoBuilder.build()).build();
     assertEquals(HDDSVersion.SEPARATE_RATIS_PORTS_AVAILABLE,
@@ -82,7 +83,7 @@ public void testNewBuilderCurrentVersion() {
 
     // test that if the current version is set, it is used
     protoBuilder =
-        dn.toProtoBuilder(DEFAULT_VERSION.serialize(), requiredPorts);
+        dn.toProtoBuilder(DEFAULT_VERSION, requiredPorts);
     DatanodeDetails dn3 = 
DatanodeDetails.newBuilder(protoBuilder.build()).build();
     assertEquals(HDDSVersion.SOFTWARE_VERSION,
         HDDSVersion.deserialize(dn3.getCurrentVersion()));
diff --git 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipeline.java
 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipeline.java
index c9318a9ef58..185f82fbe3c 100644
--- 
a/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipeline.java
+++ 
b/hadoop-hdds/common/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipeline.java
@@ -47,13 +47,13 @@ public void protoIncludesNewPortsOnlyForV1() throws 
IOException {
     Pipeline subject = MockPipeline.createPipeline(3);
 
     HddsProtos.Pipeline proto =
-        subject.getProtobufMessage(DEFAULT_VERSION.serialize());
+        subject.getProtobufMessage(DEFAULT_VERSION);
     for (HddsProtos.DatanodeDetailsProto dn : proto.getMembersList()) {
       assertPorts(dn, V0_PORTS);
     }
 
     HddsProtos.Pipeline protoV1 = subject.getProtobufMessage(
-        VERSION_HANDLES_UNKNOWN_DN_PORTS.serialize());
+        VERSION_HANDLES_UNKNOWN_DN_PORTS);
     for (HddsProtos.DatanodeDetailsProto dn : protoV1.getMembersList()) {
       assertPorts(dn, ALL_PORTS);
     }
@@ -64,14 +64,14 @@ public void getProtobufMessageEC() throws IOException {
     Pipeline subject = MockPipeline.createPipeline(3);
 
     //when EC config is empty/null
-    HddsProtos.Pipeline protobufMessage = subject.getProtobufMessage(1);
+    HddsProtos.Pipeline protobufMessage = 
subject.getProtobufMessage(VERSION_HANDLES_UNKNOWN_DN_PORTS);
     assertEquals(0, protobufMessage.getEcReplicationConfig().getData());
 
 
     //when EC config is NOT empty
     subject = MockPipeline.createEcPipeline();
 
-    protobufMessage = subject.getProtobufMessage(1);
+    protobufMessage = 
subject.getProtobufMessage(VERSION_HANDLES_UNKNOWN_DN_PORTS);
     assertEquals(3, protobufMessage.getEcReplicationConfig().getData());
     assertEquals(2, protobufMessage.getEcReplicationConfig().getParity());
 
@@ -80,7 +80,7 @@ public void getProtobufMessageEC() throws IOException {
   @Test
   public void testReplicaIndexesSerialisedCorrectly() {
     Pipeline pipeline = MockPipeline.createEcPipeline();
-    HddsProtos.Pipeline protobufMessage = pipeline.getProtobufMessage(1);
+    HddsProtos.Pipeline protobufMessage = 
pipeline.getProtobufMessage(VERSION_HANDLES_UNKNOWN_DN_PORTS);
     Pipeline reloadedPipeline = Pipeline.getFromProtobuf(protobufMessage);
 
     for (DatanodeDetails dn : pipeline.getNodes()) {
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerProtocolServer.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerProtocolServer.java
index 770f7b67414..88028da7a92 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerProtocolServer.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/diskbalancer/DiskBalancerProtocolServer.java
@@ -27,6 +27,7 @@
 import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.DiskBalancerConfigurationProto;
 import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.DiskBalancerRunningStatus;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos.NodeOperationalState;
+import org.apache.hadoop.ozone.ClientVersion;
 import 
org.apache.hadoop.ozone.container.common.statemachine.DatanodeStateMachine;
 import org.apache.hadoop.ozone.container.ozoneimpl.OzoneContainer;
 import org.slf4j.Logger;
@@ -70,7 +71,7 @@ public DatanodeDiskBalancerInfoProto 
getDiskBalancerInfo(GetDiskBalancerInfoRequ
     DatanodeDetails datanodeDetails = 
datanodeStateMachine.getDatanodeDetails();
 
     return DatanodeDiskBalancerInfoProto.newBuilder()
-        .setNode(datanodeDetails.toProto(request.getClientVersion()))
+        
.setNode(datanodeDetails.toProto(ClientVersion.deserialize(request.getClientVersion())))
         .setCurrentVolumeDensitySum(info.getVolumeDataDensity())
         .setDiskBalancerConf(DiskBalancerConfigurationProto.newBuilder()
                 .setThreshold(info.getThreshold())
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/MoveDataNodePair.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/MoveDataNodePair.java
index bc43c2a5422..95f8fee2a19 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/MoveDataNodePair.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/container/common/helpers/MoveDataNodePair.java
@@ -35,7 +35,7 @@ public class MoveDataNodePair {
   private static final Codec<MoveDataNodePair> CODEC = new DelegatedCodec<>(
       Proto2Codec.get(MoveDataNodePairProto.getDefaultInstance()),
       MoveDataNodePair::getFromProtobuf,
-      pair -> pair.getProtobufMessage(ClientVersion.CURRENT.serialize()),
+      pair -> pair.getProtobufMessage(ClientVersion.CURRENT),
       MoveDataNodePair.class,
       DelegatedCodec.CopyType.SHALLOW);
 
@@ -66,7 +66,7 @@ public DatanodeDetails getSrc() {
     return src;
   }
 
-  public MoveDataNodePairProto getProtobufMessage(int clientVersion) {
+  public MoveDataNodePairProto getProtobufMessage(ClientVersion clientVersion) 
{
     return MoveDataNodePairProto.newBuilder()
         .setSrc(src.toProto(clientVersion))
         .setTgt(tgt.toProto(clientVersion))
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..383dfd20d58 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
@@ -31,6 +31,7 @@
 import java.util.Map;
 import java.util.Objects;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -460,7 +461,7 @@ public Node getLeaf(int leafIndex, List<String> 
excludedScopes,
 
   @Override
   public HddsProtos.NetworkNode toProtobuf(
-      int clientVersion) {
+      ClientVersion clientVersion) {
 
     HddsProtos.InnerNode.Builder innerNode =
         HddsProtos.InnerNode.newBuilder()
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
index e4254fcec1c..9831ced682b 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocol.java
@@ -47,6 +47,7 @@
 import org.apache.hadoop.hdds.scm.container.ReplicationManagerReport;
 import 
org.apache.hadoop.hdds.scm.container.common.helpers.ContainerWithPipeline;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.upgrade.UpgradeFinalization.StatusAndMessages;
 import org.apache.hadoop.security.KerberosInfo;
 import org.apache.hadoop.security.token.Token;
@@ -124,7 +125,7 @@ ContainerWithPipeline getContainerWithPipeline(long 
containerID)
    * @throws IOException
    */
   List<HddsProtos.SCMContainerReplicaProto> getContainerReplicas(
-      long containerId, int clientVersion) throws IOException;
+      long containerId, ClientVersion clientVersion) throws IOException;
 
   /**
    * Ask SCM the location of a batch of containers. SCM responds with a group 
of
@@ -283,7 +284,7 @@ ContainerListResult listContainer(long startContainerID,
    */
   List<HddsProtos.Node> queryNode(HddsProtos.NodeOperationalState opState,
       HddsProtos.NodeState state, HddsProtos.QueryScope queryScope,
-      String poolName, int clientVersion) throws IOException;
+      String poolName, ClientVersion clientVersion) throws IOException;
 
   HddsProtos.Node queryNode(UUID uuid) throws IOException;
 
@@ -497,7 +498,7 @@ StartContainerBalancerResponseProto startContainerBalancer(
    * @see org.apache.hadoop.ozone.ClientVersion
    */
   List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
-      String address, String uuid, int clientVersion) throws IOException;
+      String address, String uuid, ClientVersion clientVersion) throws 
IOException;
 
   /**
    * Get usage information of most or least used datanodes.
@@ -511,7 +512,7 @@ List<HddsProtos.DatanodeUsageInfoProto> 
getDatanodeUsageInfo(
    * @see org.apache.hadoop.ozone.ClientVersion
    */
   List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
-      boolean mostUsed, int count, int clientVersion) throws IOException;
+      boolean mostUsed, int count, ClientVersion clientVersion) throws 
IOException;
 
   @Deprecated
   StatusAndMessages finalizeScmUpgrade(String upgradeClientID)
diff --git 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
index 292488f221d..f7eca4223bd 100644
--- 
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
+++ 
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/scm/protocolPB/StorageContainerLocationProtocolClientSideTranslatorPB.java
@@ -342,7 +342,7 @@ public ContainerWithPipeline getContainerWithPipeline(long 
containerID)
    */
   @Override
   public List<HddsProtos.SCMContainerReplicaProto> getContainerReplicas(
-      long containerID, int clientVersion) throws IOException {
+      long containerID, ClientVersion clientVersion) throws IOException {
     Preconditions.checkState(containerID >= 0,
         "Container ID cannot be negative");
 
@@ -564,7 +564,7 @@ public Map<String, List<ContainerID>> 
getContainersOnDecomNode(DatanodeDetails d
   public List<HddsProtos.Node> queryNode(
       HddsProtos.NodeOperationalState opState, HddsProtos.NodeState
       nodeState, HddsProtos.QueryScope queryScope, String poolName,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     // TODO : We support only cluster wide query right now. So ignoring 
checking
     // queryScope and poolName
     NodeQueryRequestProto.Builder builder = NodeQueryRequestProto.newBuilder()
@@ -1136,7 +1136,7 @@ public ContainerBalancerStatusInfoResponseProto 
getContainerBalancerStatusInfo()
    */
   @Override
   public List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
-      String address, String uuid, int clientVersion) throws IOException {
+      String address, String uuid, ClientVersion clientVersion) throws 
IOException {
 
     DatanodeUsageInfoRequestProto request =
         DatanodeUsageInfoRequestProto.newBuilder()
@@ -1162,7 +1162,7 @@ public List<HddsProtos.DatanodeUsageInfoProto> 
getDatanodeUsageInfo(
    */
   @Override
   public List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
-      boolean mostUsed, int count, int clientVersion) throws IOException {
+      boolean mostUsed, int count, ClientVersion clientVersion) throws 
IOException {
     DatanodeUsageInfoRequestProto request =
         DatanodeUsageInfoRequestProto.newBuilder()
             .setMostUsed(mostUsed)
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
index d6ac9edfaeb..977f59278e4 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/node/DatanodeUsageInfo.java
@@ -22,6 +22,7 @@
 import org.apache.hadoop.hdds.protocol.DatanodeID;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos.DatanodeUsageInfoProto;
 import org.apache.hadoop.hdds.scm.container.placement.metrics.SCMNodeStat;
+import org.apache.hadoop.ozone.ClientVersion;
 
 /**
  * Bundles datanode details with usage statistics.
@@ -221,11 +222,11 @@ public int hashCode() {
    *
    * @return Protobuf HddsProtos.DatanodeUsageInfo
    */
-  public DatanodeUsageInfoProto toProto(int clientVersion) {
+  public DatanodeUsageInfoProto toProto(ClientVersion clientVersion) {
     return toProtoBuilder(clientVersion).build();
   }
 
-  private DatanodeUsageInfoProto.Builder toProtoBuilder(int clientVersion) {
+  private DatanodeUsageInfoProto.Builder toProtoBuilder(ClientVersion 
clientVersion) {
     DatanodeUsageInfoProto.Builder builder =
         DatanodeUsageInfoProto.newBuilder();
 
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
index e176da2d711..6ea92bb2a14 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/pipeline/PipelineManagerImpl.java
@@ -268,7 +268,7 @@ private void checkIfPipelineCreationIsAllowed(
   private void addPipelineToManager(Pipeline pipeline)
       throws IOException {
     HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     acquireWriteLock();
     try {
       stateManager.addPipeline(pipelineProto);
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
index 9fb688fb8fe..b2fb1f897af 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/ScmBlockLocationProtocolServerSideTranslatorPB.java
@@ -60,6 +60,7 @@
 import org.apache.hadoop.hdds.server.OzoneProtocolMessageDispatcher;
 import org.apache.hadoop.hdds.upgrade.HDDSLayoutFeature;
 import org.apache.hadoop.hdds.utils.ProtocolMessageMetrics;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.common.BlockGroup;
 import org.apache.hadoop.ozone.common.DeleteBlockGroupResult;
 import org.slf4j.Logger;
@@ -127,6 +128,7 @@ public SCMBlockLocationResponse send(RpcController 
controller,
 
   private SCMBlockLocationResponse processMessage(
       SCMBlockLocationRequest request) throws ServiceException {
+    final ClientVersion clientVersion = 
ClientVersion.deserialize(request.getVersion());
     SCMBlockLocationResponse.Builder response = createSCMBlockResponse(
         request.getCmdType(),
         request.getTraceID());
@@ -146,7 +148,7 @@ private SCMBlockLocationResponse processMessage(
           }
         }
         response.setAllocateScmBlockResponse(allocateScmBlock(
-            request.getAllocateScmBlockRequest(), request.getVersion()));
+            request.getAllocateScmBlockRequest(), clientVersion));
         break;
       case DeleteScmKeyBlocks:
         response.setDeleteScmKeyBlocksResponse(
@@ -162,12 +164,12 @@ private SCMBlockLocationResponse processMessage(
         break;
       case SortDatanodes:
         response.setSortDatanodesResponse(sortDatanodes(
-            request.getSortDatanodesRequest(), request.getVersion()
+            request.getSortDatanodesRequest(), clientVersion
         ));
         break;
       case GetClusterTree:
         response.setGetClusterTreeResponse(
-            getClusterTree(request.getVersion()));
+            getClusterTree(clientVersion));
         break;
       default:
         // Should never happen
@@ -196,7 +198,7 @@ private Status exceptionToResponseStatus(IOException ex) {
   }
 
   public AllocateScmBlockResponseProto allocateScmBlock(
-      AllocateScmBlockRequestProto request, int clientVersion)
+      AllocateScmBlockRequestProto request, ClientVersion clientVersion)
       throws IOException {
     List<AllocatedBlock> allocatedBlocks =
         impl.allocateBlock(request.getSize(),
@@ -307,7 +309,7 @@ public HddsProtos.AddScmResponseProto getAddSCMResponse(
   }
 
   public SortDatanodesResponseProto sortDatanodes(
-      SortDatanodesRequestProto request, int clientVersion)
+      SortDatanodesRequestProto request, ClientVersion clientVersion)
       throws ServiceException {
     SortDatanodesResponseProto.Builder resp =
         SortDatanodesResponseProto.newBuilder();
@@ -326,7 +328,7 @@ public SortDatanodesResponseProto sortDatanodes(
     }
   }
 
-  public GetClusterTreeResponseProto getClusterTree(int clientVersion)
+  public GetClusterTreeResponseProto getClusterTree(ClientVersion 
clientVersion)
       throws IOException {
     GetClusterTreeResponseProto.Builder resp =
         GetClusterTreeResponseProto.newBuilder();
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
index c95d5145215..b9012a744d9 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/protocol/StorageContainerLocationProtocolServerSideTranslatorPB.java
@@ -228,8 +228,7 @@ public ScmContainerLocationResponse 
submitRequest(RpcController controller,
     // this server interface, this should be removed and solved via new
     // annotated interceptors.
     boolean checkResponseForECRepConfig = false;
-    if (!ClientVersion.ERASURE_CODING_SUPPORT.isSupportedBy(
-        request.getVersion())) {
+    if 
(!ClientVersion.ERASURE_CODING_SUPPORT.isSupportedBy(request.getVersion())) {
       if (request.getCmdType() == GetContainer
           || request.getCmdType() == ListContainer
           || request.getCmdType() == GetContainerWithPipeline
@@ -419,6 +418,7 @@ private void 
disallowECReplicationConfigInGetPipelineResponse(
   @SuppressWarnings("checkstyle:methodlength")
   public ScmContainerLocationResponse processRequest(
       ScmContainerLocationRequest request) throws ServiceException {
+    final ClientVersion clientVersion = 
ClientVersion.deserialize(request.getVersion());
     try {
       switch (request.getCmdType()) {
       case AllocateContainer:
@@ -426,7 +426,7 @@ public ScmContainerLocationResponse processRequest(
             .setCmdType(request.getCmdType())
             .setStatus(Status.OK)
             .setContainerResponse(allocateContainer(
-                request.getContainerRequest(), request.getVersion()))
+                request.getContainerRequest(), clientVersion))
             .build();
       case GetContainer:
         return ScmContainerLocationResponse.newBuilder()
@@ -448,7 +448,7 @@ public ScmContainerLocationResponse processRequest(
             .setStatus(Status.OK)
             .setGetContainerWithPipelineResponse(getContainerWithPipeline(
                 request.getGetContainerWithPipelineRequest(),
-                request.getVersion()))
+                clientVersion))
             .build();
       case GetContainerWithPipelineBatch:
         return ScmContainerLocationResponse.newBuilder()
@@ -457,7 +457,7 @@ public ScmContainerLocationResponse processRequest(
             .setGetContainerWithPipelineBatchResponse(
                 getContainerWithPipelineBatch(
                     request.getGetContainerWithPipelineBatchRequest(),
-                    request.getVersion()))
+                    clientVersion))
             .build();
       case GetExistContainerWithPipelinesInBatch:
         return ScmContainerLocationResponse.newBuilder()
@@ -466,7 +466,7 @@ public ScmContainerLocationResponse processRequest(
             .setGetExistContainerWithPipelinesInBatchResponse(
                 getExistContainerWithPipelinesInBatch(
                     request.getGetExistContainerWithPipelinesInBatchRequest(),
-                    request.getVersion()))
+                    clientVersion))
             .build();
       case ListContainer:
         return ScmContainerLocationResponse.newBuilder()
@@ -480,7 +480,7 @@ public ScmContainerLocationResponse processRequest(
             .setCmdType(request.getCmdType())
             .setStatus(Status.OK)
             .setNodeQueryResponse(queryNode(request.getNodeQueryRequest(),
-                request.getVersion()))
+                clientVersion))
             .build();
       case SingleNodeQuery:
         return ScmContainerLocationResponse.newBuilder()
@@ -512,14 +512,14 @@ public ScmContainerLocationResponse processRequest(
             .setCmdType(request.getCmdType())
             .setStatus(Status.OK)
             .setPipelineResponse(allocatePipeline(
-                request.getPipelineRequest(), request.getVersion()))
+                request.getPipelineRequest(), clientVersion))
             .build();
       case ListPipelines:
         return ScmContainerLocationResponse.newBuilder()
             .setCmdType(request.getCmdType())
             .setStatus(Status.OK)
             .setListPipelineResponse(listPipelines(
-                request.getListPipelineRequest(), request.getVersion()))
+                request.getListPipelineRequest(), clientVersion))
             .build();
       case ActivatePipeline:
         return ScmContainerLocationResponse.newBuilder()
@@ -624,7 +624,7 @@ public ScmContainerLocationResponse processRequest(
             .setCmdType(request.getCmdType())
             .setStatus(Status.OK)
             .setGetPipelineResponse(getPipeline(
-                request.getGetPipelineRequest(), request.getVersion()))
+                request.getGetPipelineRequest(), clientVersion))
             .build();
       case GetSafeModeRuleStatuses:
         return ScmContainerLocationResponse.newBuilder()
@@ -680,7 +680,7 @@ public ScmContainerLocationResponse processRequest(
             .setStatus(Status.OK)
             .setDatanodeUsageInfoResponse(getDatanodeUsageInfo(
                 request.getDatanodeUsageInfoRequest(),
-                request.getVersion()))
+                clientVersion))
             .build();
       case GetContainerCount:
         return ScmContainerLocationResponse.newBuilder()
@@ -702,7 +702,7 @@ public ScmContainerLocationResponse processRequest(
           .setStatus(Status.OK)
           .setGetContainerReplicasResponse(getContainerReplicas(
               request.getGetContainerReplicasRequest(),
-              request.getVersion()))
+              clientVersion))
           .build();
       case GetFailedDeletedBlocksTransaction:
         return ScmContainerLocationResponse.newBuilder()
@@ -801,7 +801,7 @@ public ScmContainerLocationResponse processRequest(
   }
 
   public GetContainerReplicasResponseProto getContainerReplicas(
-      GetContainerReplicasRequestProto request, int clientVersion)
+      GetContainerReplicasRequestProto request, ClientVersion clientVersion)
       throws IOException {
     List<HddsProtos.SCMContainerReplicaProto> replicas
         = impl.getContainerReplicas(request.getContainerID(), clientVersion);
@@ -810,7 +810,7 @@ public GetContainerReplicasResponseProto 
getContainerReplicas(
   }
 
   public ContainerResponseProto allocateContainer(ContainerRequestProto 
request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     ReplicationConfig replicationConfig = 
ReplicationConfig.fromProto(request.getReplicationType(), 
         request.getReplicationFactor(),
         request.getEcReplicationConfig()
@@ -844,7 +844,7 @@ public GetContainerTokenResponseProto getContainerToken(
 
   public GetContainerWithPipelineResponseProto getContainerWithPipeline(
       GetContainerWithPipelineRequestProto request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     ContainerWithPipeline container = impl
         .getContainerWithPipeline(request.getContainerID());
     return GetContainerWithPipelineResponseProto.newBuilder()
@@ -855,7 +855,7 @@ public GetContainerWithPipelineResponseProto 
getContainerWithPipeline(
   public GetContainerWithPipelineBatchResponseProto
       getContainerWithPipelineBatch(
       GetContainerWithPipelineBatchRequestProto request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     List<ContainerWithPipeline> containers = impl
         .getContainerWithPipelineBatch(request.getContainerIDsList());
     GetContainerWithPipelineBatchResponseProto.Builder builder =
@@ -869,7 +869,7 @@ public GetContainerWithPipelineResponseProto 
getContainerWithPipeline(
   public GetExistContainerWithPipelinesInBatchResponseProto
       getExistContainerWithPipelinesInBatch(
       GetExistContainerWithPipelinesInBatchRequestProto request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     List<ContainerWithPipeline> containers = impl
         .getExistContainerWithPipelinesInBatch(request.getContainerIDsList());
     GetExistContainerWithPipelinesInBatchResponseProto.Builder builder =
@@ -949,7 +949,7 @@ public SCMDeleteContainerResponseProto deleteContainer(
 
   public NodeQueryResponseProto queryNode(
       StorageContainerLocationProtocolProtos.NodeQueryRequestProto request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
 
     HddsProtos.NodeOperationalState opState = null;
     HddsProtos.NodeState nodeState = null;
@@ -999,7 +999,7 @@ public SCMCloseContainerResponseProto closeContainer(
 
   public PipelineResponseProto allocatePipeline(
       StorageContainerLocationProtocolProtos.PipelineRequestProto request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     Pipeline pipeline = impl.createReplicationPipeline(
         request.getReplicationType(), request.getReplicationFactor(),
         HddsProtos.NodePool.getDefaultInstance());
@@ -1013,7 +1013,7 @@ public PipelineResponseProto allocatePipeline(
   }
 
   public ListPipelineResponseProto listPipelines(
-      ListPipelineRequestProto request, int clientVersion)
+      ListPipelineRequestProto request, ClientVersion clientVersion)
       throws IOException {
     ListPipelineResponseProto.Builder builder = ListPipelineResponseProto
         .newBuilder();
@@ -1026,7 +1026,7 @@ public ListPipelineResponseProto listPipelines(
 
   public GetPipelineResponseProto getPipeline(
       GetPipelineRequestProto request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     GetPipelineResponseProto.Builder builder = GetPipelineResponseProto
         .newBuilder();
     Pipeline pipeline = impl.getPipeline(request.getPipelineID());
@@ -1370,7 +1370,7 @@ public StartMaintenanceNodesResponseProto 
startMaintenanceNodes(
 
   public DatanodeUsageInfoResponseProto getDatanodeUsageInfo(
       StorageContainerLocationProtocolProtos.DatanodeUsageInfoRequestProto
-          request, int clientVersion) throws IOException {
+          request, ClientVersion clientVersion) throws IOException {
     List<HddsProtos.DatanodeUsageInfoProto> infoList;
 
     // get info by ip or uuid
diff --git 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
index e78395fc44c..5a2cd16b088 100644
--- 
a/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/main/java/org/apache/hadoop/hdds/scm/server/SCMClientProtocolServer.java
@@ -117,6 +117,7 @@
 import org.apache.hadoop.ipc_.ProtobufRpcEngine;
 import org.apache.hadoop.ipc_.RPC;
 import org.apache.hadoop.ipc_.Server;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.AuditAction;
 import org.apache.hadoop.ozone.audit.AuditEventStatus;
@@ -358,7 +359,7 @@ public ContainerWithPipeline getContainerWithPipeline(long 
containerID)
 
   @Override
   public List<HddsProtos.SCMContainerReplicaProto> getContainerReplicas(
-      long containerId, int clientVersion) throws IOException {
+      long containerId, ClientVersion clientVersion) throws IOException {
     List<HddsProtos.SCMContainerReplicaProto> results = new ArrayList<>();
     Map<String, String> auditMap = new HashMap<>();
     auditMap.put("containerId", String.valueOf(containerId));
@@ -681,7 +682,7 @@ public Map<String, List<ContainerID>> 
getContainersOnDecomNode(DatanodeDetails d
   @Override
   public List<HddsProtos.Node> queryNode(
       HddsProtos.NodeOperationalState opState, HddsProtos.NodeState state,
-      HddsProtos.QueryScope queryScope, String poolName, int clientVersion)
+      HddsProtos.QueryScope queryScope, String poolName, ClientVersion 
clientVersion)
       throws IOException {
     final Map<String, String> auditMap = Maps.newHashMap();
     auditMap.put("opState", String.valueOf(opState));
@@ -1550,7 +1551,7 @@ public ContainerBalancerStatusInfoResponseProto 
getContainerBalancerStatusInfo()
    */
   @Override
   public List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
-      String address, String uuid, int clientVersion) throws IOException {
+      String address, String uuid, ClientVersion clientVersion) throws 
IOException {
 
     final Map<String, String> auditMap = Maps.newHashMap();
     auditMap.put("address", address);
@@ -1595,7 +1596,7 @@ public List<HddsProtos.DatanodeUsageInfoProto> 
getDatanodeUsageInfo(
    * @return Usage info such as capacity, SCMUsed, and remaining space.
    */
   private HddsProtos.DatanodeUsageInfoProto getUsageInfoFromDatanodeDetails(
-      DatanodeDetails node, int clientVersion) {
+      DatanodeDetails node, ClientVersion clientVersion) {
     DatanodeUsageInfo usageInfo = scm.getScmNodeManager().getUsageInfo(node);
     return usageInfo.toProto(clientVersion);
   }
@@ -1614,7 +1615,7 @@ private HddsProtos.DatanodeUsageInfoProto 
getUsageInfoFromDatanodeDetails(
    */
   @Override
   public List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
-      boolean mostUsed, int count, int clientVersion)
+      boolean mostUsed, int count, ClientVersion clientVersion)
       throws IOException, IllegalArgumentException {
 
     final Map<String, String> auditMap = Maps.newHashMap();
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestDatanodeUsageInfo.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestDatanodeUsageInfo.java
index 142e2638cf8..bb02756b4d2 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestDatanodeUsageInfo.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/node/TestDatanodeUsageInfo.java
@@ -41,7 +41,7 @@ void testToProtoDoesNotIncludeFilesystemFieldsByDefault() {
     );
 
     DatanodeUsageInfo info = new DatanodeUsageInfo(dn, stat);
-    DatanodeUsageInfoProto proto = 
info.toProto(ClientVersion.CURRENT.serialize());
+    DatanodeUsageInfoProto proto = info.toProto(ClientVersion.CURRENT);
 
     assertThat(proto.hasFsCapacity()).isFalse();
     assertThat(proto.hasFsAvailable()).isFalse();
@@ -59,7 +59,7 @@ void testToProtoIncludesFilesystemFieldsWhenPresent() {
     DatanodeUsageInfo info = new DatanodeUsageInfo(dn, stat);
     info.setFilesystemUsage(2000L, 1500L);
 
-    DatanodeUsageInfoProto proto = 
info.toProto(ClientVersion.CURRENT.serialize());
+    DatanodeUsageInfoProto proto = info.toProto(ClientVersion.CURRENT);
 
     assertThat(proto.hasFsCapacity()).isTrue();
     assertThat(proto.hasFsAvailable()).isTrue();
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java
index f8abec6c499..918a310e312 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/MockPipelineManager.java
@@ -87,7 +87,7 @@ public Pipeline createPipeline(ReplicationConfig 
replicationConfig,
     }
 
     stateManager.addPipeline(pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize()));
+        ClientVersion.CURRENT));
     return pipeline;
   }
 
@@ -111,7 +111,7 @@ public Pipeline buildECPipeline(ReplicationConfig 
replicationConfig,
   public void addEcPipeline(Pipeline pipeline)
       throws IOException {
     stateManager.addPipeline(pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize()));
+        ClientVersion.CURRENT));
   }
 
   @Override
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineDatanodesIntersection.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineDatanodesIntersection.java
index 5a642369d96..87211083109 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineDatanodesIntersection.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineDatanodesIntersection.java
@@ -110,7 +110,7 @@ public void testPipelineDatanodesIntersection(int nodeCount,
         Pipeline pipeline = provider.create(RatisReplicationConfig.getInstance(
             ReplicationFactor.THREE));
         HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-            ClientVersion.CURRENT.serialize());
+            ClientVersion.CURRENT);
         stateManager.addPipeline(pipelineProto);
         nodeManager.addPipeline(pipeline);
         List<Pipeline> overlapPipelines = RatisPipelineUtils
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelinePlacementPolicy.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelinePlacementPolicy.java
index e3100c217b6..103bd388ff1 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelinePlacementPolicy.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelinePlacementPolicy.java
@@ -292,7 +292,7 @@ public void testPickLowestLoadAnchor() throws IOException, 
TimeoutException {
             .setNodes(nodes)
             .build();
         HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-            ClientVersion.CURRENT.serialize());
+            ClientVersion.CURRENT);
         nodeManager.addPipeline(pipeline);
         stateManager.addPipeline(pipelineProto);
       } catch (SCMException e) {
@@ -648,7 +648,7 @@ private void insertHeavyNodesIntoNodeManager(
               .build();
 
           pipelineProto = pipeline.getProtobufMessage(
-              ClientVersion.CURRENT.serialize());
+              ClientVersion.CURRENT);
           nodeManager.addPipeline(pipeline);
           stateManager.addPipeline(pipelineProto);
           pipelineCount++;
@@ -791,7 +791,7 @@ private void 
createPipelineWithReplicationConfig(List<DatanodeDetails> dnList,
         .build();
 
     HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     nodeManager.addPipeline(pipeline);
     stateManager.addPipeline(pipelineProto);
   }
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineStateManagerImpl.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineStateManagerImpl.java
index fc447a74e91..977c4bcb16f 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineStateManagerImpl.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestPipelineStateManagerImpl.java
@@ -110,14 +110,14 @@ private Pipeline 
createDummyPipeline(HddsProtos.ReplicationType type,
   public void testAddAndGetPipeline() throws IOException, TimeoutException {
     Exception e = assertThrows(SCMException.class,
         () -> stateManager.addPipeline(createDummyPipeline(0)
-            .getProtobufMessage(ClientVersion.CURRENT.serialize())));
+            .getProtobufMessage(ClientVersion.CURRENT)));
     // replication factor and number of nodes in the pipeline do not match
     assertThat(e.getMessage()).contains("do not match");
 
     // add a pipeline
     Pipeline pipeline = createDummyPipeline(1);
     HddsProtos.Pipeline pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
 
     try {
       stateManager.addPipeline(pipelineProto);
@@ -144,11 +144,11 @@ public void testGetPipelines() throws IOException, 
TimeoutException {
 
     Set<HddsProtos.Pipeline> pipelines = new HashSet<>();
     HddsProtos.Pipeline pipeline = createDummyPipeline(1).getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     stateManager.addPipeline(pipeline);
     pipelines.add(pipeline);
     pipeline = createDummyPipeline(1).getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     stateManager.addPipeline(pipeline);
     pipelines.add(pipeline);
 
@@ -179,19 +179,19 @@ public void testGetPipelinesByTypeAndFactor()
           // 5 pipelines in allocated state for each type and factor
           HddsProtos.Pipeline pipeline =
               createDummyPipeline(type, factor, factor.getNumber())
-                  .getProtobufMessage(ClientVersion.CURRENT.serialize());
+                  .getProtobufMessage(ClientVersion.CURRENT);
           stateManager.addPipeline(pipeline);
           pipelines.add(pipeline);
 
           // 5 pipelines in open state for each type and factor
           pipeline = createDummyPipeline(type, factor, factor.getNumber())
-              .getProtobufMessage(ClientVersion.CURRENT.serialize());
+              .getProtobufMessage(ClientVersion.CURRENT);
           stateManager.addPipeline(pipeline);
           pipelines.add(pipeline);
 
           // 5 pipelines in closed state for each type and factor
           pipeline = createDummyPipeline(type, factor, factor.getNumber())
-              .getProtobufMessage(ClientVersion.CURRENT.serialize());
+              .getProtobufMessage(ClientVersion.CURRENT);
           stateManager.addPipeline(pipeline);
           pipelines.add(pipeline);
         }
@@ -232,20 +232,20 @@ public void testGetPipelinesByTypeFactorAndState()
           // 5 pipelines in allocated state for each type and factor
           HddsProtos.Pipeline pipeline =
               createDummyPipeline(type, factor, factor.getNumber())
-                  .getProtobufMessage(ClientVersion.CURRENT.serialize());
+                  .getProtobufMessage(ClientVersion.CURRENT);
           stateManager.addPipeline(pipeline);
           pipelines.add(pipeline);
 
           // 5 pipelines in open state for each type and factor
           pipeline = createDummyPipeline(type, factor, factor.getNumber())
-              .getProtobufMessage(ClientVersion.CURRENT.serialize());
+              .getProtobufMessage(ClientVersion.CURRENT);
           stateManager.addPipeline(pipeline);
           openPipeline(pipeline);
           pipelines.add(pipeline);
 
           // 5 pipelines in dormant state for each type and factor
           pipeline = createDummyPipeline(type, factor, factor.getNumber())
-              .getProtobufMessage(ClientVersion.CURRENT.serialize());
+              .getProtobufMessage(ClientVersion.CURRENT);
           stateManager.addPipeline(pipeline);
           openPipeline(pipeline);
           deactivatePipeline(pipeline);
@@ -253,7 +253,7 @@ public void testGetPipelinesByTypeFactorAndState()
 
           // 5 pipelines in closed state for each type and factor
           pipeline = createDummyPipeline(type, factor, factor.getNumber())
-              .getProtobufMessage(ClientVersion.CURRENT.serialize());
+              .getProtobufMessage(ClientVersion.CURRENT);
           stateManager.addPipeline(pipeline);
           finalizePipeline(pipeline);
           pipelines.add(pipeline);
@@ -292,7 +292,7 @@ public void testAddAndGetContainer() throws IOException, 
TimeoutException {
     long containerID = 0;
     Pipeline pipeline = createDummyPipeline(1);
     HddsProtos.Pipeline pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     pipeline = stateManager.getPipeline(pipeline.getId());
     stateManager.addContainerToPipeline(pipeline.getId(),
@@ -325,7 +325,7 @@ public void testAddAndGetContainer() throws IOException, 
TimeoutException {
   public void testRemovePipeline() throws IOException, TimeoutException {
     Pipeline pipeline = createDummyPipeline(1);
     HddsProtos.Pipeline pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     // close the pipeline
     openPipeline(pipelineProto);
@@ -347,7 +347,7 @@ public void testRemoveContainer() throws IOException, 
TimeoutException {
     long containerID = 1;
     Pipeline pipeline = createDummyPipeline(1);
     HddsProtos.Pipeline pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     // create an open pipeline in stateMap
     stateManager.addPipeline(pipelineProto);
     openPipeline(pipelineProto);
@@ -387,7 +387,7 @@ public void testRemoveContainer() throws IOException, 
TimeoutException {
   public void testFinalizePipeline() throws IOException, TimeoutException {
     Pipeline pipeline = createDummyPipeline(1);
     HddsProtos.Pipeline pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     // finalize on ALLOCATED pipeline
     finalizePipeline(pipelineProto);
@@ -398,7 +398,7 @@ public void testFinalizePipeline() throws IOException, 
TimeoutException {
 
     pipeline = createDummyPipeline(1);
     pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     openPipeline(pipelineProto);
     // finalize on OPEN pipeline
@@ -410,7 +410,7 @@ public void testFinalizePipeline() throws IOException, 
TimeoutException {
 
     pipeline = createDummyPipeline(1);
     pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     openPipeline(pipelineProto);
     finalizePipeline(pipelineProto);
@@ -426,7 +426,7 @@ public void testFinalizePipeline() throws IOException, 
TimeoutException {
   public void testOpenPipeline() throws IOException, TimeoutException {
     Pipeline pipeline = createDummyPipeline(1);
     HddsProtos.Pipeline pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     // open on ALLOCATED pipeline
     openPipeline(pipelineProto);
@@ -448,7 +448,7 @@ public void testQueryPipeline() throws IOException, 
TimeoutException {
         HddsProtos.ReplicationFactor.THREE, 3);
     // pipeline in allocated state should not be reported
     HddsProtos.Pipeline pipelineProto = pipeline
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     assertEquals(0, stateManager
         .getPipelines(RatisReplicationConfig
@@ -470,7 +470,7 @@ public void testQueryPipeline() throws IOException, 
TimeoutException {
         .setState(Pipeline.PipelineState.OPEN)
         .build();
     HddsProtos.Pipeline pipelineProto2 = pipeline2
-        .getProtobufMessage(ClientVersion.CURRENT.serialize());
+        .getProtobufMessage(ClientVersion.CURRENT);
     // pipeline in open state should be reported
     stateManager.addPipeline(pipelineProto2);
     assertEquals(2, stateManager
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestRatisPipelineProvider.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestRatisPipelineProvider.java
index 04a935f6847..29faf3ea238 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestRatisPipelineProvider.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestRatisPipelineProvider.java
@@ -141,14 +141,14 @@ private void createPipelineAndAssertions(
     assertPipelineProperties(pipeline, factor, REPLICATION_TYPE,
         Pipeline.PipelineState.ALLOCATED);
     HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     nodeManager.addPipeline(pipeline);
 
     Pipeline pipeline1 = provider.create(RatisReplicationConfig
         .getInstance(factor));
     HddsProtos.Pipeline pipelineProto1 = pipeline1.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     assertPipelineProperties(pipeline1, factor, REPLICATION_TYPE,
         Pipeline.PipelineState.ALLOCATED);
     // New pipeline should not overlap with the previous created pipeline
@@ -190,7 +190,7 @@ public void testCreatePipelineWithFactor() throws Exception 
{
     assertPipelineProperties(pipeline, factor, REPLICATION_TYPE,
         Pipeline.PipelineState.ALLOCATED);
     HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
 
     factor = HddsProtos.ReplicationFactor.ONE;
@@ -199,7 +199,7 @@ public void testCreatePipelineWithFactor() throws Exception 
{
     assertPipelineProperties(pipeline1, factor, REPLICATION_TYPE,
         Pipeline.PipelineState.ALLOCATED);
     HddsProtos.Pipeline pipelineProto1 = pipeline1.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto1);
     // With enough pipeline quote on datanodes, they should not share
     // the same set of datanodes.
@@ -279,7 +279,7 @@ public void testCreatePipelinesDnExclude() throws Exception 
{
     assertPipelineProperties(pipeline, factor, REPLICATION_TYPE,
         Pipeline.PipelineState.ALLOCATED);
     HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     nodeManager.addPipeline(pipeline);
     stateManager.addPipeline(pipelineProto);
 
@@ -406,7 +406,7 @@ public void testCreatePipelineWithDefaultLimit() throws 
Exception {
       Pipeline p = provider.create(
           RatisReplicationConfig.getInstance(ReplicationFactor.THREE),
           new ArrayList<>(), new ArrayList<>());
-      
stateManager.addPipeline(p.getProtobufMessage(ClientVersion.CURRENT.serialize()));
+      stateManager.addPipeline(p.getProtobufMessage(ClientVersion.CURRENT));
     }
 
     // Next pipeline creation should fail with default limit message.
@@ -431,7 +431,7 @@ public void 
testCreatePipelineThrowErrorWithDataNodeLimit(int limit, int pipelin
     for (int i = 0; i < pipelineCount; i++) {
       stateManager.addPipeline(
           
provider.create(RatisReplicationConfig.getInstance(ReplicationFactor.THREE),
-              new ArrayList<>(), new 
ArrayList<>()).getProtobufMessage(ClientVersion.CURRENT.serialize())
+              new ArrayList<>(), new 
ArrayList<>()).getProtobufMessage(ClientVersion.CURRENT)
       );
     }
 
@@ -458,7 +458,7 @@ private void addPipeline(
         .setId(PipelineID.randomId())
         .build();
     HddsProtos.Pipeline pipelineProto = openPipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
 
     stateManager.addPipeline(pipelineProto);
     nodeManager.addPipeline(openPipeline);
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSimplePipelineProvider.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSimplePipelineProvider.java
index 07a064a2b7d..d2d4e9b6e26 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSimplePipelineProvider.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/pipeline/TestSimplePipelineProvider.java
@@ -81,7 +81,7 @@ public void testCreatePipelineWithFactor() throws Exception {
     Pipeline pipeline =
         provider.create(StandaloneReplicationConfig.getInstance(factor));
     HddsProtos.Pipeline pipelineProto = pipeline.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto);
     assertEquals(pipeline.getType(), HddsProtos.ReplicationType.STAND_ALONE);
     assertEquals(pipeline.getReplicationConfig().getRequiredNodes(), 
factor.getNumber());
@@ -92,7 +92,7 @@ public void testCreatePipelineWithFactor() throws Exception {
     Pipeline pipeline1 =
         provider.create(StandaloneReplicationConfig.getInstance(factor));
     HddsProtos.Pipeline pipelineProto1 = pipeline1.getProtobufMessage(
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     stateManager.addPipeline(pipelineProto1);
     assertEquals(pipeline1.getType(), HddsProtos.ReplicationType.STAND_ALONE);
     assertEquals(
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestScmBlockLocationProtocolServerSideTranslatorPB.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestScmBlockLocationProtocolServerSideTranslatorPB.java
index 6b7674d7642..df81ddd688b 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestScmBlockLocationProtocolServerSideTranslatorPB.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/protocol/TestScmBlockLocationProtocolServerSideTranslatorPB.java
@@ -128,7 +128,7 @@ private AllocateScmBlockResponseProto allocate(int 
numBlocks) throws Exception {
         .setFactor(ReplicationFactor.THREE)
         .setOwner("owner")
         .build();
-    return service.allocateScmBlock(request, 
ClientVersion.CURRENT.serialize());
+    return service.allocateScmBlock(request, ClientVersion.CURRENT);
   }
 
   private Pipeline buildPipeline(List<DatanodeDetails> pipelineNodes) {
diff --git 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java
 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java
index 0fe156448ee..fa733d3712a 100644
--- 
a/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java
+++ 
b/hadoop-hdds/server-scm/src/test/java/org/apache/hadoop/hdds/scm/server/TestSCMBlockProtocolServer.java
@@ -274,7 +274,7 @@ public void testSortDatanodes() throws Exception {
             .setClient(client)
             .build();
     ScmBlockLocationProtocolProtos.SortDatanodesResponseProto resp =
-        service.sortDatanodes(request, ClientVersion.CURRENT.serialize());
+        service.sortDatanodes(request, ClientVersion.CURRENT);
     assertEquals(NODE_COUNT, resp.getNodeList().size());
     System.out.println("client = " + client);
     resp.getNodeList().stream().forEach(
@@ -290,7 +290,7 @@ public void testSortDatanodes() throws Exception {
         .addAllNodeNetworkName(nodes)
         .setClient(client)
         .build();
-    resp = service.sortDatanodes(request, ClientVersion.CURRENT.serialize());
+    resp = service.sortDatanodes(request, ClientVersion.CURRENT);
     System.out.println("client = " + client);
     assertEquals(0, resp.getNodeList().size());
     resp.getNodeList().stream().forEach(
diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
index 9f14744d2a5..d03a6215a68 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/hdds/scm/cli/ContainerOperationClient.java
@@ -252,7 +252,7 @@ public List<HddsProtos.Node> queryNode(
       HddsProtos.QueryScope queryScope, String poolName)
       throws IOException {
     return storageContainerLocationClient.queryNode(opState, nodeState,
-        queryScope, poolName, ClientVersion.CURRENT.serialize());
+        queryScope, poolName, ClientVersion.CURRENT);
   }
 
   @Override
@@ -467,7 +467,7 @@ public ContainerWithPipeline getContainerWithPipeline(long 
containerId)
   public List<ContainerReplicaInfo> getContainerReplicas(long containerId) 
throws IOException {
     List<HddsProtos.SCMContainerReplicaProto> protos =
         storageContainerLocationClient.getContainerReplicas(containerId,
-            ClientVersion.CURRENT.serialize());
+            ClientVersion.CURRENT);
     List<ContainerReplicaInfo> replicas = new ArrayList<>();
     for (HddsProtos.SCMContainerReplicaProto p : protos) {
       replicas.add(ContainerReplicaInfo.fromProto(p));
@@ -590,14 +590,14 @@ public DeletedBlocksTransactionSummary 
getDeletedBlockSummary() throws IOExcepti
   public List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
       String address, String uuid) throws IOException {
     return storageContainerLocationClient.getDatanodeUsageInfo(address,
-        uuid, ClientVersion.CURRENT.serialize());
+        uuid, ClientVersion.CURRENT);
   }
 
   @Override
   public List<HddsProtos.DatanodeUsageInfoProto> getDatanodeUsageInfo(
       boolean mostUsed, int count) throws IOException {
     return storageContainerLocationClient.getDatanodeUsageInfo(mostUsed, count,
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
   }
 
   @Override
diff --git 
a/hadoop-ozone/cli-debug/src/main/java/org/apache/hadoop/ozone/fsck/ContainerMapper.java
 
b/hadoop-ozone/cli-debug/src/main/java/org/apache/hadoop/ozone/fsck/ContainerMapper.java
index 294b06f0c02..42a7726d039 100644
--- 
a/hadoop-ozone/cli-debug/src/main/java/org/apache/hadoop/ozone/fsck/ContainerMapper.java
+++ 
b/hadoop-ozone/cli-debug/src/main/java/org/apache/hadoop/ozone/fsck/ContainerMapper.java
@@ -88,7 +88,7 @@ public static void main(String[] args) throws IOException {
                 keyValueTableIterator.next();
             OmKeyInfo omKeyInfo = keyValue.getValue();
             byte[] value = omKeyInfo
-                .getProtobuf(true, ClientVersion.CURRENT.serialize())
+                .getProtobuf(true, ClientVersion.CURRENT)
                 .toByteArray();
             OmKeyInfo keyInfo = OmKeyInfo.getFromProtobuf(
                 OzoneManagerProtocolProtos.KeyInfo.parseFrom(value));
diff --git 
a/hadoop-ozone/cli-debug/src/test/java/org/apache/hadoop/ozone/debug/om/TestContainerToKeyMapping.java
 
b/hadoop-ozone/cli-debug/src/test/java/org/apache/hadoop/ozone/debug/om/TestContainerToKeyMapping.java
index 4cad62cd719..fd1650683b0 100644
--- 
a/hadoop-ozone/cli-debug/src/test/java/org/apache/hadoop/ozone/debug/om/TestContainerToKeyMapping.java
+++ 
b/hadoop-ozone/cli-debug/src/test/java/org/apache/hadoop/ozone/debug/om/TestContainerToKeyMapping.java
@@ -31,6 +31,7 @@
 import org.apache.hadoop.hdds.client.StandaloneReplicationConfig;
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.debug.OzoneDebug;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
@@ -304,7 +305,7 @@ private void createMultipartUpload() throws Exception {
     // Create part 1 with a block in container 4
     OmKeyInfo part1Info = createOBSKeyInfo(
         mpuKeyName + "/" + uploadId + "/part-1", MPU_PART1_ID, CONTAINER_ID_4);
-    KeyInfo part1Proto = part1Info.getProtobuf(true, 0);
+    KeyInfo part1Proto = part1Info.getProtobuf(true, 
ClientVersion.DEFAULT_VERSION);
     PartKeyInfo partKeyInfo1 = PartKeyInfo.newBuilder()
         .setPartName(mpuKeyName + "/" + uploadId + "/part-1")
         .setPartNumber(1)
@@ -314,7 +315,7 @@ private void createMultipartUpload() throws Exception {
     // Create part 2 with a block in container 4
     OmKeyInfo part2Info = createOBSKeyInfo(
         mpuKeyName + "/" + uploadId + "/part-2", MPU_PART2_ID, CONTAINER_ID_4);
-    KeyInfo part2Proto = part2Info.getProtobuf(true, 0);
+    KeyInfo part2Proto = part2Info.getProtobuf(true, 
ClientVersion.DEFAULT_VERSION);
     PartKeyInfo partKeyInfo2 = PartKeyInfo.newBuilder()
         .setPartName(mpuKeyName + "/" + uploadId + "/part-2")
         .setPartNumber(2)
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/KeyInfoWithVolumeContext.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/KeyInfoWithVolumeContext.java
index d6d54d3c174..8a164efe8ef 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/KeyInfoWithVolumeContext.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/KeyInfoWithVolumeContext.java
@@ -19,6 +19,7 @@
 
 import java.io.IOException;
 import java.util.Optional;
+import org.apache.hadoop.ozone.ClientVersion;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.GetKeyInfoResponse;
 
 /**
@@ -55,7 +56,7 @@ public static KeyInfoWithVolumeContext fromProtobuf(
         .build();
   }
 
-  public GetKeyInfoResponse toProtobuf(int clientVersion) {
+  public GetKeyInfoResponse toProtobuf(ClientVersion clientVersion) {
     GetKeyInfoResponse.Builder builder = GetKeyInfoResponse.newBuilder();
     volumeArgs.ifPresent(v -> builder.setVolumeInfo(v.getProtobuf()));
     userPrincipal.ifPresent(builder::setUserPrincipal);
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
index ca911f895c7..7258403e8f1 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyInfo.java
@@ -143,7 +143,7 @@ private static Codec<OmKeyInfo> newCodec(boolean isOpenKey) 
{
     return new DelegatedCodec<>(
         Proto2Codec.get(KeyInfo.getDefaultInstance()),
         OmKeyInfo::getFromProtobuf,
-        k -> k.getProtobuf(true, ClientVersion.CURRENT.serialize(), isOpenKey),
+        k -> k.getProtobuf(true, ClientVersion.CURRENT, isOpenKey),
         OmKeyInfo.class);
   }
 
@@ -724,7 +724,7 @@ protected OmKeyInfo buildObject() {
    * For network transmit.
    * @return KeyInfo
    */
-  public KeyInfo getProtobuf(int clientVersion) {
+  public KeyInfo getProtobuf(ClientVersion clientVersion) {
     return getProtobuf(false, clientVersion);
   }
 
@@ -734,7 +734,7 @@ public KeyInfo getProtobuf(int clientVersion) {
    * @param latestVersion
    * @return key info.
    */
-  public KeyInfo getNetworkProtobuf(int clientVersion, boolean latestVersion) {
+  public KeyInfo getNetworkProtobuf(ClientVersion clientVersion, boolean 
latestVersion) {
     return getProtobuf(false, null, clientVersion, latestVersion);
   }
 
@@ -746,7 +746,7 @@ public KeyInfo getNetworkProtobuf(int clientVersion, 
boolean latestVersion) {
    * @param latestVersion
    * @return key info with the user given full key name
    */
-  public KeyInfo getNetworkProtobuf(String fullKeyName, int clientVersion,
+  public KeyInfo getNetworkProtobuf(String fullKeyName, ClientVersion 
clientVersion,
       boolean latestVersion) {
     return getProtobuf(false, fullKeyName, clientVersion, latestVersion);
   }
@@ -756,7 +756,7 @@ public KeyInfo getNetworkProtobuf(String fullKeyName, int 
clientVersion,
    * @param ignorePipeline true for persist to DB, false for network transmit.
    * @return KeyInfo
    */
-  public KeyInfo getProtobuf(boolean ignorePipeline, int clientVersion) {
+  public KeyInfo getProtobuf(boolean ignorePipeline, ClientVersion 
clientVersion) {
     return getProtobuf(ignorePipeline, null, clientVersion, false, true);
   }
 
@@ -768,7 +768,7 @@ public KeyInfo getProtobuf(boolean ignorePipeline, int 
clientVersion) {
    * @param isOpenKey true for openKeyTable, false for keyTable
    * @return KeyInfo
    */
-  public KeyInfo getProtobuf(boolean ignorePipeline, int clientVersion,
+  public KeyInfo getProtobuf(boolean ignorePipeline, ClientVersion 
clientVersion,
                              boolean isOpenKey) {
     return getProtobuf(ignorePipeline, null, clientVersion, false, isOpenKey);
   }
@@ -781,7 +781,7 @@ public KeyInfo getProtobuf(boolean ignorePipeline, int 
clientVersion,
    * @return key info object
    */
   private KeyInfo getProtobuf(boolean ignorePipeline, String fullKeyName,
-                              int clientVersion, boolean latestVersionBlocks) {
+                              ClientVersion clientVersion, boolean 
latestVersionBlocks) {
     return getProtobuf(ignorePipeline, fullKeyName, clientVersion, 
latestVersionBlocks, true);
   }
 
@@ -796,7 +796,7 @@ private KeyInfo getProtobuf(boolean ignorePipeline, String 
fullKeyName,
    * @return key info object
    */
   private KeyInfo getProtobuf(boolean ignorePipeline, String fullKeyName,
-                              int clientVersion, boolean latestVersionBlocks,
+                              ClientVersion clientVersion, boolean 
latestVersionBlocks,
                               boolean isOpenKey) {
     long latestVersion = keyLocationVersions.isEmpty() ? -1 :
         keyLocationVersions.get(keyLocationVersions.size() - 1).getVersion();
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfo.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfo.java
index d3fea73b211..4de931978b9 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfo.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfo.java
@@ -21,6 +21,7 @@
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.storage.BlockLocationInfo;
 import org.apache.hadoop.hdds.security.token.OzoneBlockTokenIdentifier;
+import org.apache.hadoop.ozone.ClientVersion;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyLocation;
 import org.apache.hadoop.ozone.protocolPB.OMPBHelper;
 import org.apache.hadoop.security.token.Token;
@@ -88,11 +89,11 @@ public OmKeyLocationInfo build() {
     }
   }
 
-  public KeyLocation getProtobuf(int clientVersion) {
+  public KeyLocation getProtobuf(ClientVersion clientVersion) {
     return getProtobuf(false, clientVersion);
   }
 
-  public KeyLocation getProtobuf(boolean ignorePipeline, int clientVersion) {
+  public KeyLocation getProtobuf(boolean ignorePipeline, ClientVersion 
clientVersion) {
     KeyLocation.Builder builder = KeyLocation.newBuilder()
         .setBlockID(getBlockID().getProtobuf())
         .setLength(getLength())
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java
index e2477a4cef1..f54c4108c2c 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmKeyLocationInfoGroup.java
@@ -24,6 +24,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyLocationList;
 
@@ -125,7 +126,7 @@ public List<OmKeyLocationInfo> getLocationList(Long 
versionToFetch) {
   }
 
   public KeyLocationList getProtobuf(boolean ignorePipeline,
-      int clientVersion) {
+      ClientVersion clientVersion) {
     KeyLocationList.Builder builder = KeyLocationList.newBuilder()
         .setVersion(version).setIsMultipartKey(isMultipartKey);
     List<OzoneManagerProtocolProtos.KeyLocation> keyLocationList =
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmMultipartPartInfo.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmMultipartPartInfo.java
index 41bf349f504..3b750c7e3e9 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmMultipartPartInfo.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OmMultipartPartInfo.java
@@ -338,7 +338,7 @@ private KeyLocationList getKeyLocationInfosAsProto() {
     if (keyLocationInfos == null || keyLocationInfos.isEmpty()) {
       throw new IllegalArgumentException("keyLocationList is required");
     }
-    return keyLocationInfos.get(0).getProtobuf(true, 
ClientVersion.CURRENT.serialize());
+    return keyLocationInfos.get(0).getProtobuf(true, ClientVersion.CURRENT);
   }
 
   private static List<OmKeyLocationInfoGroup> getKeyLocationInfosFromProto(
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneFileStatus.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneFileStatus.java
index e0d7ebe37b6..8f17d986b26 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneFileStatus.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/OzoneFileStatus.java
@@ -21,6 +21,7 @@
 
 import java.io.IOException;
 import java.util.Objects;
+import org.apache.hadoop.ozone.ClientVersion;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneFileStatusProto;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OzoneFileStatusProto.Builder;
 
@@ -92,7 +93,7 @@ public boolean isFile() {
     return !isDirectory();
   }
 
-  public OzoneFileStatusProto getProtobuf(int clientVersion) {
+  public OzoneFileStatusProto getProtobuf(ClientVersion clientVersion) {
     Builder builder = OzoneFileStatusProto.newBuilder()
         .setBlockSize(blockSize)
         .setIsDirectory(isDirectory);
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/RepeatedOmKeyInfo.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/RepeatedOmKeyInfo.java
index 39a3497aa1d..fe55033b36b 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/RepeatedOmKeyInfo.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/helpers/RepeatedOmKeyInfo.java
@@ -60,7 +60,7 @@ private static Codec<RepeatedOmKeyInfo> newCodec(boolean 
ignorePipeline, boolean
     return new DelegatedCodec<>(
         Proto2Codec.get(RepeatedKeyInfo.getDefaultInstance()),
         RepeatedOmKeyInfo::getFromProto,
-        k -> k.getProto(ignorePipeline, ClientVersion.CURRENT.serialize(), 
isOpenKey),
+        k -> k.getProto(ignorePipeline, ClientVersion.CURRENT, isOpenKey),
         RepeatedOmKeyInfo.class);
   }
 
@@ -151,7 +151,7 @@ public static RepeatedOmKeyInfo 
getFromProto(RepeatedKeyInfo repeatedKeyInfo) {
   /**
    * @param compact true for persistence, false for network transmit
    */
-  public RepeatedKeyInfo getProto(boolean compact, int clientVersion) {
+  public RepeatedKeyInfo getProto(boolean compact, ClientVersion 
clientVersion) {
     return getProto(compact, clientVersion, true);
   }
 
@@ -160,7 +160,7 @@ public RepeatedKeyInfo getProto(boolean compact, int 
clientVersion) {
    * @param clientVersion the client version
    * @param isOpenKey true for openKeyTable, false for keyTable/deletedTable
    */
-  public RepeatedKeyInfo getProto(boolean compact, int clientVersion, boolean 
isOpenKey) {
+  public RepeatedKeyInfo getProto(boolean compact, ClientVersion 
clientVersion, boolean isOpenKey) {
     List<KeyInfo> list = new ArrayList<>();
     for (OmKeyInfo k : cloneOmKeyInfoList()) {
       list.add(k.getProtobuf(compact, clientVersion, isOpenKey));
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 c17af89679d..c5bc6f45e01 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
@@ -854,8 +854,7 @@ private void updateKey(OmKeyArgs args, long clientId, 
boolean hsync, boolean rec
         .setDataSize(args.getDataSize())
         .addAllMetadata(KeyValueUtil.toProtobuf(args.getMetadata()))
         .addAllKeyLocations(locationInfoList.stream()
-            // TODO use OM version?
-            .map(info -> info.getProtobuf(ClientVersion.CURRENT.serialize()))
+            .map(info -> info.getProtobuf(ClientVersion.CURRENT))
             .collect(Collectors.toList()));
 
     setReplicationConfig(args.getReplicationConfig(), keyArgsBuilder);
@@ -1773,8 +1772,7 @@ public OmMultipartCommitUploadPartInfo 
commitMultipartUploadPart(
         .setDataSize(omKeyArgs.getDataSize())
         .addAllMetadata(KeyValueUtil.toProtobuf(omKeyArgs.getMetadata()))
         .addAllKeyLocations(locationInfoList.stream()
-            // TODO use OM version?
-            .map(info -> info.getProtobuf(ClientVersion.CURRENT.serialize()))
+            .map(info -> info.getProtobuf(ClientVersion.CURRENT))
             .collect(Collectors.toList()));
     multipartCommitUploadPartRequest.setClientID(clientId);
     multipartCommitUploadPartRequest.setKeyArgs(keyArgs.build());
diff --git 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
index bc8928f9c4c..30e69b13d68 100644
--- 
a/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
+++ 
b/hadoop-ozone/common/src/test/java/org/apache/hadoop/ozone/om/helpers/TestOmKeyInfo.java
@@ -60,7 +60,7 @@ public void protobufConversion() throws IOException {
         RatisReplicationConfig.getInstance(ReplicationFactor.THREE));
 
     OmKeyInfo keyAfterSerialization = OmKeyInfo.getFromProtobuf(
-        key.getProtobuf(ClientVersion.CURRENT.serialize()));
+        key.getProtobuf(ClientVersion.CURRENT));
 
     assertNotNull(keyAfterSerialization);
     assertEquals(key, keyAfterSerialization);
@@ -78,7 +78,7 @@ public void getProtobufMessageEC() throws IOException {
     OmKeyInfo key = createOmKeyInfo(
         RatisReplicationConfig.getInstance(ReplicationFactor.THREE));
     OzoneManagerProtocolProtos.KeyInfo omKeyProto =
-        key.getProtobuf(ClientVersion.CURRENT.serialize());
+        key.getProtobuf(ClientVersion.CURRENT);
 
     // No EC Config
     assertFalse(omKeyProto.hasEcReplicationConfig());
@@ -95,7 +95,7 @@ public void getProtobufMessageEC() throws IOException {
     // EC Config
     key = createOmKeyInfo(new ECReplicationConfig(3, 2));
     assertFalse(key.isHsync());
-    omKeyProto = key.getProtobuf(ClientVersion.CURRENT.serialize());
+    omKeyProto = key.getProtobuf(ClientVersion.CURRENT);
 
     assertEquals(3,
         omKeyProto.getEcReplicationConfig().getData());
diff --git 
a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
 
b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
index ee63904be59..0fd5234ba91 100644
--- 
a/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
+++ 
b/hadoop-ozone/integration-test-recon/src/test/java/org/apache/hadoop/ozone/recon/AbstractTestStorageDistributionEndpoint.java
@@ -49,6 +49,7 @@
 import org.apache.hadoop.hdds.scm.events.SCMEvents;
 import org.apache.hadoop.hdds.scm.server.StorageContainerManager;
 import org.apache.hadoop.hdds.utils.IOUtils;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.MiniOzoneCluster;
 import org.apache.hadoop.ozone.client.BucketArgs;
 import org.apache.hadoop.ozone.client.ObjectStore;
@@ -229,7 +230,8 @@ protected boolean 
verifyStorageDistributionAfterKeyCreation() {
 
       List<DatanodeStorageReport> reports = storageResponse.getDataNodeUsage();
       List<HddsProtos.DatanodeUsageInfoProto> scmReports =
-          scm.getClientProtocolServer().getDatanodeUsageInfo(true, 
getNumDatanodes(), 1);
+          scm.getClientProtocolServer().getDatanodeUsageInfo(true, 
getNumDatanodes(),
+              ClientVersion.VERSION_HANDLES_UNKNOWN_DN_PORTS);
 
       long totalReserved = 0;
       long totalMinFreeSpace = 0;
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java
index 687201e0a14..4391b622b57 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/container/TestScmApplyTransactionFailure.java
@@ -94,7 +94,7 @@ public void testAddDuplicatePipelineId()
         replication, PipelineState.OPEN).get(0);
 
     HddsProtos.Pipeline pipelineToCreate =
-        existing.getProtobufMessage(CURRENT.serialize());
+        existing.getProtobufMessage(CURRENT);
     Throwable ex = assertThrows(SCMException.class,
         () -> pipelineManager.getStateManager().addPipeline(
             pipelineToCreate));
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java
index 94b160e5c8c..f6cfc6759d7 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/debug/TestLDBCli.java
@@ -500,7 +500,7 @@ private void prepareKeyTable(int recordsCount) throws 
IOException {
       OmKeyInfo value = OMRequestTestUtils.createOmKeyInfo("vol1", "buck1",
           key, ReplicationConfig.fromProtoTypeAndFactor(STAND_ALONE,
               HddsProtos.ReplicationFactor.ONE)).build();
-      keyTable.put(key.getBytes(UTF_8), 
value.getProtobuf(ClientVersion.CURRENT.serialize()).toByteArray());
+      keyTable.put(key.getBytes(UTF_8), 
value.getProtobuf(ClientVersion.CURRENT).toByteArray());
       // Populate map
       dbMap.put(key, toMap(value));
     }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/checksum/TestContainerCommandReconciliation.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/checksum/TestContainerCommandReconciliation.java
index 3868c691862..3c8656ab768 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/checksum/TestContainerCommandReconciliation.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/dn/checksum/TestContainerCommandReconciliation.java
@@ -511,7 +511,7 @@ public void testDataChecksumReportedAtSCM() throws 
Exception {
     // Check non-zero checksum after container close
     StorageContainerLocationProtocolClientSideTranslatorPB scmClient = 
cluster.getStorageContainerLocationClient();
     List<HddsProtos.SCMContainerReplicaProto> containerReplicas = 
scmClient.getContainerReplicas(containerID,
-        ClientVersion.CURRENT.serialize());
+        ClientVersion.CURRENT);
     assertEquals(3, containerReplicas.size());
     for (HddsProtos.SCMContainerReplicaProto containerReplica: 
containerReplicas) {
       assertNotEquals(0, containerReplica.getDataChecksum());
@@ -545,7 +545,7 @@ public void testDataChecksumReportedAtSCM() throws 
Exception {
     scmClient.reconcileContainer(containerID);
     waitForDataChecksumsAtSCM(containerID, 1);
     // Check non-zero checksum after container reconciliation
-    containerReplicas = scmClient.getContainerReplicas(containerID, 
ClientVersion.CURRENT.serialize());
+    containerReplicas = scmClient.getContainerReplicas(containerID, 
ClientVersion.CURRENT);
     assertEquals(3, containerReplicas.size());
     for (HddsProtos.SCMContainerReplicaProto containerReplica: 
containerReplicas) {
       assertNotEquals(0, containerReplica.getDataChecksum());
@@ -559,7 +559,7 @@ public void testDataChecksumReportedAtSCM() throws 
Exception {
     }
     cluster.waitForClusterToBeReady();
     waitForDataChecksumsAtSCM(containerID, 1);
-    containerReplicas = scmClient.getContainerReplicas(containerID, 
ClientVersion.CURRENT.serialize());
+    containerReplicas = scmClient.getContainerReplicas(containerID, 
ClientVersion.CURRENT);
     assertEquals(3, containerReplicas.size());
     for (HddsProtos.SCMContainerReplicaProto containerReplica: 
containerReplicas) {
       assertNotEquals(0, containerReplica.getDataChecksum());
@@ -571,7 +571,7 @@ private void waitForDataChecksumsAtSCM(long containerID, 
int expectedSize) throw
     GenericTestUtils.waitFor(() -> {
       try {
         Set<Long> dataChecksums = 
cluster.getStorageContainerLocationClient().getContainerReplicas(containerID,
-                ClientVersion.CURRENT.serialize()).stream()
+                ClientVersion.CURRENT).stream()
             .map(HddsProtos.SCMContainerReplicaProto::getDataChecksum)
             .collect(Collectors.toSet());
         LOG.info("Waiting for {} total unique checksums from container {} to 
be reported to SCM. Currently {} unique" +
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
index 89960027839..e230b84b8b1 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java
@@ -1501,7 +1501,7 @@ public ExpiredOpenKeys getExpiredOpenKeys(Duration 
expireThreshold,
                 .map(OmKeyLocationInfoGroup::getLocationList)
                 .map(Collection::stream)
                 .orElseGet(Stream::empty)
-                .map(loc -> loc.getProtobuf(ClientVersion.CURRENT.serialize()))
+                .map(loc -> loc.getProtobuf(ClientVersion.CURRENT))
                 .forEach(keyArgs::addKeyLocations);
 
             OzoneManagerProtocolClientSideTranslatorPB.setReplicationConfig(
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
index 35e1ac238f7..0f72da7c58f 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequest.java
@@ -35,6 +35,7 @@
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.utils.UniqueId;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -135,7 +136,8 @@ public OMRequest preExecute(OzoneManager ozoneManager) 
throws IOException {
         .setDataSize(requestedSize);
 
     newKeyArgs.addAllKeyLocations(omKeyLocationInfoList.stream()
-        .map(info -> info.getProtobuf(getOmRequest().getVersion()))
+        .map(info -> info.getProtobuf(
+            ClientVersion.deserialize(getOmRequest().getVersion())))
         .collect(Collectors.toList()));
 
     generateRequiredEncryptionInfo(keyArgs, newKeyArgs, ozoneManager);
@@ -279,7 +281,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
 
       // Prepare response
       omResponse.setCreateFileResponse(CreateFileResponse.newBuilder()
-          .setKeyInfo(omKeyInfo.getNetworkProtobuf(getOmRequest().getVersion(),
+          .setKeyInfo(omKeyInfo.getNetworkProtobuf(
+              ClientVersion.deserialize(getOmRequest().getVersion()),
               keyArgs.getLatestVersionLocation()))
           .setID(clientID)
           .setOpenVersion(openVersion).build())
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java
index 6036fe90dbb..d41e11bca73 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMFileCreateRequestWithFSO.java
@@ -27,6 +27,7 @@
 import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.hadoop.hdds.client.ReplicationConfig;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OMMetrics;
@@ -207,7 +208,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
 
       // Prepare response. Sets user given full key name in the 'keyName'
       // attribute in response object.
-      int clientVersion = getOmRequest().getVersion();
+      ClientVersion clientVersion = 
ClientVersion.deserialize(getOmRequest().getVersion());
       omResponse.setCreateFileResponse(CreateFileResponse.newBuilder()
           .setKeyInfo(omFileInfo.getNetworkProtobuf(keyName, clientVersion,
               keyArgs.getLatestVersionLocation()))
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
index ca1ea07ad6e..7b3dc2b3d47 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
@@ -38,6 +38,7 @@
 import java.util.concurrent.TimeUnit;
 import 
org.apache.hadoop.hdds.scm.container.common.helpers.ContainerWithPipeline;
 import org.apache.hadoop.hdds.security.token.OzoneBlockTokenSecretManager;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -257,8 +258,9 @@ private RecoverLeaseResponse doWork(OzoneManager 
ozoneManager,
     }
 
     RecoverLeaseResponse.Builder rb = RecoverLeaseResponse.newBuilder();
-    rb.setKeyInfo(keyInfo.getNetworkProtobuf(getOmRequest().getVersion(), 
true));
-    
rb.setOpenKeyInfo(openKeyInfo.getNetworkProtobuf(getOmRequest().getVersion(), 
true));
+    ClientVersion clientVersion = 
ClientVersion.deserialize(getOmRequest().getVersion());
+    rb.setKeyInfo(keyInfo.getNetworkProtobuf(clientVersion, true));
+    rb.setOpenKeyInfo(openKeyInfo.getNetworkProtobuf(clientVersion, true));
     return rb.build();
   }
 
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
index 0e11f1d7677..7da2cd53a24 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
@@ -32,6 +32,7 @@
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.AuditLogger;
 import org.apache.hadoop.ozone.audit.OMAction;
@@ -131,7 +132,8 @@ public OMRequest preExecute(OzoneManager ozoneManager) 
throws IOException {
 
     // Add allocated block info.
     newAllocatedBlockRequest.setKeyLocation(
-        omKeyLocationInfoList.get(0).getProtobuf(getOmRequest().getVersion()));
+        omKeyLocationInfoList.get(0).getProtobuf(
+            ClientVersion.deserialize(getOmRequest().getVersion())));
 
     return getOmRequest().toBuilder().setUserInfo(userInfo)
         .setAllocateBlockRequest(newAllocatedBlockRequest).build();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
index 929e46222c0..6303f2cbc43 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequest.java
@@ -35,6 +35,7 @@
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.utils.UniqueId;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.OzoneManagerVersion;
@@ -163,7 +164,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) 
throws IOException {
 
       newKeyArgs.addAllKeyLocations(omKeyLocationInfoList.stream()
           .map(info -> info.getProtobuf(false,
-              getOmRequest().getVersion()))
+              ClientVersion.deserialize(getOmRequest().getVersion())))
           .collect(Collectors.toList()));
     } else {
       newKeyArgs = keyArgs.toBuilder().setModificationTime(Time.now());
@@ -336,7 +337,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
 
       // Prepare response
       omResponse.setCreateKeyResponse(CreateKeyResponse.newBuilder()
-          .setKeyInfo(omKeyInfo.getNetworkProtobuf(getOmRequest().getVersion(),
+          .setKeyInfo(omKeyInfo.getNetworkProtobuf(
+              ClientVersion.deserialize(getOmRequest().getVersion()),
               keyArgs.getLatestVersionLocation()))
           .setID(clientID)
           .setOpenVersion(openVersion).build())
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java
index 99fabb46de1..122aaad8e99 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMKeyCreateRequestWithFSO.java
@@ -30,6 +30,7 @@
 import java.util.Map;
 import java.util.stream.Collectors;
 import org.apache.hadoop.hdds.client.ReplicationConfig;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OMMetrics;
@@ -201,7 +202,7 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
 
       // Prepare response. Sets user given full key name in the 'keyName'
       // attribute in response object.
-      int clientVersion = getOmRequest().getVersion();
+      ClientVersion clientVersion = 
ClientVersion.deserialize(getOmRequest().getVersion());
       omResponse.setCreateKeyResponse(CreateKeyResponse.newBuilder()
               .setKeyInfo(omFileInfo.getNetworkProtobuf(keyName, clientVersion,
                   keyArgs.getLatestVersionLocation()))
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
index 78f1af96cfb..a2bc6e86a39 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCommitPartRequest.java
@@ -30,6 +30,7 @@
 import org.apache.commons.lang3.StringUtils;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -217,7 +218,8 @@ public OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, Execut
           OzoneManagerProtocolProtos.PartKeyInfo.newBuilder();
       partKeyInfo.setPartName(partName);
       partKeyInfo.setPartNumber(partNumber);
-      
partKeyInfo.setPartKeyInfo(omKeyInfo.getProtobuf(getOmRequest().getVersion()));
+      partKeyInfo.setPartKeyInfo(omKeyInfo.getProtobuf(
+          ClientVersion.deserialize(getOmRequest().getVersion())));
 
       if (multipartKeyInfo.getSchemaVersion() == 
OmMultipartKeyInfo.LEGACY_SCHEMA_VERSION) {
         // Add this part information in to multipartKeyInfo.
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
index 841ced7dacc..0da53c46bc1 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/s3/multipart/S3MultipartUploadCompleteRequest.java
@@ -37,6 +37,7 @@
 import org.apache.hadoop.hdds.client.ReplicationConfig;
 import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
 import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -605,7 +606,8 @@ private OmMultipartKeyInfo.PartKeyInfoMap getPartKeyInfoMap(
       partKeyInfos.put(entry.getKey(), PartKeyInfo.newBuilder()
           .setPartName(partInfo.getPartName())
           .setPartNumber(partInfo.getPartNumber())
-          .setPartKeyInfo(partKeyInfo.getProtobuf(getOmRequest().getVersion()))
+          .setPartKeyInfo(partKeyInfo.getProtobuf(
+              ClientVersion.deserialize(getOmRequest().getVersion())))
           .build());
     }
     return new OmMultipartKeyInfo.PartKeyInfoMap(partKeyInfos);
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
index 8069f5faf0c..11b2ba67350 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
@@ -521,14 +521,14 @@ private OzoneManagerProtocolProtos.PurgePathRequest 
wrapPurgeRequest(
 
     for (OmKeyInfo purgeFile : purgeDeletedFiles) {
       purgePathsRequest.addDeletedSubFiles(
-          purgeFile.getProtobuf(true, ClientVersion.CURRENT.serialize()));
+          purgeFile.getProtobuf(true, ClientVersion.CURRENT));
     }
 
     // Add these directories to deletedDirTable, so that its sub-paths will be
     // traversed in next iteration to ensure cleanup all sub-children.
     for (OmKeyInfo dir : markDirsAsDeleted) {
       purgePathsRequest.addMarkDeletedSubDirs(
-          dir.getProtobuf(ClientVersion.CURRENT.serialize()));
+          dir.getProtobuf(ClientVersion.CURRENT));
     }
 
     return purgePathsRequest.build();
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
index e37b1406c49..77701ab4260 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
@@ -333,7 +333,7 @@ private Pair<Pair<Integer, Long>, Boolean> 
submitPurgeKeysRequest(
         keyToUpdate.setKey(keyToModify.getKey());
         List<OzoneManagerProtocolProtos.KeyInfo> keyInfos =
             keyToModify.getValue().getOmKeyInfoList().stream()
-                .map(k -> k.getProtobuf(ClientVersion.CURRENT.serialize()))
+                .map(k -> k.getProtobuf(ClientVersion.CURRENT))
                 .collect(Collectors.toList());
         keyToUpdate.addAllKeyInfos(keyInfos);
         keyToUpdate.setBucketId(keyToModify.getValue().getBucketId());
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
index 481a7ce88f9..c1508a89d83 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
@@ -196,14 +196,14 @@ public BackgroundTaskResult call() throws 
InterruptedException {
               for (Table.KeyValue<String, List<OmKeyInfo>> deletedEntry : 
deletedKeyEntries) {
                 
deletedKeys.add(SnapshotMoveKeyInfos.newBuilder().setKey(deletedEntry.getKey())
                     .addAllKeyInfos(deletedEntry.getValue()
-                        .stream().map(val -> 
val.getProtobuf(ClientVersion.CURRENT.serialize()))
+                        .stream().map(val -> 
val.getProtobuf(ClientVersion.CURRENT))
                         .collect(Collectors.toList())).build());
               }
 
               // Convert deletedDirEntries to SnapshotMoveKeyInfos.
               for (Table.KeyValue<String, OmKeyInfo> deletedDirEntry : 
deletedDirEntries) {
                 
deletedDirs.add(SnapshotMoveKeyInfos.newBuilder().setKey(deletedDirEntry.getKey())
-                    
.addKeyInfos(deletedDirEntry.getValue().getProtobuf(ClientVersion.CURRENT.serialize())).build());
+                    
.addKeyInfos(deletedDirEntry.getValue().getProtobuf(ClientVersion.CURRENT)).build());
               }
 
               // Convert renamedEntries to KeyValue.
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
index e9670614677..9b90eb81a5d 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/protocolPB/OzoneManagerRequestHandler.java
@@ -60,6 +60,7 @@
 import 
org.apache.hadoop.hdds.protocol.proto.HddsProtos.UpgradeFinalizationStatus;
 import org.apache.hadoop.hdds.scm.protocolPB.OzonePBHelper;
 import org.apache.hadoop.hdds.utils.FaultInjector;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.om.OzoneManager;
 import org.apache.hadoop.ozone.om.exceptions.OMException;
@@ -200,6 +201,7 @@ public OMResponse handleReadRequest(OMRequest request) {
     Type cmdType = request.getCmdType();
     OMResponse.Builder responseBuilder = OmResponseUtil.getOMResponseBuilder(
         request);
+    final ClientVersion clientVersion = 
ClientVersion.deserialize(request.getVersion());
     try {
       switch (cmdType) {
       case CheckVolumeAccess:
@@ -229,12 +231,12 @@ public OMResponse handleReadRequest(OMRequest request) {
         break;
       case LookupKey:
         LookupKeyResponse lookupKeyResponse = lookupKey(
-            request.getLookupKeyRequest(), request.getVersion());
+            request.getLookupKeyRequest(), clientVersion);
         responseBuilder.setLookupKeyResponse(lookupKeyResponse);
         break;
       case ListKeys:
         ListKeysResponse listKeysResponse = listKeys(
-            request.getListKeysRequest(), request.getVersion());
+            request.getListKeysRequest(), clientVersion);
         responseBuilder.setListKeysResponse(listKeysResponse);
         break;
       case ListKeysLight:
@@ -254,7 +256,7 @@ public OMResponse handleReadRequest(OMRequest request) {
         break;
       case ListOpenFiles:
         ListOpenFilesResponse listOpenFilesResponse = listOpenFiles(
-            request.getListOpenFilesRequest(), request.getVersion());
+            request.getListOpenFilesRequest(), clientVersion);
         responseBuilder.setListOpenFilesResponse(listOpenFilesResponse);
         break;
       case ServiceList:
@@ -274,23 +276,22 @@ public OMResponse handleReadRequest(OMRequest request) {
         break;
       case GetFileStatus:
         GetFileStatusResponse getFileStatusResponse = getOzoneFileStatus(
-            request.getGetFileStatusRequest(), request.getVersion());
+            request.getGetFileStatusRequest(), clientVersion);
         responseBuilder.setGetFileStatusResponse(getFileStatusResponse);
         break;
       case LookupFile:
         LookupFileResponse lookupFileResponse =
-            lookupFile(request.getLookupFileRequest(), request.getVersion());
+            lookupFile(request.getLookupFileRequest(), clientVersion);
         responseBuilder.setLookupFileResponse(lookupFileResponse);
         break;
       case ListStatus:
         ListStatusResponse listStatusResponse =
-            listStatus(request.getListStatusRequest(), request.getVersion());
+            listStatus(request.getListStatusRequest(), clientVersion);
         responseBuilder.setListStatusResponse(listStatusResponse);
         break;
       case ListStatusLight:
         ListStatusLightResponse listStatusLightResponse =
-            listStatusLight(request.getListStatusRequest(),
-                request.getVersion());
+            listStatusLight(request.getListStatusRequest());
         responseBuilder.setListStatusLightResponse(listStatusLightResponse);
         break;
       case GetAcl:
@@ -343,7 +344,7 @@ public OMResponse handleReadRequest(OMRequest request) {
         break;
       case GetKeyInfo:
         responseBuilder.setGetKeyInfoResponse(
-            getKeyInfo(request.getGetKeyInfoRequest(), request.getVersion()));
+            getKeyInfo(request.getGetKeyInfoRequest(), clientVersion));
         break;
       case ListSnapshot:
         OzoneManagerProtocolProtos.ListSnapshotResponse listSnapshotResponse =
@@ -649,7 +650,7 @@ private InfoBucketResponse infoBucket(InfoBucketRequest 
request)
   }
 
   private LookupKeyResponse lookupKey(LookupKeyRequest request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     LookupKeyResponse.Builder resp =
         LookupKeyResponse.newBuilder();
     KeyArgs keyArgs = request.getKeyArgs();
@@ -669,7 +670,7 @@ private LookupKeyResponse lookupKey(LookupKeyRequest 
request,
   }
 
   private GetKeyInfoResponse getKeyInfo(GetKeyInfoRequest request,
-                                        int clientVersion) throws IOException {
+                                        ClientVersion clientVersion) throws 
IOException {
     KeyArgs keyArgs = request.getKeyArgs();
     OmKeyArgs omKeyArgs = new OmKeyArgs.Builder()
         .setVolumeName(keyArgs.getVolumeName())
@@ -766,7 +767,7 @@ private ListBucketsResponse listBuckets(ListBucketsRequest 
request)
     return resp.build();
   }
 
-  private ListKeysResponse listKeys(ListKeysRequest request, int clientVersion)
+  private ListKeysResponse listKeys(ListKeysRequest request, ClientVersion 
clientVersion)
       throws IOException {
     ListKeysResponse.Builder resp =
         ListKeysResponse.newBuilder();
@@ -947,7 +948,7 @@ public static OMResponse disallowListTrashWithBucketLayout(
 
   @DisallowedUntilLayoutVersion(HBASE_SUPPORT)
   private ListOpenFilesResponse listOpenFiles(ListOpenFilesRequest req,
-                                              int clientVersion)
+                                              ClientVersion clientVersion)
       throws IOException {
     ListOpenFilesResponse.Builder resp = ListOpenFilesResponse.newBuilder();
 
@@ -1086,7 +1087,7 @@ private ListMultipartUploadsResponse listMultipartUploads(
   }
 
   private GetFileStatusResponse getOzoneFileStatus(
-      GetFileStatusRequest request, int clientVersion) throws IOException {
+      GetFileStatusRequest request, ClientVersion clientVersion) throws 
IOException {
     KeyArgs keyArgs = request.getKeyArgs();
     OmKeyArgs omKeyArgs = new OmKeyArgs.Builder()
         .setVolumeName(keyArgs.getVolumeName())
@@ -1191,7 +1192,7 @@ public static OMResponse 
disallowGetFileStatusWithBucketLayout(
   }
 
   private LookupFileResponse lookupFile(LookupFileRequest request,
-      int clientVersion) throws IOException {
+      ClientVersion clientVersion) throws IOException {
     KeyArgs keyArgs = request.getKeyArgs();
     OmKeyArgs omKeyArgs = new OmKeyArgs.Builder()
         .setVolumeName(keyArgs.getVolumeName())
@@ -1265,7 +1266,7 @@ public static OMResponse 
disallowLookupFileWithBucketLayout(
   }
 
   private ListStatusResponse listStatus(
-      ListStatusRequest request, int clientVersion) throws IOException {
+      ListStatusRequest request, ClientVersion clientVersion) throws 
IOException {
     KeyArgs keyArgs = request.getKeyArgs();
     OmKeyArgs omKeyArgs = new OmKeyArgs.Builder()
         .setVolumeName(keyArgs.getVolumeName())
@@ -1289,8 +1290,7 @@ private ListStatusResponse listStatus(
     return listStatusResponseBuilder.build();
   }
 
-  private ListStatusLightResponse listStatusLight(
-      ListStatusRequest request, int clientVersion) throws IOException {
+  private ListStatusLightResponse listStatusLight(ListStatusRequest request) 
throws IOException {
     KeyArgs keyArgs = request.getKeyArgs();
     OmKeyArgs omKeyArgs = new OmKeyArgs.Builder()
         .setVolumeName(keyArgs.getVolumeName())
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
index 16f42cb9179..e8715d63f61 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/OMRequestTestUtils.java
@@ -1381,7 +1381,7 @@ public static OMRequest moveSnapshotTableKeyRequest(UUID 
snapshotId,
               .setKey(deletedKey.getKey())
               .addAllKeyInfos(
                   deletedKey.getValue().stream()
-                      .map(omKeyInfo -> 
omKeyInfo.getProtobuf(ClientVersion.CURRENT.serialize()))
+                      .map(omKeyInfo -> 
omKeyInfo.getProtobuf(ClientVersion.CURRENT))
                       .collect(Collectors.toList()))
               .build();
       deletedMoveKeys.add(snapshotMoveKeyInfos);
@@ -1394,7 +1394,7 @@ public static OMRequest moveSnapshotTableKeyRequest(UUID 
snapshotId,
               .setKey(deletedKey.getKey())
               .addAllKeyInfos(
                   deletedKey.getValue().stream()
-                      .map(omKeyInfo -> 
omKeyInfo.getProtobuf(ClientVersion.CURRENT.serialize()))
+                      .map(omKeyInfo -> 
omKeyInfo.getProtobuf(ClientVersion.CURRENT))
                       .collect(Collectors.toList()))
               .build();
       deletedDirMoveKeys.add(snapshotMoveKeyInfos);
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
index 7ded4c7f360..7755f9f9d40 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/file/TestOMRecoverLeaseRequest.java
@@ -377,7 +377,7 @@ private KeyArgs getNewKeyArgs(OmKeyInfo omKeyInfo, long 
deltaLength) throws IOEx
         .setDataSize(keyArgs.getDataSize())
         .addAllMetadata(KeyValueUtil.toProtobuf(keyArgs.getMetadata()))
         .addAllKeyLocations(locationInfoList.stream()
-            .map(info -> info.getProtobuf(ClientVersion.CURRENT.serialize()))
+            .map(info -> info.getProtobuf(ClientVersion.CURRENT))
             .collect(Collectors.toList()));
     setReplicationConfig(keyArgs.getReplicationConfig(), keyArgsBuilder);
     return keyArgsBuilder.build();
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java
index 2b0889ec579..aea9e41e025 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/request/key/TestOMDirectoriesPurgeRequestAndResponse.java
@@ -207,14 +207,14 @@ private PurgePathRequest wrapPurgeRequest(
 
     for (OmKeyInfo purgeFile : purgeDeletedFiles) {
       purgePathsRequest.addDeletedSubFiles(
-          purgeFile.getProtobuf(true, ClientVersion.CURRENT.serialize()));
+          purgeFile.getProtobuf(true, ClientVersion.CURRENT));
     }
 
     // Add these directories to deletedDirTable, so that its sub-paths will be
     // traversed in next iteration to ensure cleanup all sub-children.
     for (OmKeyInfo dir : markDirsAsDeleted) {
       purgePathsRequest.addMarkDeletedSubDirs(
-          dir.getProtobuf(ClientVersion.CURRENT.serialize()));
+          dir.getProtobuf(ClientVersion.CURRENT));
     }
 
     return purgePathsRequest.build();
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java
index 1df73f25861..031fbdd2b10 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/response/snapshot/TestOMSnapshotMoveTableKeysResponse.java
@@ -147,13 +147,13 @@ public void testMoveTableKeysToNextSnapshot(boolean 
nextSnapshotExists) throws E
           .forEachRemaining(entry -> {
             
deletedTable.add(OzoneManagerProtocolProtos.SnapshotMoveKeyInfos.newBuilder().setKey(entry.getKey())
                 
.addAllKeyInfos(entry.getValue().getOmKeyInfoList().stream().map(omKeyInfo -> 
omKeyInfo.getProtobuf(
-                    
ClientVersion.CURRENT.serialize())).collect(Collectors.toList())).build());
+                    
ClientVersion.CURRENT)).collect(Collectors.toList())).build());
           });
 
       snapshot.getMetadataManager().getDeletedDirTable().iterator()
           .forEachRemaining(entry -> {
             
deletedDirTable.add(OzoneManagerProtocolProtos.SnapshotMoveKeyInfos.newBuilder().setKey(entry.getKey())
-                
.addKeyInfos(entry.getValue().getProtobuf(ClientVersion.CURRENT.serialize())).build());
+                
.addKeyInfos(entry.getValue().getProtobuf(ClientVersion.CURRENT)).build());
           });
       
snapshot.getMetadataManager().getSnapshotRenamedTable().iterator().forEachRemaining(entry
 -> {
         
renamedTable.add(HddsProtos.KeyValue.newBuilder().setKey(entry.getKey()).setValue(entry.getValue()).build());
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java
index a6af3c0a70a..7a61087c8ac 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestSnapshotDeletingService.java
@@ -336,7 +336,7 @@ private List<SnapshotMoveKeyInfos> 
createLargeDeletedKeys(int count) {
       SnapshotMoveKeyInfos moveKeyInfo = SnapshotMoveKeyInfos.newBuilder()
           .setKey(largeKeyName)
           .addAllKeyInfos(keyInfos.stream()
-              .map(k -> k.getProtobuf(ClientVersion.CURRENT.serialize()))
+              .map(k -> k.getProtobuf(ClientVersion.CURRENT))
               .collect(Collectors.toList()))
           .build();
       deletedKeys.add(moveKeyInfo);
@@ -371,7 +371,7 @@ private List<SnapshotMoveKeyInfos> 
createLargeDeletedDirs(int count) {
       
       SnapshotMoveKeyInfos moveDirInfo = SnapshotMoveKeyInfos.newBuilder()
           .setKey(largeDirName)
-          .addKeyInfos(dirInfo.getProtobuf(ClientVersion.CURRENT.serialize()))
+          .addKeyInfos(dirInfo.getProtobuf(ClientVersion.CURRENT))
           .build();
       deletedDirs.add(moveDirInfo);
     }
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
index 0601713b795..9531942e9c1 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/protocolPB/TestOzoneManagerRequestHandler.java
@@ -33,6 +33,7 @@
 import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.metrics2.lib.MutableRate;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.audit.AuditLogger;
 import org.apache.hadoop.ozone.audit.AuditMessage;
 import org.apache.hadoop.ozone.om.OMPerformanceMetrics;
@@ -77,8 +78,8 @@ private OmKeyInfo getMockedOmKeyInfo() {
         
OzoneManagerProtocolProtos.KeyInfo.newBuilder().setBucketName("bucket").setKeyName("key").setVolumeName(
                 
"volume").setDataSize(0).setType(HddsProtos.ReplicationType.RATIS).setCreationTime(0)
             .setModificationTime(0).build();
-    Mockito.when(keyInfo.getProtobuf(Mockito.anyBoolean(), 
Mockito.anyInt())).thenReturn(info);
-    Mockito.when(keyInfo.getProtobuf(Mockito.anyInt())).thenReturn(info);
+    Mockito.when(keyInfo.getProtobuf(Mockito.anyBoolean(), 
any(ClientVersion.class))).thenReturn(info);
+    
Mockito.when(keyInfo.getProtobuf(any(ClientVersion.class))).thenReturn(info);
     return keyInfo;
   }
 
@@ -176,7 +177,7 @@ public void getFileStatusForwardsHeadOpAndStripsLocations() 
throws IOException {
                           .setVersion(0).build())
                   .build())
               .build();
-      Mockito.when(status.getProtobuf(Mockito.anyInt())).thenReturn(proto);
+      
Mockito.when(status.getProtobuf(any(ClientVersion.class))).thenReturn(proto);
       ArgumentCaptor<OmKeyArgs> captor = 
ArgumentCaptor.forClass(OmKeyArgs.class);
       
Mockito.when(ozoneManager.getFileStatus(captor.capture())).thenReturn(status);
 
@@ -212,7 +213,7 @@ public void getFileStatusHeadOpWithoutKeyInfoIsNoop() 
throws IOException {
     OzoneManager ozoneManager = requestHandler.getOzoneManager();
 
     OzoneFileStatus status = Mockito.mock(OzoneFileStatus.class);
-    Mockito.when(status.getProtobuf(Mockito.anyInt())).thenReturn(
+    Mockito.when(status.getProtobuf(any(ClientVersion.class))).thenReturn(
         OzoneManagerProtocolProtos.OzoneFileStatusProto.newBuilder()
             .setIsDirectory(true).build());
     Mockito.when(ozoneManager.getFileStatus(Mockito.any())).thenReturn(status);
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java
index 201e0541ad9..35397723d25 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/api/NodeEndpoint.java
@@ -357,7 +357,7 @@ private Response getDecommissionStatusResponse(String uuid, 
String ipAddress) th
     Response.ResponseBuilder builder = Response.status(Response.Status.OK);
     Map<String, Object> responseMap = new HashMap<>();
     Stream<HddsProtos.Node> allNodes = scmClient.queryNode(DECOMMISSIONING,
-        null, HddsProtos.QueryScope.CLUSTER, "", 
ClientVersion.CURRENT.serialize()).stream();
+        null, HddsProtos.QueryScope.CLUSTER, "", 
ClientVersion.CURRENT).stream();
     List<HddsProtos.Node> decommissioningNodes =
         DecommissionUtils.getDecommissioningNodesList(allNodes, uuid, 
ipAddress);
     String metricsJson = 
scmClient.getMetrics("Hadoop:service=StorageContainerManager,name=NodeDecommissionMetrics");
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconPipelineManager.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconPipelineManager.java
index 58df5a67530..92c84a7bd9b 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconPipelineManager.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/scm/ReconPipelineManager.java
@@ -166,7 +166,7 @@ public boolean addPipeline(Pipeline pipeline) throws 
IOException {
       if (containsPipeline(pipeline.getId())) {
         return false;
       }
-      
getStateManager().addPipeline(pipeline.getProtobufMessage(ClientVersion.CURRENT.serialize()));
+      
getStateManager().addPipeline(pipeline.getProtobufMessage(ClientVersion.CURRENT));
       return true;
     } finally {
       releaseWriteLock();
diff --git 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
index 41ea241b3d8..82ab1cb227e 100644
--- 
a/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
+++ 
b/hadoop-ozone/recon/src/main/java/org/apache/hadoop/ozone/recon/spi/impl/StorageContainerServiceProviderImpl.java
@@ -114,7 +114,7 @@ public List<ContainerWithPipeline> 
getExistContainerWithPipelinesInBatch(
   @Override
   public List<HddsProtos.Node> getNodes() throws IOException {
     return scmClient.queryNode(null, null, HddsProtos.QueryScope.CLUSTER,
-        "", ClientVersion.CURRENT.serialize());
+        "", ClientVersion.CURRENT);
   }
 
   @Override
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 d4e73ca32b3..cb11d56d394 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
@@ -100,6 +100,7 @@
 import org.apache.hadoop.hdds.utils.db.Table;
 import org.apache.hadoop.hdds.utils.db.TypedTable;
 import org.apache.hadoop.hdfs.web.URLConnectionFactory;
+import org.apache.hadoop.ozone.ClientVersion;
 import org.apache.hadoop.ozone.OzoneAcl;
 import org.apache.hadoop.ozone.OzoneConsts;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
@@ -1359,7 +1360,7 @@ public void testExplicitRemovalOfNonExistingNode() {
 
   @Test
   public void testSuccessWhenDecommissionStatus() throws IOException {
-    when(mockScmClient.queryNode(any(), any(), any(), any(), 
any(Integer.class))).thenReturn(
+    when(mockScmClient.queryNode(any(), any(), any(), any(), 
any(ClientVersion.class))).thenReturn(
         nodes); // 2 nodes decommissioning
     
when(mockScmClient.getContainersOnDecomNode(any())).thenReturn(containerOnDecom);
     when(mockScmClient.getMetrics(any())).thenReturn(metrics.get(1));
@@ -1385,7 +1386,7 @@ public void testSuccessWhenDecommissionStatus() throws 
IOException {
 
   @Test
   public void testSuccessWhenDecommissionStatusWithUUID() throws IOException {
-    when(mockScmClient.queryNode(any(), any(), any(), any(), 
any(Integer.class))).thenReturn(
+    when(mockScmClient.queryNode(any(), any(), any(), any(), 
any(ClientVersion.class))).thenReturn(
         getNodeDetailsForUuid("654c4b89-04ef-4015-8a3b-50d0fb0e1684")); // 1 
nodes decommissioning
     
when(mockScmClient.getContainersOnDecomNode(any())).thenReturn(containerOnDecom);
     Response datanodesDecommissionInfo =


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

Reply via email to