HDFS-9696. Garbage snapshot records linger forever. Contributed by Kihwal Lee

(cherry picked from commit 83e57e083f)

Conflicts:
	hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestSaveNamespace.java

(cherry picked from commit 4766a3153d)
This commit is contained in:
Kihwal Lee 2016-08-15 13:13:49 -05:00
parent ca139a3f87
commit 579709fc22
2 changed files with 46 additions and 1 deletions

View File

@ -455,7 +455,11 @@ public final class FSImageFormatProtobuf {
this, summary, context, context.getSourceNamesystem()); this, summary, context, context.getSourceNamesystem());
snapshotSaver.serializeSnapshotSection(sectionOutputStream); snapshotSaver.serializeSnapshotSection(sectionOutputStream);
// Skip snapshot-related sections when there is no snapshot.
if (context.getSourceNamesystem().getSnapshotManager()
.getNumSnapshots() > 0) {
snapshotSaver.serializeSnapshotDiffSection(sectionOutputStream); snapshotSaver.serializeSnapshotDiffSection(sectionOutputStream);
}
snapshotSaver.serializeINodeReferenceSection(sectionOutputStream); snapshotSaver.serializeINodeReferenceSection(sectionOutputStream);
} }

View File

@ -625,6 +625,47 @@ public class TestSaveNamespace {
} }
} }
@Test
public void testSkipSnapshotSection() throws Exception {
MiniDFSCluster cluster = new MiniDFSCluster.Builder(new Configuration())
.numDataNodes(1).build();
cluster.waitActive();
DistributedFileSystem fs = cluster.getFileSystem();
OutputStream out = null;
try {
String path = "/skipSnapshot";
out = fs.create(new Path(path));
out.close();
// add a bogus filediff
FSDirectory dir = cluster.getNamesystem().getFSDirectory();
INodeFile file = dir.getINode(path).asFile();
file.addSnapshotFeature(null).getDiffs()
.saveSelf2Snapshot(-1, file, null, false);
// make sure it has a diff
assertTrue("Snapshot fileDiff is missing.",
file.getFileWithSnapshotFeature().getDiffs() != null);
// saveNamespace
fs.setSafeMode(SafeModeAction.SAFEMODE_ENTER);
cluster.getNameNodeRpc().saveNamespace();
fs.setSafeMode(SafeModeAction.SAFEMODE_LEAVE);
// restart namenode
cluster.restartNameNode(true);
dir = cluster.getNamesystem().getFSDirectory();
file = dir.getINode(path).asFile();
// there should be no snapshot feature for the inode, when there is
// no snapshot.
assertTrue("There should be no snapshot feature for this INode.",
file.getFileWithSnapshotFeature() == null);
} finally {
cluster.shutdown();
}
}
private void doAnEdit(FSNamesystem fsn, int id) throws IOException { private void doAnEdit(FSNamesystem fsn, int id) throws IOException {
// Make an edit // Make an edit
fsn.mkdirs( fsn.mkdirs(