|
@@ -111,6 +111,7 @@ import static org.apache.hadoop.ha.HAServiceProtocol.HAServiceState.OBSERVER;
|
|
|
|
|
|
import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicyInfo;
|
|
|
|
|
|
+import org.apache.hadoop.hdfs.server.blockmanagement.BlockInfoStriped;
|
|
|
import org.apache.hadoop.thirdparty.com.google.common.collect.Maps;
|
|
|
import org.apache.hadoop.hdfs.server.namenode.snapshot.SnapshotDeletionGc;
|
|
|
import org.apache.hadoop.thirdparty.protobuf.ByteString;
|
|
@@ -3802,7 +3803,12 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
|
lastBlock.getBlockType());
|
|
|
}
|
|
|
|
|
|
- if (uc.getNumExpectedLocations() == 0 && lastBlock.getNumBytes() == 0) {
|
|
|
+ int minLocationsNum = 1;
|
|
|
+ if (lastBlock.isStriped()) {
|
|
|
+ minLocationsNum = ((BlockInfoStriped) lastBlock).getRealDataBlockNum();
|
|
|
+ }
|
|
|
+ if (uc.getNumExpectedLocations() < minLocationsNum &&
|
|
|
+ lastBlock.getNumBytes() == 0) {
|
|
|
// There is no datanode reported to this block.
|
|
|
// may be client have crashed before writing data to pipeline.
|
|
|
// This blocks doesn't need any recovery.
|
|
@@ -3810,8 +3816,18 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
|
pendingFile.removeLastBlock(lastBlock);
|
|
|
finalizeINodeFileUnderConstruction(src, pendingFile,
|
|
|
iip.getLatestSnapshotId(), false);
|
|
|
- NameNode.stateChangeLog.warn("BLOCK* internalReleaseLease: "
|
|
|
- + "Removed empty last block and closed file " + src);
|
|
|
+ if (uc.getNumExpectedLocations() == 0) {
|
|
|
+ // If uc.getNumExpectedLocations() is 0, regardless of whether it
|
|
|
+ // is a striped block or not, we should consider it as an empty block.
|
|
|
+ NameNode.stateChangeLog.warn("BLOCK* internalReleaseLease: "
|
|
|
+ + "Removed empty last block and closed file " + src);
|
|
|
+ } else {
|
|
|
+ // If uc.getNumExpectedLocations() is greater than 0, it means that
|
|
|
+ // minLocationsNum must be greater than 1, so this must be a striped
|
|
|
+ // block.
|
|
|
+ NameNode.stateChangeLog.warn("BLOCK* internalReleaseLease: "
|
|
|
+ + "Removed last unrecoverable block group and closed file " + src);
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
// Start recovery of the last block for this file
|