Browse Source

HDFS-16180.FsVolumeImpl.nextBlock should consider that the block meta file has been deleted. (#3315)

Neil 3 years ago
parent
commit
9084c728eb

+ 3 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsDatasetUtil.java

@@ -21,6 +21,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
 import java.io.DataOutputStream;
 import java.io.File;
 import java.io.File;
 import java.io.FileDescriptor;
 import java.io.FileDescriptor;
+import java.io.FileNotFoundException;
 import java.io.FilenameFilter;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStream;
@@ -98,7 +99,8 @@ public class FsDatasetUtil {
     });
     });
 
 
     if (matches == null || matches.length == 0) {
     if (matches == null || matches.length == 0) {
-      throw new IOException("Meta file not found, blockFile=" + blockFile);
+      throw new FileNotFoundException(
+          "Meta file not found, blockFile=" + blockFile);
     }
     }
     if (matches.length > 1) {
     if (matches.length > 1) {
       throw new IOException("Found more than one meta files: " 
       throw new IOException("Found more than one meta files: " 

+ 10 - 1
hadoop-hdfs-project/hadoop-hdfs/src/main/java/org/apache/hadoop/hdfs/server/datanode/fsdataset/impl/FsVolumeImpl.java

@@ -20,6 +20,7 @@ package org.apache.hadoop.hdfs.server.datanode.fsdataset.impl;
 import java.io.BufferedWriter;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FilenameFilter;
 import java.io.FilenameFilter;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.OutputStreamWriter;
@@ -865,7 +866,15 @@ public class FsVolumeImpl implements FsVolumeSpi {
               }
               }
 
 
               File blkFile = getBlockFile(bpid, block);
               File blkFile = getBlockFile(bpid, block);
-              File metaFile = FsDatasetUtil.findMetaFile(blkFile);
+              File metaFile ;
+              try {
+                 metaFile = FsDatasetUtil.findMetaFile(blkFile);
+              } catch (FileNotFoundException e){
+                LOG.warn("nextBlock({}, {}): {}", storageID, bpid,
+                    e.getMessage());
+                continue;
+              }
+
               block.setGenerationStamp(
               block.setGenerationStamp(
                   Block.getGenerationStamp(metaFile.getName()));
                   Block.getGenerationStamp(metaFile.getName()));
               block.setNumBytes(blkFile.length());
               block.setNumBytes(blkFile.length());