HDFS-9696. Garbage snapshot records linger forever. Contributed by Kihwal Lee
(cherry picked from commit83e57e083f
) Conflicts: hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/server/namenode/TestSaveNamespace.java (cherry picked from commit4766a3153d
)
This commit is contained in:
parent
ca139a3f87
commit
579709fc22
|
@ -455,7 +455,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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue