HDFS-9696. Garbage snapshot records linger forever. Contributed by Kihwal Lee
This commit is contained in:
parent
9f29f423e4
commit
83e57e083f
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue