ChenFolin created HDFS-4423: ------------------------------- Summary: Checkpoint exception causes fatal damage to fsimage. Key: HDFS-4423 URL: https://issues.apache.org/jira/browse/HDFS-4423 Project: Hadoop HDFS Issue Type: Bug Components: namenode Affects Versions: 1.1.1, 1.0.4 Environment: CentOS 6.2 Reporter: ChenFolin Priority: Blocker
The impact of class is org.apache.hadoop.hdfs.server.namenode.FSImage.java {code} boolean loadFSImage(MetaRecoveryContext recovery) throws IOException { ... latestNameSD.read(); needToSave |= loadFSImage(getImageFile(latestNameSD, NameNodeFile.IMAGE)); LOG.info("Image file of size " + imageSize + " loaded in " + (FSNamesystem.now() - startTime)/1000 + " seconds."); // Load latest edits if (latestNameCheckpointTime > latestEditsCheckpointTime) // the image is already current, discard edits needToSave |= true; else // latestNameCheckpointTime == latestEditsCheckpointTime needToSave |= (loadFSEdits(latestEditsSD, recovery) > 0); return needToSave; } {code} If it is the normal flow of the checkpoint,the value of latestNameCheckpointTime is equal to the value of latestEditsCheckpointTime,and it will exec “else”. The problem is that,latestNameCheckpointTime > latestEditsCheckpointTime: SecondNameNode starts checkpoint, ... NameNode:rollFSImage,NameNode shutdown after write latestNameCheckpointTime and before write latestEditsCheckpointTime. Start NameNode:because latestNameCheckpointTime > latestEditsCheckpointTime,so the value of needToSave is true, and it will not update “rootDir”'s nsCount that is the cluster's file number(update exec at loadFSEdits “FSNamesystem.getFSNamesystem().dir.updateCountForINodeWithQuota()”),and then “saveNamespace” will write file number to fsimage whit default value “1”。 The next time,loadFSImage will fail. Maybe,it will work: {code} boolean loadFSImage(MetaRecoveryContext recovery) throws IOException { ... latestNameSD.read(); needToSave |= loadFSImage(getImageFile(latestNameSD, NameNodeFile.IMAGE)); LOG.info("Image file of size " + imageSize + " loaded in " + (FSNamesystem.now() - startTime)/1000 + " seconds."); // Load latest edits if (latestNameCheckpointTime > latestEditsCheckpointTime){ // the image is already current, discard edits needToSave |= true; FSNamesystem.getFSNamesystem().dir.updateCountForINodeWithQuota(); } else // latestNameCheckpointTime == latestEditsCheckpointTime needToSave |= (loadFSEdits(latestEditsSD, recovery) > 0); return needToSave; } {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira