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

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


The following commit(s) were added to refs/heads/master by this push:
     new 5adbef2135 HDDS-6127. file checksum to support both CRC32 and CRC32C. 
(#3570)
5adbef2135 is described below

commit 5adbef2135e3f14abfbb7816e2107b51d557a55e
Author: Wei-Chiu Chuang <[email protected]>
AuthorDate: Fri Aug 12 17:09:56 2022 +0800

    HDDS-6127. file checksum to support both CRC32 and CRC32C. (#3570)
---
 .../client/checksum/BaseFileChecksumHelper.java    | 40 +++++++++++++++++++---
 .../checksum/ReplicatedFileChecksumHelper.java     |  4 ++-
 .../checksum/TestReplicatedFileChecksumHelper.java | 11 +++++-
 3 files changed, 49 insertions(+), 6 deletions(-)

diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/BaseFileChecksumHelper.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/BaseFileChecksumHelper.java
index 792a9e3616..93d5f71422 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/BaseFileChecksumHelper.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/BaseFileChecksumHelper.java
@@ -19,9 +19,11 @@ package org.apache.hadoop.ozone.client.checksum;
 
 import org.apache.hadoop.fs.CompositeCrcFileChecksum;
 import org.apache.hadoop.fs.FileChecksum;
+import org.apache.hadoop.fs.MD5MD5CRC32CastagnoliFileChecksum;
 import org.apache.hadoop.fs.MD5MD5CRC32GzipFileChecksum;
 import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
 import org.apache.hadoop.hdds.scm.OzoneClientConfig;
+import org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos;
 import org.apache.hadoop.hdds.scm.XceiverClientFactory;
 import org.apache.hadoop.io.DataOutputBuffer;
 import org.apache.hadoop.io.MD5Hash;
@@ -57,6 +59,7 @@ public abstract class BaseFileChecksumHelper {
 
   private ClientProtocol rpcClient;
   private OzoneClientConfig.ChecksumCombineMode combineMode;
+  private ContainerProtos.ChecksumType checksumType;
 
   private final DataOutputBuffer blockChecksumBuf = new DataOutputBuffer();
   private XceiverClientFactory xceiverClientFactory;
@@ -111,6 +114,10 @@ public abstract class BaseFileChecksumHelper {
     return combineMode;
   }
 
+  protected ContainerProtos.ChecksumType getChecksumType() {
+    return checksumType;
+  }
+
   protected XceiverClientFactory getXceiverClientFactory() {
     return xceiverClientFactory;
   }
@@ -139,6 +146,10 @@ public abstract class BaseFileChecksumHelper {
     this.bytesPerCRC = bytesPerCRC;
   }
 
+  protected void setChecksumType(ContainerProtos.ChecksumType type) {
+    checksumType = type;
+  }
+
   /**
    * Request the blocks created in the most recent version from Ozone Manager.
    *
@@ -242,8 +253,29 @@ public abstract class BaseFileChecksumHelper {
     //compute file MD5
     final MD5Hash fileMD5 = MD5Hash.digest(getBlockChecksumBuf().getData());
     // assume CRC32 for now
-    return new MD5MD5CRC32GzipFileChecksum(getBytesPerCRC(),
-        crcPerBlock, fileMD5);
+    switch (getChecksumType()) {
+    case CRC32:
+      return new MD5MD5CRC32GzipFileChecksum(getBytesPerCRC(),
+          crcPerBlock, fileMD5);
+    case CRC32C:
+      return new MD5MD5CRC32CastagnoliFileChecksum(getBytesPerCRC(),
+          crcPerBlock, fileMD5);
+    default:
+      throw new IllegalArgumentException("unexpected checksum type "
+          + getChecksumType());
+    }
+
+  }
+
+  DataChecksum.Type toHadoopChecksumType() {
+    switch (checksumType) {
+    case CRC32:
+      return DataChecksum.Type.CRC32;
+    case CRC32C:
+      return DataChecksum.Type.CRC32C;
+    default:
+      throw new IllegalArgumentException("unsupported checksum type");
+    }
   }
 
   FileChecksum makeCompositeCrcResult() throws IOException {
@@ -252,7 +284,7 @@ public abstract class BaseFileChecksumHelper {
       blockSizeHint = keyLocationInfos.get(0).getLength();
     }
     CrcComposer crcComposer =
-        CrcComposer.newCrcComposer(DataChecksum.Type.CRC32, blockSizeHint);
+        CrcComposer.newCrcComposer(toHadoopChecksumType(), blockSizeHint);
     byte[] blockChecksumBytes = blockChecksumBuf.getData();
 
     for (int i = 0; i < keyLocationInfos.size(); ++i) {
@@ -270,7 +302,7 @@ public abstract class BaseFileChecksumHelper {
 
     int compositeCrc = CrcUtil.readInt(crcComposer.digest(), 0);
     return new CompositeCrcFileChecksum(
-        compositeCrc, DataChecksum.Type.CRC32, bytesPerCRC);
+        compositeCrc, toHadoopChecksumType(), bytesPerCRC);
   }
 
   public FileChecksum getFileChecksum() {
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/ReplicatedFileChecksumHelper.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/ReplicatedFileChecksumHelper.java
index 84a44515f0..7c45062b4c 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/ReplicatedFileChecksumHelper.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/checksum/ReplicatedFileChecksumHelper.java
@@ -71,7 +71,6 @@ public class ReplicatedFileChecksumHelper extends 
BaseFileChecksumHelper {
          blockIdx++) {
       OmKeyLocationInfo keyLocationInfo =
           getKeyLocationInfoList().get(blockIdx);
-      currentLength += keyLocationInfo.getLength();
       if (currentLength > getLength()) {
         return;
       }
@@ -81,6 +80,8 @@ public class ReplicatedFileChecksumHelper extends 
BaseFileChecksumHelper {
             "Fail to get block checksum for " + keyLocationInfo
                 + ", checksum combine mode : {}" + getCombineMode());
       }
+
+      currentLength += keyLocationInfo.getLength();
     }
   }
 
@@ -106,6 +107,7 @@ public class ReplicatedFileChecksumHelper extends 
BaseFileChecksumHelper {
 
     ContainerProtos.ChecksumData checksumData =
         chunkInfos.get(0).getChecksumData();
+    setChecksumType(checksumData.getType());
     int bytesPerChecksum = checksumData.getBytesPerChecksum();
     setBytesPerCRC(bytesPerChecksum);
 
diff --git 
a/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/checksum/TestReplicatedFileChecksumHelper.java
 
b/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/checksum/TestReplicatedFileChecksumHelper.java
index 589936bc42..3954bb9ba6 100644
--- 
a/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/checksum/TestReplicatedFileChecksumHelper.java
+++ 
b/hadoop-ozone/client/src/test/java/org/apache/hadoop/ozone/client/checksum/TestReplicatedFileChecksumHelper.java
@@ -18,6 +18,7 @@
 package org.apache.hadoop.ozone.client.checksum;
 
 import org.apache.hadoop.fs.FileChecksum;
+import org.apache.hadoop.fs.MD5MD5CRC32FileChecksum;
 import org.apache.hadoop.fs.MD5MD5CRC32GzipFileChecksum;
 import org.apache.hadoop.hdds.client.BlockID;
 import org.apache.hadoop.hdds.client.RatisReplicationConfig;
@@ -87,6 +88,11 @@ public class TestReplicatedFileChecksumHelper {
   @Before
   public void init() throws IOException {
     ConfigurationSource config = new InMemoryConfiguration();
+    OzoneClientConfig clientConfig = config.getObject(OzoneClientConfig.class);
+    clientConfig.setChecksumType(ContainerProtos.ChecksumType.CRC32C);
+
+    ((InMemoryConfiguration)config).setFromObject(clientConfig);
+
     rpcClient = new RpcClient(config, null) {
 
       @Override
@@ -104,6 +110,7 @@ public class TestReplicatedFileChecksumHelper {
         return new MockXceiverClientFactory();
       }
     };
+
     client = new OzoneClient(config, rpcClient);
 
     store = client.getObjectStore();
@@ -357,7 +364,9 @@ public class TestReplicatedFileChecksumHelper {
 
       helper.compute();
       FileChecksum fileChecksum = helper.getFileChecksum();
-      assertTrue(fileChecksum instanceof MD5MD5CRC32GzipFileChecksum);
+      //assertTrue(fileChecksum instanceof MD5MD5CRC32GzipFileChecksum);
+      assertEquals(DataChecksum.Type.CRC32C,
+          ((MD5MD5CRC32FileChecksum)fileChecksum).getCrcType());
       assertEquals(1, helper.getKeyLocationInfoList().size());
     }
   }


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

Reply via email to