|
@@ -1459,4 +1459,58 @@ public class TestBlockManager {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Test
|
|
|
|
+ public void testMetaSaveMissingReplicas() throws Exception {
|
|
|
|
+ List<DatanodeStorageInfo> origStorages = getStorages(0, 1);
|
|
|
|
+ List<DatanodeDescriptor> origNodes = getNodes(origStorages);
|
|
|
|
+ BlockInfo block = makeBlockReplicasMissing(0, origNodes);
|
|
|
|
+ File file = new File("test.log");
|
|
|
|
+ PrintWriter out = new PrintWriter(file);
|
|
|
|
+ bm.metaSave(out);
|
|
|
|
+ out.flush();
|
|
|
|
+ FileInputStream fstream = new FileInputStream(file);
|
|
|
|
+ DataInputStream in = new DataInputStream(fstream);
|
|
|
|
+ BufferedReader reader = new BufferedReader(new InputStreamReader(in));
|
|
|
|
+ StringBuffer buffer = new StringBuffer();
|
|
|
|
+ String line;
|
|
|
|
+ try {
|
|
|
|
+ while ((line = reader.readLine()) != null) {
|
|
|
|
+ buffer.append(line);
|
|
|
|
+ }
|
|
|
|
+ String output = buffer.toString();
|
|
|
|
+ assertTrue("Metasave output should have reported missing blocks.",
|
|
|
|
+ output.contains("Metasave: Blocks currently missing: 1"));
|
|
|
|
+ assertTrue("There should be 0 blocks waiting for reconstruction",
|
|
|
|
+ output.contains("Metasave: Blocks waiting for reconstruction: 0"));
|
|
|
|
+ String blockNameGS = block.getBlockName() + "_" +
|
|
|
|
+ block.getGenerationStamp();
|
|
|
|
+ assertTrue("Block " + blockNameGS + " should be MISSING.",
|
|
|
|
+ output.contains(blockNameGS + " MISSING"));
|
|
|
|
+ } finally {
|
|
|
|
+ reader.close();
|
|
|
|
+ file.delete();
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private BlockInfo makeBlockReplicasMissing(long blockId,
|
|
|
|
+ List<DatanodeDescriptor> nodesList) throws IOException {
|
|
|
|
+ long inodeId = ++mockINodeId;
|
|
|
|
+ final INodeFile bc = TestINodeFile.createINodeFile(inodeId);
|
|
|
|
+
|
|
|
|
+ BlockInfo blockInfo = blockOnNodes(blockId, nodesList);
|
|
|
|
+ blockInfo.setReplication((short) 3);
|
|
|
|
+ blockInfo.setBlockCollectionId(inodeId);
|
|
|
|
+
|
|
|
|
+ Mockito.doReturn(bc).when(fsn).getBlockCollection(inodeId);
|
|
|
|
+ bm.blocksMap.addBlockCollection(blockInfo, bc);
|
|
|
|
+ bm.markBlockReplicasAsCorrupt(blockInfo, blockInfo,
|
|
|
|
+ blockInfo.getGenerationStamp() + 1,
|
|
|
|
+ blockInfo.getNumBytes(),
|
|
|
|
+ new DatanodeStorageInfo[]{});
|
|
|
|
+ BlockCollection mockedBc = Mockito.mock(BlockCollection.class);
|
|
|
|
+ Mockito.when(mockedBc.getBlocks()).thenReturn(new BlockInfo[]{blockInfo});
|
|
|
|
+ bm.checkRedundancy(mockedBc);
|
|
|
|
+ return blockInfo;
|
|
|
|
+ }
|
|
|
|
+
|
|
}
|
|
}
|