Repository: hadoop
Updated Branches:
  refs/heads/trunk 4c66a8d19 -> cc1292e73


HDFS-9705. Refine the behaviour of getFileChecksum when length = 0. Contributed 
by Kai Zheng and SammiChen.


Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/cc1292e7
Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/cc1292e7
Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/cc1292e7

Branch: refs/heads/trunk
Commit: cc1292e73acd39c1f1023ad4841ffe30176f7daf
Parents: 4c66a8d
Author: Andrew Wang <w...@apache.org>
Authored: Tue Mar 14 16:41:10 2017 -0700
Committer: Andrew Wang <w...@apache.org>
Committed: Tue Mar 14 16:41:10 2017 -0700

----------------------------------------------------------------------
 .../java/org/apache/hadoop/hdfs/DFSClient.java  | 10 +++--
 .../apache/hadoop/hdfs/FileChecksumHelper.java  | 42 ++++++++++++--------
 .../server/datanode/BlockChecksumHelper.java    |  6 +--
 .../hadoop/hdfs/TestDistributedFileSystem.java  | 22 +++++-----
 4 files changed, 48 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hadoop/blob/cc1292e7/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
 
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
index ae1d821..aaf8bdd 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/DFSClient.java
@@ -1731,10 +1731,14 @@ public class DFSClient implements java.io.Closeable, 
RemotePeerFactory,
     checkOpen();
     Preconditions.checkArgument(length >= 0);
 
-    LocatedBlocks blockLocations = getBlockLocations(src, length);
+    LocatedBlocks blockLocations = null;
+    FileChecksumHelper.FileChecksumComputer maker = null;
+    ErasureCodingPolicy ecPolicy = null;
+    if (length > 0) {
+      blockLocations = getBlockLocations(src, length);
+      ecPolicy = blockLocations.getErasureCodingPolicy();
+    }
 
-    FileChecksumHelper.FileChecksumComputer maker;
-    ErasureCodingPolicy ecPolicy = blockLocations.getErasureCodingPolicy();
     maker = ecPolicy != null ?
         new FileChecksumHelper.StripedFileNonStripedChecksumComputer(src,
             length, blockLocations, namenode, this, ecPolicy) :

