|
@@ -112,6 +112,7 @@ import static org.apache.hadoop.ha.HAServiceProtocol.HAServiceState.OBSERVER;
|
|
|
|
|
|
import org.apache.hadoop.hdfs.protocol.ErasureCodingPolicyInfo;
|
|
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.thirdparty.com.google.common.collect.Maps;
|
|
import org.apache.hadoop.thirdparty.protobuf.ByteString;
|
|
import org.apache.hadoop.thirdparty.protobuf.ByteString;
|
|
import org.apache.hadoop.hdfs.protocol.BatchedDirectoryListing;
|
|
import org.apache.hadoop.hdfs.protocol.BatchedDirectoryListing;
|
|
@@ -3711,7 +3712,12 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
lastBlock.getBlockType());
|
|
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.
|
|
// There is no datanode reported to this block.
|
|
// may be client have crashed before writing data to pipeline.
|
|
// may be client have crashed before writing data to pipeline.
|
|
// This blocks doesn't need any recovery.
|
|
// This blocks doesn't need any recovery.
|
|
@@ -3719,8 +3725,18 @@ public class FSNamesystem implements Namesystem, FSNamesystemMBean,
|
|
pendingFile.removeLastBlock(lastBlock);
|
|
pendingFile.removeLastBlock(lastBlock);
|
|
finalizeINodeFileUnderConstruction(src, pendingFile,
|
|
finalizeINodeFileUnderConstruction(src, pendingFile,
|
|
iip.getLatestSnapshotId(), false);
|
|
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;
|
|
return true;
|
|
}
|
|
}
|
|
// Start recovery of the last block for this file
|
|
// Start recovery of the last block for this file
|