From 262c1bc3398ce2ede03f9d86fc97c35ca7a8e9db Mon Sep 17 00:00:00 2001 From: Vinayakumar B Date: Fri, 24 Apr 2015 12:16:41 +0530 Subject: [PATCH] HDFS-8217. During block recovery for truncate Log new Block Id in case of copy-on-truncate is true. (Contributed by Vinayakumar B) --- hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt | 3 +++ .../apache/hadoop/hdfs/server/datanode/DataNode.java | 4 +++- .../hadoop/hdfs/server/namenode/FSNamesystem.java | 12 +++++++----- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt index b0a0a50fbb8..0e00025ce3b 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt +++ b/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt @@ -545,6 +545,9 @@ Release 2.8.0 - UNRELEASED HDFS-7993. Provide each Replica details in fsck (J.Andreina via vinayakumarb) + HDFS-8217. During block recovery for truncate Log new Block Id in case of + copy-on-truncate is true. (vinayakumarb) + Release 2.7.1 - UNRELEASED INCOMPATIBLE CHANGES diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java index e81da521ac6..23ab43a2908 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/DataNode.java @@ -2840,7 +2840,9 @@ public class DataNode extends ReconfigurableBase LOG.info(who + " calls recoverBlock(" + block + ", targets=[" + Joiner.on(", ").join(targets) + "]" - + ", newGenerationStamp=" + rb.getNewGenerationStamp() + ")"); + + ((rb.getNewBlock() == null) ? ", newGenerationStamp=" + + rb.getNewGenerationStamp() : ", newBlock=" + rb.getNewBlock()) + + ")"); } @Override // ClientDataNodeProtocol diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java index 3599fadd6bb..4477dc46235 100644 --- a/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java +++ b/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/namenode/FSNamesystem.java @@ -4229,6 +4229,8 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, String src = ""; waitForLoadingFSImage(); writeLock(); + boolean copyTruncate = false; + BlockInfoContiguousUnderConstruction truncatedBlock = null; try { checkOperation(OperationCategory.WRITE); // If a DN tries to commit to the standby, the recovery will @@ -4285,11 +4287,10 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, return; } - BlockInfoContiguousUnderConstruction truncatedBlock = - (BlockInfoContiguousUnderConstruction) iFile.getLastBlock(); + truncatedBlock = (BlockInfoContiguousUnderConstruction) iFile + .getLastBlock(); long recoveryId = truncatedBlock.getBlockRecoveryId(); - boolean copyTruncate = - truncatedBlock.getBlockId() != storedBlock.getBlockId(); + copyTruncate = truncatedBlock.getBlockId() != storedBlock.getBlockId(); if(recoveryId != newgenerationstamp) { throw new IOException("The recovery id " + newgenerationstamp + " does not match current recovery id " @@ -4382,7 +4383,8 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean, if (closeFile) { LOG.info("commitBlockSynchronization(oldBlock=" + oldBlock + ", file=" + src - + ", newgenerationstamp=" + newgenerationstamp + + (copyTruncate ? ", newBlock=" + truncatedBlock + : ", newgenerationstamp=" + newgenerationstamp) + ", newlength=" + newlength + ", newtargets=" + Arrays.asList(newtargets) + ") successful"); } else {