http://git-wip-us.apache.org/repos/asf/hadoop/blob/cc1292e7/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/FileChecksumHelper.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/FileChecksumHelper.java
 
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/FileChecksumHelper.java
index fe462f2..689d46d 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/FileChecksumHelper.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/FileChecksumHelper.java
@@ -95,11 +95,13 @@ final class FileChecksumHelper {
       this.client = client;
 
       this.remaining = length;
-      if (src.contains(HdfsConstants.SEPARATOR_DOT_SNAPSHOT_DIR_SEPARATOR)) {
-        this.remaining = Math.min(length, blockLocations.getFileLength());
-      }
 
-      this.locatedBlocks = blockLocations.getLocatedBlocks();
+      if (blockLocations != null) {
+        if (src.contains(HdfsConstants.SEPARATOR_DOT_SNAPSHOT_DIR_SEPARATOR)) {
+          this.remaining = Math.min(length, blockLocations.getFileLength());
+        }
+        this.locatedBlocks = blockLocations.getLocatedBlocks();
+      }
     }
 
     String getSrc() {
@@ -203,9 +205,23 @@ final class FileChecksumHelper {
      * @throws IOException
      */
     void compute() throws IOException {
-      checksumBlocks();
-
-      fileChecksum = makeFinalResult();
+      /**
+       * request length is 0 or the file is empty, return one with the
+       * magic entry that matches what previous hdfs versions return.
+       */
+      if (locatedBlocks == null || locatedBlocks.isEmpty()) {
+        // Explicitly specified here in case the default DataOutputBuffer
+        // buffer length value is changed in future. This matters because the
+        // fixed value 32 has to be used to repeat the magic value for previous
+        // HDFS version.
+        final int lenOfZeroBytes = 32;
+        byte[] emptyBlockMd5 = new byte[lenOfZeroBytes];
+        MD5Hash fileMD5 = MD5Hash.digest(emptyBlockMd5);
+        fileChecksum =  new MD5MD5CRC32GzipFileChecksum(0, 0, fileMD5);
+      } else {
+        checksumBlocks();
+        fileChecksum = makeFinalResult();
+      }
     }
 
     /**
@@ -228,15 +244,7 @@ final class FileChecksumHelper {
         return new MD5MD5CRC32CastagnoliFileChecksum(bytesPerCRC,
             crcPerBlock, fileMD5);
       default:
-        // If there is no block allocated for the file,
-        // return one with the magic entry that matches what previous
-        // hdfs versions return.
-        if (locatedBlocks.isEmpty()) {
-          return new MD5MD5CRC32GzipFileChecksum(0, 0, fileMD5);
-        }
-
-        // we should never get here since the validity was checked
-        // when getCrcType() was called above.
+        // we will get here when crcType is "NULL".
         return null;
       }
     }
@@ -412,7 +420,7 @@ final class FileChecksumHelper {
   }
 
   /**
-   * Striped file checksum computing.
+   * Non-striped checksum computing for striped files.
    */
   static class StripedFileNonStripedChecksumComputer
       extends FileChecksumComputer {

http://git-wip-us.apache.org/repos/asf/hadoop/blob/cc1292e7/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockChecksumHelper.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockChecksumHelper.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockChecksumHelper.java
index f549785..e99911b 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockChecksumHelper.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockChecksumHelper.java
@@ -66,7 +66,7 @@ final class BlockChecksumHelper {
   }
 
   /**
-   * The abstract base block checksum computer.
+   * The abstract block checksum computer.
    */
   static abstract class AbstractBlockChecksumComputer {
     private final DataNode datanode;
@@ -139,7 +139,7 @@ final class BlockChecksumHelper {
   }
 
   /**
-   * The abstract base block checksum computer.
+   * The abstract base block checksum computer, mainly for replicated blocks.
    */
   static abstract class BlockChecksumComputer
       extends AbstractBlockChecksumComputer {
@@ -534,4 +534,4 @@ final class BlockChecksumHelper {
       }
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/hadoop/blob/cc1292e7/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
----------------------------------------------------------------------
diff --git 
a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
 
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
index 69248d9..7654531 100644
--- 
a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
+++ 
b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDistributedFileSystem.java
@@ -1030,13 +1030,6 @@ public class TestDistributedFileSystem {
         out.close();
       }
 
-      // verify the magic val for zero byte files
-      {
-        final FileChecksum zeroChecksum = hdfs.getFileChecksum(zeroByteFile);
-        assertEquals(zeroChecksum.toString(),
-            "MD5-of-0MD5-of-0CRC32:70bc8f4b72a86921468bf8e8441dce51");
-      }
-
       //write another file
       final Path bar = new Path(dir, "bar" + n);
       {
@@ -1045,8 +1038,19 @@ public class TestDistributedFileSystem {
         out.write(data);
         out.close();
       }
-  
-      { //verify checksum
+
+      {
+        final FileChecksum zeroChecksum = hdfs.getFileChecksum(zeroByteFile);
+        final String magicValue =
+            "MD5-of-0MD5-of-0CRC32:70bc8f4b72a86921468bf8e8441dce51";
+        // verify the magic val for zero byte files
+        assertEquals(magicValue, zeroChecksum.toString());
+
+        //verify checksums for empty file and 0 request length
+        final FileChecksum checksumWith0 = hdfs.getFileChecksum(bar, 0);
+        assertEquals(zeroChecksum, checksumWith0);
+
+        //verify checksum
         final FileChecksum barcs = hdfs.getFileChecksum(bar);
         final int barhashcode = barcs.hashCode();
         assertEquals(hdfsfoocs.hashCode(), barhashcode);


---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org
For additional commands, e-mail: common-commits-h...@hadoop.apache.org

Reply via email to