Author: kihwal Date: Thu Nov 14 15:47:16 2013 New Revision: 1541939 URL: http://svn.apache.org/r1541939 Log: HDFS-3970. Fix bug causing rollback of HDFS upgrade to result in bad VERSION file. Contributed by Vinay and Andrew Wang.
Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceStorage.java hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSRollback.java Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt?rev=1541939&r1=1541938&r2=1541939&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt (original) +++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/CHANGES.txt Thu Nov 14 15:47:16 2013 @@ -53,6 +53,9 @@ Release 0.23.10 - UNRELEASED HDFS-5357. TestFileSystemAccessService failures in JDK7 (Robert Parker via jeagles) + HDFS-3970. Fix bug causing rollback of HDFS upgrade to result in bad + VERSION file. (Vinay and Andrew Wang via atm) + Release 0.23.9 - 2013-07-08 INCOMPATIBLE CHANGES Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceStorage.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceStorage.java?rev=1541939&r1=1541938&r2=1541939&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceStorage.java (original) +++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/BlockPoolSliceStorage.java Thu Nov 14 15:47:16 2013 @@ -78,6 +78,10 @@ public class BlockPoolSliceStorage exten this.clusterID = clusterId; } + private BlockPoolSliceStorage() { + super(NodeType.DATA_NODE); + } + /** * Analyze storage directories. Recover from previous transitions if required. * @@ -382,7 +386,7 @@ public class BlockPoolSliceStorage exten if (!prevDir.exists()) return; // read attributes out of the VERSION file of previous directory - DataStorage prevInfo = new DataStorage(); + BlockPoolSliceStorage prevInfo = new BlockPoolSliceStorage(); prevInfo.readPreviousVersionProperties(bpSd); // We allow rollback to a state, which is either consistent with Modified: hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSRollback.java URL: http://svn.apache.org/viewvc/hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSRollback.java?rev=1541939&r1=1541938&r2=1541939&view=diff ============================================================================== --- hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSRollback.java (original) +++ hadoop/common/branches/branch-0.23/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/TestDFSRollback.java Thu Nov 14 15:47:16 2013 @@ -25,11 +25,13 @@ import java.io.IOException; import java.util.Collections; import java.util.List; +import static org.junit.Assert.*; import junit.framework.TestCase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.fs.Path; import org.apache.hadoop.hdfs.server.common.StorageInfo; import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.NodeType; import org.apache.hadoop.hdfs.server.common.HdfsServerConstants.StartupOption; @@ -172,6 +174,44 @@ public class TestDFSRollback extends Tes cluster.shutdown(); UpgradeUtilities.createEmptyDirs(nameNodeDirs); UpgradeUtilities.createEmptyDirs(dataNodeDirs); + + log("Normal BlockPool rollback", numDirs); + UpgradeUtilities.createNameNodeStorageDirs(nameNodeDirs, "current"); + UpgradeUtilities.createNameNodeStorageDirs(nameNodeDirs, "previous"); + cluster = new MiniDFSCluster.Builder(conf).numDataNodes(0) + .format(false) + .manageDataDfsDirs(false) + .manageNameDfsDirs(false) + .startupOption(StartupOption.ROLLBACK) + .build(); + UpgradeUtilities.createDataNodeStorageDirs(dataNodeDirs, "current"); + UpgradeUtilities.createBlockPoolStorageDirs(dataNodeDirs, "current", + UpgradeUtilities.getCurrentBlockPoolID(cluster)); + // Create a previous snapshot for the blockpool + UpgradeUtilities.createBlockPoolStorageDirs(dataNodeDirs, "previous", + UpgradeUtilities.getCurrentBlockPoolID(cluster)); + // Older LayoutVersion to make it rollback + storageInfo = new StorageInfo( + UpgradeUtilities.getCurrentLayoutVersion()+1, + UpgradeUtilities.getCurrentNamespaceID(cluster), + UpgradeUtilities.getCurrentClusterID(cluster), + UpgradeUtilities.getCurrentFsscTime(cluster)); + // Create old VERSION file for each data dir + for (int i=0; i<dataNodeDirs.length; i++) { + Path bpPrevPath = new Path(dataNodeDirs[i] + "/current/" + + UpgradeUtilities.getCurrentBlockPoolID(cluster)); + UpgradeUtilities.createBlockPoolVersionFile( + new File(bpPrevPath.toString()), + storageInfo, + UpgradeUtilities.getCurrentBlockPoolID(cluster)); + } + + cluster.startDataNodes(conf, 1, false, StartupOption.ROLLBACK, null); + assertTrue(cluster.isDataNodeUp()); + + cluster.shutdown(); + UpgradeUtilities.createEmptyDirs(nameNodeDirs); + UpgradeUtilities.createEmptyDirs(dataNodeDirs); log("NameNode rollback without existing previous dir", numDirs); UpgradeUtilities.createNameNodeStorageDirs(nameNodeDirs, "current");