|
102 | 102 | import org.apache.hadoop.hdfs.protocol.ECTopologyVerifierResult; |
103 | 103 | import org.apache.hadoop.hdfs.protocol.HdfsConstants; |
104 | 104 | import org.apache.hadoop.hdfs.protocol.HdfsLocatedFileStatus; |
| 105 | +import org.apache.hadoop.hdfs.protocol.LocatedStripedBlock; |
105 | 106 | import org.apache.hadoop.hdfs.protocol.SnapshotStatus; |
106 | 107 | import static org.apache.hadoop.hdfs.DFSConfigKeys.DFS_STORAGE_POLICY_ENABLED_KEY; |
107 | 108 | import static org.apache.hadoop.hdfs.server.namenode.FSDirStatAndListingOp.*; |
@@ -5966,8 +5967,26 @@ LocatedBlock bumpBlockGenerationStamp(ExtendedBlock block, |
5966 | 5967 | block.setGenerationStamp(nextGenerationStamp( |
5967 | 5968 | blockManager.isLegacyBlock(block.getLocalBlock()))); |
5968 | 5969 |
|
5969 | | - locatedBlock = BlockManager.newLocatedBlock( |
5970 | | - block, file.getLastBlock(), null, -1); |
| 5970 | + BlockInfo lastBlockInfo = file.getLastBlock(); |
| 5971 | + locatedBlock = BlockManager.newLocatedBlock(block, lastBlockInfo, |
| 5972 | + null, -1); |
| 5973 | + if (lastBlockInfo.isStriped() && |
| 5974 | + ((BlockInfoStriped) lastBlockInfo).getTotalBlockNum() > |
| 5975 | + ((LocatedStripedBlock) locatedBlock).getBlockIndices().length) { |
| 5976 | + // The location info in BlockUnderConstructionFeature may not be |
| 5977 | + // complete after a failover, so we just return all block tokens for a |
| 5978 | + // striped block. This will disrupt the correspondence between |
| 5979 | + // LocatedStripedBlock.blockIndices and LocatedStripedBlock.locs, |
| 5980 | + // which is not used in client side. The correspondence between |
| 5981 | + // LocatedStripedBlock.blockIndices and LocatedBlock.blockToken is |
| 5982 | + // ensured. |
| 5983 | + byte[] indices = |
| 5984 | + new byte[((BlockInfoStriped) lastBlockInfo).getTotalBlockNum()]; |
| 5985 | + for (int i = 0; i < indices.length; ++i) { |
| 5986 | + indices[i] = (byte) i; |
| 5987 | + } |
| 5988 | + ((LocatedStripedBlock) locatedBlock).setBlockIndices(indices); |
| 5989 | + } |
5971 | 5990 | blockManager.setBlockToken(locatedBlock, |
5972 | 5991 | BlockTokenIdentifier.AccessMode.WRITE); |
5973 | 5992 | } finally { |
|
0 commit comments