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

This commit is contained in:
Kihwal Lee 2016-08-15 13:01:23 -05:00
parent 9f29f423e4
commit 83e57e083f
2 changed files with 47 additions and 1 deletions

View File

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

View File

@ -647,6 +647,48 @@ 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(0, 0);
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();
}
}
@Test @Test
public void testSaveNamespaceBeforeShutdown() throws Exception { public void testSaveNamespaceBeforeShutdown() throws Exception {
Configuration conf = new HdfsConfiguration(); Configuration conf = new HdfsConfiguration();